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