View Javadoc
1   /*
2    * Copyright (C) 2011, GEBIT Solutions 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  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  		// rename a to b
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  		// rename a to b
88  		CommitBuilder commitBuilder = commitBuilder().parent(a)
89  				.add("b", blob(contents)).rm("a");
90  		RevCommit renameCommit1 = commitBuilder.create();
91  
92  		// rename b to c
93  		commitBuilder = commitBuilder().parent(renameCommit1)
94  				.add("c", blob(contents)).rm("b");
95  		RevCommit renameCommit2 = commitBuilder.create();
96  
97  		// rename c to a
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 	 * Assert which renames should have happened, in traversal order.
115 	 *
116 	 * @param expectedRenames
117 	 *            the rename specs, each one in the form "srcPath-&gt;destPath"
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 }