1
2
3
4
5
6
7
8
9
10 package org.eclipse.jgit.revwalk;
11
12 import static org.junit.Assert.assertNull;
13
14 import java.util.ArrayList;
15 import java.util.List;
16
17 import org.eclipse.jgit.diff.DiffConfig;
18 import org.eclipse.jgit.diff.DiffEntry;
19 import org.eclipse.jgit.junit.TestRepository.CommitBuilder;
20 import org.eclipse.jgit.lib.Config;
21 import org.junit.Assert;
22 import org.junit.Before;
23 import org.junit.Test;
24
25 public class RevWalkFollowFilterTest extends RevWalkTestCase {
26
27 private static class DiffCollector extends RenameCallback {
28 List<DiffEntry> diffs = new ArrayList<>();
29
30 @Override
31 public void renamed(DiffEntry diff) {
32 diffs.add(diff);
33 }
34 }
35
36 private DiffCollector diffCollector;
37
38 @Before
39 @Override
40 public void setUp() throws Exception {
41 super.setUp();
42 diffCollector = new DiffCollector();
43 }
44
45 protected FollowFilter follow(String followPath) {
46 FollowFilter followFilter =
47 FollowFilter.create(followPath, new Config().get(DiffConfig.KEY));
48 followFilter.setRenameCallback(diffCollector);
49 rw.setTreeFilter(followFilter);
50 return followFilter;
51 }
52
53 @Test
54 public void testNoRename() throws Exception {
55 final RevCommit a = commit(tree(file("0", blob("0"))));
56 follow("0");
57 markStart(a);
58 assertCommit(a, rw.next());
59 assertNull(rw.next());
60
61 assertNoRenames();
62 }
63
64 @Test
65 public void testSingleRename() throws Exception {
66 final RevCommit a = commit(tree(file("a", blob("A"))));
67
68
69 CommitBuilder commitBuilder = commitBuilder().parent(a)
70 .add("b", blob("A")).rm("a");
71 RevCommit renameCommit = commitBuilder.create();
72
73 follow("b");
74 markStart(renameCommit);
75 assertCommit(renameCommit, rw.next());
76 assertCommit(a, rw.next());
77 assertNull(rw.next());
78
79 assertRenames("a->b");
80 }
81
82 @Test
83 public void testMultiRename() throws Exception {
84 final String contents = "A";
85 final RevCommit a = commit(tree(file("a", blob(contents))));
86
87
88 CommitBuilder commitBuilder = commitBuilder().parent(a)
89 .add("b", blob(contents)).rm("a");
90 RevCommit renameCommit1 = commitBuilder.create();
91
92
93 commitBuilder = commitBuilder().parent(renameCommit1)
94 .add("c", blob(contents)).rm("b");
95 RevCommit renameCommit2 = commitBuilder.create();
96
97
98 commitBuilder = commitBuilder().parent(renameCommit2)
99 .add("a", blob(contents)).rm("c");
100 RevCommit renameCommit3 = commitBuilder.create();
101
102 follow("a");
103 markStart(renameCommit3);
104 assertCommit(renameCommit3, rw.next());
105 assertCommit(renameCommit2, rw.next());
106 assertCommit(renameCommit1, rw.next());
107 assertCommit(a, rw.next());
108 assertNull(rw.next());
109
110 assertRenames("c->a", "b->c", "a->b");
111 }
112
113
114
115
116
117
118
119 protected void assertRenames(String... expectedRenames) {
120 Assert.assertEquals("Unexpected number of renames. Expected: " +
121 expectedRenames.length + ", actual: " + diffCollector.diffs.size(),
122 expectedRenames.length, diffCollector.diffs.size());
123
124 for (int i = 0; i < expectedRenames.length; i++) {
125 DiffEntry diff = diffCollector.diffs.get(i);
126 Assert.assertNotNull(diff);
127 String[] split = expectedRenames[i].split("->");
128
129 Assert.assertNotNull(split);
130 Assert.assertEquals(2, split.length);
131 String src = split[0];
132 String target = split[1];
133
134 Assert.assertEquals(src, diff.getOldPath());
135 Assert.assertEquals(target, diff.getNewPath());
136 }
137 }
138
139 protected void assertNoRenames() {
140 Assert.assertEquals("Found unexpected rename/copy diff", 0,
141 diffCollector.diffs.size());
142 }
143
144 }