}
@Test
- public void oneMergeDifferentLengths() throws Exception {
+ public void onePathMergeLongerFirstParentPath() throws Exception {
// 0--1--2--4
// \--3---/
RevCommit c0 = tr.commit().create();
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,
private final List<String> prefixes;
private final List<Ref> refs;
private final List<ObjectId> revs;
+ private int mergeCost;
/**
* Create a new name-rev command.
*/
protected NameRevCommand(Repository repo) {
super(repo);
+ mergeCost = MERGE_COST;
prefixes = new ArrayList<String>(2);
refs = new ArrayList<Ref>();
revs = new ArrayList<ObjectId>(2);
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();
return this;
}
+ NameRevCommand setMergeCost(int cost) {
+ mergeCost = cost;
+ return this;
+ }
+
private void addPrefixes(Map<ObjectId, String> nonCommits,
FIFORevQueue pending) throws IOException {
if (!prefixes.isEmpty()) {