diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/NameRevCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/NameRevCommandTest.java index 26dc2d05a..b92a636f5 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/NameRevCommandTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/NameRevCommandTest.java @@ -162,7 +162,7 @@ public void onePathMergeSecondParent() throws Exception { } @Test - public void oneMergeDifferentLengths() throws Exception { + public void onePathMergeLongerFirstParentPath() throws Exception { // 0--1--2--4 // \--3---/ RevCommit c0 = tr.commit().create(); @@ -171,27 +171,24 @@ public void oneMergeDifferentLengths() throws Exception { RevCommit c3 = tr.commit().parent(c0).create(); RevCommit c4 = tr.commit().parent(c2).parent(c3).create(); tr.update("master", c4); - assertOneResult("master^2~1", c0); + assertOneResult("master^2", c3); + assertOneResult("master~3", c0); } @Test - public void longerPathWithoutMerge() throws Exception { - // 0--1--2--4 <- master - // \ \-3-/ - // \--5--6--7--8--9 <- branch + public void multiplePathsSecondParent() throws Exception { + // 0--...--2 + // \--1--/ RevCommit c0 = tr.commit().create(); RevCommit c1 = tr.commit().parent(c0).create(); - RevCommit c2 = tr.commit().parent(c1).create(); - RevCommit c3 = tr.commit().parent(c1).create(); - RevCommit c4 = tr.commit().parent(c2).parent(c3).create(); - RevCommit c5 = tr.commit().parent(c0).create(); - RevCommit c6 = tr.commit().parent(c5).create(); - RevCommit c7 = tr.commit().parent(c6).create(); - RevCommit c8 = tr.commit().parent(c7).create(); - RevCommit c9 = tr.commit().parent(c8).create(); - tr.update("master", c4); - tr.update("branch", c9); - assertOneResult("branch~5", c0); + RevCommit c = c0; + int mergeCost = 5; + for (int i = 0; i < mergeCost; i++) { + c = tr.commit().parent(c).create(); + } + RevCommit c2 = tr.commit().parent(c).parent(c1).create(); + tr.update("master", c2); + assertOneResult("master^2~1", git.nameRev().setMergeCost(mergeCost), c0); } private static void assertOneResult(String expected, NameRevCommand nameRev, diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/NameRevCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/NameRevCommand.java index 2397636f3..fcc02c7fe 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/NameRevCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/NameRevCommand.java @@ -112,6 +112,7 @@ public String toString() { private final List prefixes; private final List refs; private final List revs; + private int mergeCost; /** * Create a new name-rev command. @@ -120,6 +121,7 @@ public String toString() { */ protected NameRevCommand(Repository repo) { super(repo); + mergeCost = MERGE_COST; prefixes = new ArrayList(2); refs = new ArrayList(); revs = new ArrayList(2); @@ -147,9 +149,9 @@ public Map call() throws GitAPIException { break; if (c.getCommitTime() < cutoff) continue; - long cost = c.cost + (c.getParentCount() > 1 ? MERGE_COST : 1); for (int i = 0; i < c.getParentCount(); i++) { NameRevCommit p = (NameRevCommit) walk.parseCommit(c.getParent(i)); + long cost = c.cost + (i > 0 ? mergeCost : 1); if (p.tip == null || compare(c.tip, cost, p.tip, p.cost) < 0) { if (i > 0) { p.tip = c.format().append('^').append(i + 1).toString(); @@ -298,6 +300,11 @@ public NameRevCommand addRef(Ref ref) { return this; } + NameRevCommand setMergeCost(int cost) { + mergeCost = cost; + return this; + } + private void addPrefixes(Map nonCommits, FIFORevQueue pending) throws IOException { if (!prefixes.isEmpty()) {