View Javadoc
1   /*
2    * Copyright (C) 2014, Google Inc. and others
3    *
4    * This program and the accompanying materials are made available under the
5    * terms of the Eclipse Distribution License v. 1.0 which is available at
6    * https://www.eclipse.org/org/documents/edl-v10.php.
7    *
8    * SPDX-License-Identifier: BSD-3-Clause
9    */
10  
11  package org.eclipse.jgit.revwalk;
12  
13  import static org.junit.Assert.assertEquals;
14  import static org.junit.Assert.assertNull;
15  
16  import org.eclipse.jgit.revwalk.filter.OrRevFilter;
17  import org.eclipse.jgit.revwalk.filter.RevFilter;
18  import org.eclipse.jgit.revwalk.filter.SkipRevFilter;
19  import org.eclipse.jgit.treewalk.filter.TreeFilter;
20  import org.junit.Test;
21  
22  public class TreeRevFilterTest extends RevWalkTestCase {
23  	private RevFilter treeRevFilter() {
24  		return new TreeRevFilter(rw, TreeFilter.ANY_DIFF);
25  	}
26  
27  	@Test
28  	public void testStringOfPearls_FilePath1()
29  			throws Exception {
30  		RevCommit a = commit(tree(file("d/f", blob("a"))));
31  		RevCommit b = commit(tree(file("d/f", blob("a"))), a);
32  		RevCommit c = commit(tree(file("d/f", blob("b"))), b);
33  		rw.setRevFilter(treeRevFilter());
34  		markStart(c);
35  
36  		assertCommit(c, rw.next());
37  		assertEquals(1, c.getParentCount());
38  		assertCommit(b, c.getParent(0));
39  
40  		assertCommit(a, rw.next()); // b was skipped
41  		assertEquals(0, a.getParentCount());
42  		assertNull(rw.next());
43  	}
44  
45  	@Test
46  	public void testStringOfPearls_FilePath2() throws Exception {
47  		RevCommit a = commit(tree(file("d/f", blob("a"))));
48  		RevCommit b = commit(tree(file("d/f", blob("a"))), a);
49  		RevCommit c = commit(tree(file("d/f", blob("b"))), b);
50  		RevCommit d = commit(tree(file("d/f", blob("b"))), c);
51  		rw.setRevFilter(treeRevFilter());
52  		markStart(d);
53  
54  		// d was skipped
55  		assertCommit(c, rw.next());
56  		assertEquals(1, c.getParentCount());
57  		assertCommit(b, c.getParent(0));
58  
59  		// b was skipped
60  		assertCommit(a, rw.next());
61  		assertEquals(0, a.getParentCount());
62  		assertNull(rw.next());
63  	}
64  
65  	@Test
66  	public void testStringOfPearls_DirPath2() throws Exception {
67  		RevCommit a = commit(tree(file("d/f", blob("a"))));
68  		RevCommit b = commit(tree(file("d/f", blob("a"))), a);
69  		RevCommit c = commit(tree(file("d/f", blob("b"))), b);
70  		RevCommit d = commit(tree(file("d/f", blob("b"))), c);
71  		rw.setRevFilter(treeRevFilter());
72  		markStart(d);
73  
74  		// d was skipped
75  		assertCommit(c, rw.next());
76  		assertEquals(1, c.getParentCount());
77  		assertCommit(b, c.getParent(0));
78  
79  		// b was skipped
80  		assertCommit(a, rw.next());
81  		assertEquals(0, a.getParentCount());
82  		assertNull(rw.next());
83  	}
84  
85  	@Test
86  	public void testStringOfPearls_FilePath3() throws Exception {
87  		RevCommit a = commit(tree(file("d/f", blob("a"))));
88  		RevCommit b = commit(tree(file("d/f", blob("a"))), a);
89  		RevCommit c = commit(tree(file("d/f", blob("b"))), b);
90  		RevCommit d = commit(tree(file("d/f", blob("b"))), c);
91  		RevCommit e = commit(tree(file("d/f", blob("b"))), d);
92  		RevCommit f = commit(tree(file("d/f", blob("b"))), e);
93  		RevCommit g = commit(tree(file("d/f", blob("b"))), f);
94  		RevCommit h = commit(tree(file("d/f", blob("b"))), g);
95  		RevCommit i = commit(tree(file("d/f", blob("c"))), h);
96  		rw.setRevFilter(treeRevFilter());
97  		markStart(i);
98  
99  		assertCommit(i, rw.next());
100 		assertEquals(1, i.getParentCount());
101 		assertCommit(h, i.getParent(0));
102 
103 		// h..d was skipped
104 		assertCommit(c, rw.next());
105 		assertEquals(1, c.getParentCount());
106 		assertCommit(b, c.getParent(0));
107 
108 		// b was skipped
109 		assertCommit(a, rw.next());
110 		assertEquals(0, a.getParentCount());
111 		assertNull(rw.next());
112 	}
113 
114 	@Test
115 	public void testPathFilterOrOtherFilter() throws Exception {
116 		RevFilter pathFilter = treeRevFilter();
117 		RevFilter skipFilter = SkipRevFilter.create(1);
118 		RevFilter orFilter = OrRevFilter.create(skipFilter, pathFilter);
119 
120 		RevCommit a = parseBody(commit(5, tree(file("d/f", blob("a")))));
121 		RevCommit b = parseBody(commit(5, tree(file("d/f", blob("a"))), a));
122 		RevCommit c = parseBody(commit(5, tree(file("d/f", blob("b"))), b));
123 
124 		// Path filter matches c, a.
125 		rw.setRevFilter(pathFilter);
126 		markStart(c);
127 		assertCommit(c, rw.next());
128 		assertCommit(a, rw.next());
129 
130 		// Skip filter matches b, a.
131 		rw.reset();
132 		rw.setRevFilter(skipFilter);
133 		markStart(c);
134 		assertCommit(b, rw.next());
135 		assertCommit(a, rw.next());
136 
137 		// (Path OR Skip) matches c, b, a.
138 		rw.reset();
139 		rw.setRevFilter(orFilter);
140 		markStart(c);
141 		assertCommit(c, rw.next());
142 		assertCommit(b, rw.next());
143 		assertCommit(a, rw.next());
144 	}
145 }