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
45 package org.eclipse.jgit.revwalk.filter;
46
47 import java.io.IOException;
48 import java.util.Collection;
49
50 import org.eclipse.jgit.errors.IncorrectObjectTypeException;
51 import org.eclipse.jgit.errors.MissingObjectException;
52 import org.eclipse.jgit.internal.JGitText;
53 import org.eclipse.jgit.revwalk.RevCommit;
54 import org.eclipse.jgit.revwalk.RevWalk;
55
56
57
58
59
60
61
62
63
64
65 public abstract class OrRevFilter extends RevFilter {
66
67
68
69
70
71
72
73
74
75 public static RevFilter create(RevFilter a, RevFilter b) {
76 if (a == ALL || b == ALL)
77 return ALL;
78 return new Binary(a, b);
79 }
80
81
82
83
84
85
86
87
88
89 public static RevFilter create(RevFilter[] list) {
90 if (list.length == 2)
91 return create(list[0], list[1]);
92 if (list.length < 2)
93 throw new IllegalArgumentException(JGitText.get().atLeastTwoFiltersNeeded);
94 final RevFilter[] subfilters = new RevFilter[list.length];
95 System.arraycopy(list, 0, subfilters, 0, list.length);
96 return new List(subfilters);
97 }
98
99
100
101
102
103
104
105
106
107 public static RevFilter create(Collection<RevFilter> list) {
108 if (list.size() < 2)
109 throw new IllegalArgumentException(JGitText.get().atLeastTwoFiltersNeeded);
110 final RevFilter[] subfilters = new RevFilter[list.size()];
111 list.toArray(subfilters);
112 if (subfilters.length == 2)
113 return create(subfilters[0], subfilters[1]);
114 return new List(subfilters);
115 }
116
117 private static class Binary extends OrRevFilter {
118 private final RevFilter a;
119
120 private final RevFilter b;
121
122 private final boolean requiresCommitBody;
123
124 Binary(RevFilter one, RevFilter two) {
125 a = one;
126 b = two;
127 requiresCommitBody = a.requiresCommitBody()
128 || b.requiresCommitBody();
129 }
130
131 @Override
132 public boolean include(RevWalk walker, RevCommit c)
133 throws MissingObjectException, IncorrectObjectTypeException,
134 IOException {
135 return a.include(walker, c) || b.include(walker, c);
136 }
137
138 @Override
139 public boolean requiresCommitBody() {
140 return requiresCommitBody;
141 }
142
143 @Override
144 public RevFilter clone() {
145 return new Binary(a.clone(), b.clone());
146 }
147
148 @SuppressWarnings("nls")
149 @Override
150 public String toString() {
151 return "(" + a.toString() + " OR " + b.toString() + ")";
152 }
153 }
154
155 private static class List extends OrRevFilter {
156 private final RevFilter[] subfilters;
157
158 private final boolean requiresCommitBody;
159
160 List(RevFilter[] list) {
161 subfilters = list;
162
163 boolean rcb = false;
164 for (RevFilter filter : subfilters)
165 rcb |= filter.requiresCommitBody();
166 requiresCommitBody = rcb;
167 }
168
169 @Override
170 public boolean include(RevWalk walker, RevCommit c)
171 throws MissingObjectException, IncorrectObjectTypeException,
172 IOException {
173 for (RevFilter f : subfilters) {
174 if (f.include(walker, c))
175 return true;
176 }
177 return false;
178 }
179
180 @Override
181 public boolean requiresCommitBody() {
182 return requiresCommitBody;
183 }
184
185 @Override
186 public RevFilter clone() {
187 final RevFilter[] s = new RevFilter[subfilters.length];
188 for (int i = 0; i < s.length; i++)
189 s[i] = subfilters[i].clone();
190 return new List(s);
191 }
192
193 @Override
194 public String toString() {
195 final StringBuilder r = new StringBuilder();
196 r.append("(");
197 for (int i = 0; i < subfilters.length; i++) {
198 if (i > 0)
199 r.append(" OR ");
200 r.append(subfilters[i].toString());
201 }
202 r.append(")");
203 return r.toString();
204 }
205 }
206 }