123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483 |
- /*
- * Copyright (C) 2019, Google LLC. and others
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Distribution License v. 1.0 which is available at
- * https://www.eclipse.org/org/documents/edl-v10.php.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
- package org.eclipse.jgit.revwalk;
-
- import static org.junit.Assert.assertEquals;
- import static org.junit.Assert.assertNull;
-
- import org.eclipse.jgit.lib.ObjectId;
- import org.eclipse.jgit.revwalk.filter.MessageRevFilter;
- import org.eclipse.jgit.revwalk.filter.RevFilter;
- import org.eclipse.jgit.treewalk.filter.PathFilterGroup;
- import org.junit.Test;
-
- public class FirstParentRevWalkTest extends RevWalkTestCase {
- @Test
- public void testStringOfPearls() throws Exception {
- RevCommit a = commit();
- RevCommit b = commit(a);
- RevCommit c = commit(b);
-
- rw.reset();
- rw.setFirstParent(true);
- markStart(c);
- assertCommit(c, rw.next());
- assertCommit(b, rw.next());
- assertCommit(a, rw.next());
- assertNull(rw.next());
- }
-
- @Test
- public void testSideBranch() throws Exception {
- RevCommit a = commit();
- RevCommit b1 = commit(a);
- RevCommit b2 = commit(a);
- RevCommit c1 = commit(b1);
- RevCommit c2 = commit(b2);
- RevCommit d = commit(c1, c2);
-
- rw.reset();
- rw.setFirstParent(true);
- markStart(d);
- assertCommit(d, rw.next());
- assertCommit(c1, rw.next());
- assertCommit(b1, rw.next());
- assertCommit(a, rw.next());
- assertNull(rw.next());
- }
-
- @Test
- public void testSecondParentAncestorOfFirstParent() throws Exception {
- RevCommit a = commit();
- RevCommit b = commit(a);
- RevCommit c = commit(b, a);
-
- rw.reset();
- rw.setFirstParent(true);
- markStart(c);
- assertCommit(c, rw.next());
- assertCommit(b, rw.next());
- assertCommit(a, rw.next());
- assertNull(rw.next());
- }
-
- @Test
- public void testFirstParentMultipleOccurrences() throws Exception {
- RevCommit a = commit();
- RevCommit b = commit(a);
- RevCommit c = commit(b);
- RevCommit d = commit(b);
-
- rw.reset();
- rw.setFirstParent(true);
- markStart(c);
- markStart(d);
- assertCommit(d, rw.next());
- assertCommit(c, rw.next());
- assertCommit(b, rw.next());
- assertCommit(a, rw.next());
- assertNull(rw.next());
- }
-
- @Test
- public void testReachableAlongFirstAndLaterParents() throws Exception {
- RevCommit a = commit();
- RevCommit b1 = commit(a);
- RevCommit b2 = commit(a);
- RevCommit b3 = commit(a);
- RevCommit c = commit(b1, b2);
- RevCommit d = commit(b2, b3);
-
- rw.reset();
- rw.setFirstParent(true);
- markStart(c);
- markStart(d);
- assertCommit(d, rw.next());
- assertCommit(c, rw.next());
- // b3 is only reachable from c's second parent.
- // b2 is reachable from c's second parent but d's first parent.
- assertCommit(b2, rw.next());
- assertCommit(b1, rw.next());
- assertCommit(a, rw.next());
- assertNull(rw.next());
- }
-
- @Test
- public void testStartCommitReachableOnlyFromLaterParents()
- throws Exception {
- RevCommit a = commit();
- RevCommit b1 = commit(a);
- RevCommit b2 = commit(a);
- RevCommit c = commit(b1, b2);
-
- rw.reset();
- rw.setFirstParent(true);
- markStart(c);
- markStart(b2);
- assertCommit(c, rw.next());
- // b2 is only reachable from second parent, but is itself a start
- // commit.
- assertCommit(b2, rw.next());
- assertCommit(b1, rw.next());
- assertCommit(a, rw.next());
- assertNull(rw.next());
- }
-
- @Test
- public void testRevFilter() throws Exception {
- RevCommit a = commit();
- RevCommit b1 = commitBuilder().parent(a).message("commit b1").create();
- RevCommit b2 = commitBuilder().parent(a).message("commit b2").create();
- RevCommit c = commit(b1, b2);
-
- rw.reset();
- rw.setFirstParent(true);
- rw.setRevFilter(MessageRevFilter.create("commit b"));
- rw.markStart(c);
- assertCommit(b1, rw.next());
- assertNull(rw.next());
- }
-
- @Test
- public void testTopoSort() throws Exception {
- RevCommit a = commit();
- RevCommit b1 = commit(a);
- RevCommit b2 = commit(a);
- RevCommit c = commit(b1, b2);
-
- rw.reset();
- rw.sort(RevSort.TOPO);
- rw.setFirstParent(true);
- markStart(c);
- assertCommit(c, rw.next());
- assertCommit(b1, rw.next());
- assertCommit(a, rw.next());
- assertNull(rw.next());
- }
-
- @Test
- public void testTopoNonIntermixSort() throws Exception {
- RevCommit a = commit();
- RevCommit b1 = commit(a);
- RevCommit b2 = commit(a);
- RevCommit c = commit(b1, b2);
-
- rw.reset();
- rw.sort(RevSort.TOPO_KEEP_BRANCH_TOGETHER);
- rw.setFirstParent(true);
- markStart(c);
- assertCommit(c, rw.next());
- assertCommit(b1, rw.next());
- assertCommit(a, rw.next());
- assertNull(rw.next());
- }
-
- @Test
- public void testCommitTimeSort() throws Exception {
- RevCommit a = commit();
- RevCommit b1 = commit(a);
- RevCommit b2 = commit(a);
- RevCommit c = commit(b1, b2);
-
- rw.reset();
- rw.sort(RevSort.COMMIT_TIME_DESC);
- rw.setFirstParent(true);
- markStart(c);
- assertCommit(c, rw.next());
- assertCommit(b1, rw.next());
- assertCommit(a, rw.next());
- assertNull(rw.next());
- }
-
- @Test
- public void testReverseSort() throws Exception {
- RevCommit a = commit();
- RevCommit b1 = commit(a);
- RevCommit b2 = commit(a);
- RevCommit c = commit(b1, b2);
-
- rw.reset();
- rw.sort(RevSort.REVERSE);
- rw.setFirstParent(true);
- markStart(c);
- assertCommit(a, rw.next());
- assertCommit(b1, rw.next());
- assertCommit(c, rw.next());
- assertNull(rw.next());
- }
-
- @Test
- public void testBoundarySort() throws Exception {
- RevCommit a = commit();
- RevCommit b = commit(a);
- RevCommit c1 = commit(b);
- RevCommit c2 = commit(b);
- RevCommit d = commit(c1, c2);
-
- rw.reset();
- rw.sort(RevSort.BOUNDARY);
- rw.setFirstParent(true);
- markStart(d);
- markUninteresting(a);
- assertCommit(d, rw.next());
- assertCommit(c1, rw.next());
- assertCommit(b, rw.next());
- assertCommit(a, rw.next());
- assertNull(rw.next());
- }
-
- @Test
- public void testFirstParentOfFirstParentMarkedUninteresting()
- throws Exception {
- RevCommit a = commit();
- RevCommit b1 = commit(a);
- RevCommit b2 = commit(a);
- RevCommit c1 = commit(b1);
- RevCommit c2 = commit(b2);
- RevCommit d = commit(c1, c2);
-
- rw.reset();
- rw.setFirstParent(true);
- markStart(d);
- markUninteresting(b1);
- assertCommit(d, rw.next());
- assertCommit(c1, rw.next());
- assertNull(rw.next());
- }
-
- @Test
- public void testUnparsedFirstParentOfFirstParentMarkedUninteresting()
- throws Exception {
- ObjectId a = unparsedCommit();
- ObjectId b1 = unparsedCommit(a);
- ObjectId b2 = unparsedCommit(a);
- ObjectId c1 = unparsedCommit(b1);
- ObjectId c2 = unparsedCommit(b2);
- ObjectId d = unparsedCommit(c1, c2);
-
- rw.reset();
- rw.setFirstParent(true);
- RevCommit parsedD = rw.parseCommit(d);
- markStart(parsedD);
- markUninteresting(rw.parseCommit(b1));
- assertCommit(parsedD, rw.next());
- assertCommit(rw.parseCommit(c1), rw.next());
- assertNull(rw.next());
- }
-
- @Test
- public void testFirstParentMarkedUninteresting() throws Exception {
- RevCommit a = commit();
- RevCommit b1 = commit(a);
- RevCommit b2 = commit(a);
- RevCommit c = commit(b1, b2);
-
- rw.reset();
- rw.setFirstParent(true);
- markStart(c);
- markUninteresting(b1);
- assertCommit(c, rw.next());
- assertNull(rw.next());
- }
-
- @Test
- public void testUnparsedFirstParentMarkedUninteresting() throws Exception {
- ObjectId a = unparsedCommit();
- ObjectId b1 = unparsedCommit(a);
- ObjectId b2 = unparsedCommit(a);
- ObjectId c = unparsedCommit(b1, b2);
-
- rw.reset();
- rw.setFirstParent(true);
- RevCommit parsedC = rw.parseCommit(c);
- markStart(parsedC);
- markUninteresting(rw.parseCommit(b1));
- assertCommit(parsedC, rw.next());
- assertNull(rw.next());
- }
-
- @Test
- public void testUninterestingCommitWithTwoParents() throws Exception {
- RevCommit a = commit();
- RevCommit b = commit(a);
- RevCommit c1 = commit(b);
- RevCommit c2 = commit(b);
- RevCommit d = commit(c1);
- RevCommit e = commit(c1, c2);
-
- RevCommit uA = commit(a, b);
- RevCommit uB1 = commit(uA, c2);
- RevCommit uB2 = commit(uA, d);
- RevCommit uninteresting = commit(uB1, uB2);
-
- rw.reset();
- rw.setFirstParent(true);
- markStart(e);
- markUninteresting(uninteresting);
-
- assertCommit(e, rw.next());
- assertNull(rw.next());
- }
-
- /**
- * This fails if we try to propagate flags before parsing commits.
- *
- * @throws Exception
- */
- @Test
- public void testUnparsedUninterestingCommitWithTwoParents()
- throws Exception {
- ObjectId a = unparsedCommit();
- ObjectId b = unparsedCommit(a);
- ObjectId c1 = unparsedCommit(b);
- ObjectId c2 = unparsedCommit(b);
- ObjectId d = unparsedCommit(c1);
- ObjectId e = unparsedCommit(c1, c2);
-
- ObjectId uA = unparsedCommit(a, b);
- ObjectId uB1 = unparsedCommit(uA, c2);
- ObjectId uB2 = unparsedCommit(uA, d);
- ObjectId uninteresting = unparsedCommit(uB1, uB2);
-
- rw.reset();
- rw.setFirstParent(true);
- RevCommit parsedE = rw.parseCommit(e);
- markStart(parsedE);
- markUninteresting(rw.parseCommit(uninteresting));
-
- assertCommit(parsedE, rw.next());
- assertNull(rw.next());
- }
-
- @Test
- public void testDepthWalk() throws Exception {
- RevCommit a = commit();
- RevCommit b1 = commit(a);
- RevCommit b2 = commit(a);
- RevCommit c = commit(b1, b2);
-
- try (DepthWalk.RevWalk dw = new DepthWalk.RevWalk(db, 1)) {
- dw.setFirstParent(true);
- dw.markRoot(dw.parseCommit(c));
- dw.markStart(dw.parseCommit(c));
- assertEquals(c, dw.next());
- assertEquals(b1, dw.next());
- assertNull(dw.next());
- }
- }
-
- @Test
- public void testDoNotRewriteParents() throws Exception {
- RevCommit a = commit();
- RevCommit b1 = commit(a);
- RevCommit b2 = commit(a);
- RevCommit c = commit(b1, b2);
-
- rw.reset();
- rw.setFirstParent(true);
- rw.setRewriteParents(false);
- markStart(c);
- assertCommit(c, rw.next());
- assertCommit(b1, rw.next());
- assertCommit(a, rw.next());
- assertNull(rw.next());
- }
-
- @Test(expected = IllegalStateException.class)
- public void testMarkStartBeforeSetFirstParent() throws Exception {
- RevCommit a = commit();
-
- rw.reset();
- markStart(a);
- rw.setFirstParent(true);
- }
-
- @Test(expected = IllegalStateException.class)
- public void testMergeBaseWithFirstParentNotAllowed() throws Exception {
- RevCommit a = commit();
-
- rw.reset();
- rw.setFirstParent(true);
- rw.setRevFilter(RevFilter.MERGE_BASE);
- markStart(a);
- assertNull(rw.next());
- }
-
- @Test
- public void testWithTopoSortAndTreeFilter() throws Exception {
- RevCommit a = commit();
- RevCommit b = commit(tree(file("0", blob("b"))), a);
- RevCommit c = commit(tree(file("0", blob("c"))), b, a);
- RevCommit d = commit(tree(file("0", blob("d"))), c);
-
- rw.reset();
- rw.setFirstParent(true);
- rw.sort(RevSort.TOPO, true);
- rw.setTreeFilter(PathFilterGroup.createFromStrings("0"));
- markStart(d);
- assertCommit(d, rw.next());
- assertCommit(c, rw.next());
- assertCommit(b, rw.next());
- assertNull(rw.next());
- }
-
- @Test
- public void testWithTopoSortAndTreeFilter2() throws Exception {
- RevCommit a = commit();
- RevCommit b = commit(tree(file("0", blob("b"))), a);
- RevCommit c = commit(tree(file("0", blob("c"))), a, b);
- RevCommit d = commit(tree(file("0", blob("d"))), c);
-
- rw.reset();
- rw.setFirstParent(true);
- rw.sort(RevSort.TOPO, true);
- rw.setTreeFilter(PathFilterGroup.createFromStrings("0"));
- markStart(d);
- assertCommit(d, rw.next());
- assertCommit(c, rw.next());
- assertNull(rw.next());
- }
-
- @Test
- public void testWithTopoNonIntermixSortAndTreeFilter() throws Exception {
- RevCommit a = commit();
- RevCommit b = commit(tree(file("0", blob("b"))), a);
- RevCommit c = commit(tree(file("0", blob("c"))), b, a);
- RevCommit d = commit(tree(file("0", blob("d"))), c);
-
- rw.reset();
- rw.setFirstParent(true);
- rw.sort(RevSort.TOPO_KEEP_BRANCH_TOGETHER, true);
- rw.setTreeFilter(PathFilterGroup.createFromStrings("0"));
- markStart(d);
- assertCommit(d, rw.next());
- assertCommit(c, rw.next());
- assertCommit(b, rw.next());
- assertNull(rw.next());
- }
-
- @Test
- public void testWithTopoNonIntermixSortAndTreeFilter2() throws Exception {
- RevCommit a = commit();
- RevCommit b = commit(tree(file("0", blob("b"))), a);
- RevCommit c = commit(tree(file("0", blob("c"))), a, b);
- RevCommit d = commit(tree(file("0", blob("d"))), c);
-
- rw.reset();
- rw.setFirstParent(true);
- rw.sort(RevSort.TOPO_KEEP_BRANCH_TOGETHER, true);
- rw.setTreeFilter(PathFilterGroup.createFromStrings("0"));
- markStart(d);
- assertCommit(d, rw.next());
- assertCommit(c, rw.next());
- assertNull(rw.next());
- }
- }
|