1
2
3
4
5
6
7
8
9
10
11 package org.eclipse.jgit.internal.diff;
12
13 import java.io.IOException;
14 import java.util.ArrayList;
15 import java.util.Arrays;
16 import java.util.HashSet;
17 import java.util.List;
18 import java.util.Set;
19
20 import org.eclipse.jgit.diff.DiffEntry;
21 import org.eclipse.jgit.diff.DiffEntry.ChangeType;
22 import org.eclipse.jgit.diff.RenameDetector;
23 import org.eclipse.jgit.lib.Repository;
24 import org.eclipse.jgit.treewalk.filter.PathFilter;
25
26
27
28
29
30 public class FilteredRenameDetector {
31
32 private final RenameDetector renameDetector;
33
34
35
36
37
38 public FilteredRenameDetector(Repository repository) {
39 this(new RenameDetector(repository));
40 }
41
42
43
44
45
46 public FilteredRenameDetector(RenameDetector renameDetector) {
47 this.renameDetector = renameDetector;
48 }
49
50
51
52
53
54
55
56
57
58 public List<DiffEntry> compute(List<DiffEntry> diffs,
59 PathFilter pathFilter) throws IOException {
60 return compute(diffs, Arrays.asList(pathFilter));
61 }
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78 public List<DiffEntry> compute(List<DiffEntry> changes,
79 List<PathFilter> pathFilters) throws IOException {
80
81 if (pathFilters == null) {
82 throw new IllegalArgumentException("Must specify path filters");
83 }
84
85 Set<String> paths = new HashSet<>(pathFilters.size());
86 for (PathFilter pathFilter : pathFilters) {
87 paths.add(pathFilter.getPath());
88 }
89
90 List<DiffEntry> filtered = new ArrayList<>();
91
92
93 for (DiffEntry diff : changes) {
94 ChangeType changeType = diff.getChangeType();
95 if (changeType != ChangeType.ADD
96 || paths.contains(diff.getNewPath())) {
97 filtered.add(diff);
98 }
99 }
100
101 renameDetector.reset();
102 renameDetector.addAll(filtered);
103 List<DiffEntry> sourceChanges = renameDetector.compute();
104
105 filtered.clear();
106
107
108 for (DiffEntry diff : changes) {
109 ChangeType changeType = diff.getChangeType();
110 if (changeType != ChangeType.DELETE
111 || paths.contains(diff.getOldPath())) {
112 filtered.add(diff);
113 }
114 }
115
116 renameDetector.reset();
117 renameDetector.addAll(filtered);
118 List<DiffEntry> targetChanges = renameDetector.compute();
119
120 List<DiffEntry> result = new ArrayList<>();
121
122 for (DiffEntry sourceChange : sourceChanges) {
123 if (paths.contains(sourceChange.getNewPath())) {
124 result.add(sourceChange);
125 }
126 }
127 for (DiffEntry targetChange : targetChanges) {
128 if (paths.contains(targetChange.getOldPath())) {
129 result.add(targetChange);
130 }
131 }
132
133 renameDetector.reset();
134 return result;
135 }
136 }