1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44 package org.eclipse.jgit.treewalk.filter;
45
46 import static org.junit.Assert.assertEquals;
47
48 import java.io.IOException;
49 import java.util.ArrayList;
50 import java.util.Arrays;
51 import java.util.List;
52
53 import org.eclipse.jgit.dircache.DirCache;
54 import org.eclipse.jgit.dircache.DirCacheBuilder;
55 import org.eclipse.jgit.dircache.DirCacheEntry;
56 import org.eclipse.jgit.junit.RepositoryTestCase;
57 import org.eclipse.jgit.lib.FileMode;
58 import org.eclipse.jgit.lib.ObjectId;
59 import org.eclipse.jgit.lib.ObjectInserter;
60 import org.eclipse.jgit.treewalk.TreeWalk;
61 import org.junit.Test;
62
63 public class PathSuffixFilterTest extends RepositoryTestCase {
64
65 @Test
66 public void testNonRecursiveFiltering() throws IOException {
67 ObjectId treeId = createTree("a.sth", "a.txt");
68
69 List<String> paths = getMatchingPaths(".txt", treeId);
70 List<String> expected = Arrays.asList("a.txt");
71
72 assertEquals(expected, paths);
73 }
74
75 @Test
76 public void testRecursiveFiltering() throws IOException {
77 ObjectId treeId = createTree("a.sth", "a.txt", "sub/b.sth", "sub/b.txt");
78
79 List<String> paths = getMatchingPaths(".txt", treeId, true);
80 List<String> expected = Arrays.asList("a.txt", "sub/b.txt");
81
82 assertEquals(expected, paths);
83 }
84
85 @Test
86 public void testEdgeCases() throws IOException {
87 ObjectId treeId = createTree("abc", "abcd", "bcd", "c");
88 assertEquals(new ArrayList<String>(), getMatchingPaths("xbcd", treeId));
89 assertEquals(new ArrayList<String>(), getMatchingPaths("abcx", treeId));
90 assertEquals(Arrays.asList("abcd"), getMatchingPaths("abcd", treeId));
91 assertEquals(Arrays.asList("abcd", "bcd"), getMatchingPaths("bcd", treeId));
92 assertEquals(Arrays.asList("abc", "c"), getMatchingPaths("c", treeId));
93 }
94
95 private ObjectId createTree(String... paths) throws IOException {
96 final ObjectInserter odi = db.newObjectInserter();
97 final DirCache dc = db.readDirCache();
98 final DirCacheBuilder builder = dc.builder();
99 for (String path : paths) {
100 DirCacheEntry entry = createEntry(path, FileMode.REGULAR_FILE);
101 builder.add(entry);
102 }
103 builder.finish();
104 final ObjectId treeId = dc.writeTree(odi);
105 odi.flush();
106 return treeId;
107 }
108
109 private List<String> getMatchingPaths(String suffixFilter,
110 final ObjectId treeId) throws IOException {
111 return getMatchingPaths(suffixFilter, treeId, false);
112 }
113
114 private List<String> getMatchingPaths(String suffixFilter,
115 final ObjectId treeId, boolean recursiveWalk) throws IOException {
116 try (final TreeWalk tw = new TreeWalk(db)) {
117 tw.setFilter(PathSuffixFilter.create(suffixFilter));
118 tw.setRecursive(recursiveWalk);
119 tw.addTree(treeId);
120
121 List<String> paths = new ArrayList<>();
122 while (tw.next())
123 paths.add(tw.getPathString());
124 return paths;
125 }
126 }
127
128 }