comparison src/org/tmatesoft/hg/repo/HgStatusCollector.java @ 226:26ad7827a62d

Support status query for a single file or a subdirectory of a repository
author Artem Tikhomirov <tikhomirov.artem@gmail.com>
date Wed, 25 May 2011 12:16:24 +0200
parents 373e07cd3991
children 1ec6b327a6ac
comparison
equal deleted inserted replaced
225:fad70a9e6c7f 226:26ad7827a62d
54 private final int cacheMaxSize = 50; // do not keep too much manifest revisions 54 private final int cacheMaxSize = 50; // do not keep too much manifest revisions
55 private PathPool pathPool; 55 private PathPool pathPool;
56 private final Pool<Nodeid> cacheNodes; 56 private final Pool<Nodeid> cacheNodes;
57 private final Pool<String> cacheFilenames; // XXX in fact, need to think if use of PathPool directly instead is better solution 57 private final Pool<String> cacheFilenames; // XXX in fact, need to think if use of PathPool directly instead is better solution
58 private final ManifestRevisionInspector emptyFakeState; 58 private final ManifestRevisionInspector emptyFakeState;
59 private Path.Matcher scope;
59 60
60 61
61 public HgStatusCollector(HgRepository hgRepo) { 62 public HgStatusCollector(HgRepository hgRepo) {
62 this.repo = hgRepo; 63 this.repo = hgRepo;
63 cache = new TreeMap<Integer, ManifestRevisionInspector>(); 64 cache = new TreeMap<Integer, ManifestRevisionInspector>();
216 r2 = get(rev2); 217 r2 = get(rev2);
217 218
218 PathPool pp = getPathPool(); 219 PathPool pp = getPathPool();
219 220
220 TreeSet<String> r1Files = new TreeSet<String>(r1.files()); 221 TreeSet<String> r1Files = new TreeSet<String>(r1.files());
222 class MatchAny implements Path.Matcher {
223 public boolean accept(Path path) {
224 return true;
225 }
226 };
227 if (scope == null) {
228 scope = new MatchAny(); // FIXME configure from outside
229 }
221 for (String fname : r2.files()) { 230 for (String fname : r2.files()) {
231 final Path r2filePath = pp.path(fname);
232 if (!scope.accept(r2filePath)) {
233 continue;
234 }
222 if (r1Files.remove(fname)) { 235 if (r1Files.remove(fname)) {
223 Nodeid nidR1 = r1.nodeid(fname); 236 Nodeid nidR1 = r1.nodeid(fname);
224 Nodeid nidR2 = r2.nodeid(fname); 237 Nodeid nidR2 = r2.nodeid(fname);
225 String flagsR1 = r1.flags(fname); 238 String flagsR1 = r1.flags(fname);
226 String flagsR2 = r2.flags(fname); 239 String flagsR2 = r2.flags(fname);
227 if (nidR1.equals(nidR2) && ((flagsR2 == null && flagsR1 == null) || (flagsR2 != null && flagsR2.equals(flagsR1)))) { 240 if (nidR1.equals(nidR2) && ((flagsR2 == null && flagsR1 == null) || (flagsR2 != null && flagsR2.equals(flagsR1)))) {
228 inspector.clean(pp.path(fname)); 241 inspector.clean(r2filePath);
229 } else { 242 } else {
230 inspector.modified(pp.path(fname)); 243 inspector.modified(r2filePath);
231 } 244 }
232 } else { 245 } else {
233 try { 246 try {
234 Path copyTarget = pp.path(fname); 247 Path copyTarget = r2filePath;
235 Path copyOrigin = getOriginIfCopy(repo, copyTarget, r1Files, rev1); 248 Path copyOrigin = getOriginIfCopy(repo, copyTarget, r1Files, rev1);
236 if (copyOrigin != null) { 249 if (copyOrigin != null) {
237 inspector.copied(pp.path(copyOrigin) /*pipe through pool, just in case*/, copyTarget); 250 inspector.copied(pp.path(copyOrigin) /*pipe through pool, just in case*/, copyTarget);
238 } else { 251 } else {
239 inspector.added(copyTarget); 252 inspector.added(copyTarget);
244 // for a single file not to be irresolvable obstacle for a status operation 257 // for a single file not to be irresolvable obstacle for a status operation
245 } 258 }
246 } 259 }
247 } 260 }
248 for (String left : r1Files) { 261 for (String left : r1Files) {
249 inspector.removed(pp.path(left)); 262 final Path r2filePath = pp.path(left);
263 if (scope.accept(r2filePath)) {
264 inspector.removed(r2filePath);
265 }
250 } 266 }
251 } 267 }
252 268
253 public Record status(int rev1, int rev2) { 269 public Record status(int rev1, int rev2) {
254 Record rv = new Record(); 270 Record rv = new Record();