Mercurial > hg4j
comparison src/org/tmatesoft/hg/repo/HgStatusCollector.java @ 690:b286222158be
Fix file.isCopy() use for status and cat commands
author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
---|---|
date | Thu, 01 Aug 2013 21:45:47 +0200 |
parents | 5050ee565bd1 |
children | 72fc7774b87e |
comparison
equal
deleted
inserted
replaced
689:5050ee565bd1 | 690:b286222158be |
---|---|
296 r1 = get(rev1); | 296 r1 = get(rev1); |
297 r2 = get(rev2); | 297 r2 = get(rev2); |
298 | 298 |
299 final CancelSupport cs = CancelSupport.Factory.get(inspector); | 299 final CancelSupport cs = CancelSupport.Factory.get(inspector); |
300 | 300 |
301 TreeSet<Path> r1Files = new TreeSet<Path>(r1.files()); | 301 |
302 Collection<Path> allBaseFiles = r1.files(); | |
303 TreeSet<Path> r1Files = new TreeSet<Path>(allBaseFiles); | |
302 for (Path r2fname : r2.files()) { | 304 for (Path r2fname : r2.files()) { |
303 if (!scope.accept(r2fname)) { | 305 if (!scope.accept(r2fname)) { |
304 continue; | 306 continue; |
305 } | 307 } |
306 if (r1Files.remove(r2fname)) { | 308 if (r1Files.remove(r2fname)) { |
315 } | 317 } |
316 cs.checkCancelled(); | 318 cs.checkCancelled(); |
317 } else { | 319 } else { |
318 try { | 320 try { |
319 Path copyTarget = r2fname; | 321 Path copyTarget = r2fname; |
320 Path copyOrigin = detectCopies ? getOriginIfCopy(repo, copyTarget, r2.nodeid(copyTarget), r1Files, rev1) : null; | 322 Path copyOrigin = detectCopies ? getOriginIfCopy(repo, copyTarget, r2.nodeid(copyTarget), allBaseFiles, rev1) : null; |
321 if (copyOrigin != null) { | 323 if (copyOrigin != null) { |
322 inspector.copied(getPathPool().mangle(copyOrigin) /*pipe through pool, just in case*/, copyTarget); | 324 inspector.copied(getPathPool().mangle(copyOrigin) /*pipe through pool, just in case*/, copyTarget); |
323 } else { | 325 } else { |
324 inspector.added(copyTarget); | 326 inspector.added(copyTarget); |
325 } | 327 } |
360 throw t; | 362 throw t; |
361 } | 363 } |
362 return rv; | 364 return rv; |
363 } | 365 } |
364 | 366 |
367 // originals shall include all names known in base revision, not those not yet consumed | |
368 // see TestStatus#testDetectRenamesInNonFirstRev and log-renames test repository | |
369 // where a and d in r5 are compared to a and b in r1, while d is in fact descendant of original a, and a is original b (through c) | |
365 /*package-local*/static Path getOriginIfCopy(HgRepository hgRepo, Path fname, Nodeid fnameRev, Collection<Path> originals, int originalChangesetIndex) throws HgRuntimeException { | 370 /*package-local*/static Path getOriginIfCopy(HgRepository hgRepo, Path fname, Nodeid fnameRev, Collection<Path> originals, int originalChangesetIndex) throws HgRuntimeException { |
366 HgDataFile df = hgRepo.getFileNode(fname); | 371 HgDataFile df = hgRepo.getFileNode(fname); |
367 if (!df.exists()) { | 372 if (!df.exists()) { |
368 String msg = String.format("Didn't find file '%s' in the repo. Perhaps, bad storage name conversion?", fname); | 373 String msg = String.format("Didn't find file '%s' in the repo. Perhaps, bad storage name conversion?", fname); |
369 throw new HgInvalidFileException(msg, null).setFileName(fname).setRevisionIndex(originalChangesetIndex); | 374 throw new HgInvalidFileException(msg, null).setFileName(fname).setRevisionIndex(originalChangesetIndex); |
378 continue; | 383 continue; |
379 } | 384 } |
380 int csetRevIndex = df.getChangesetRevisionIndex(fileRevIndex); | 385 int csetRevIndex = df.getChangesetRevisionIndex(fileRevIndex); |
381 if (csetRevIndex <= originalChangesetIndex) { | 386 if (csetRevIndex <= originalChangesetIndex) { |
382 // we've walked past originalChangelogRevIndex and no chances we'll find origin | 387 // we've walked past originalChangelogRevIndex and no chances we'll find origin |
383 // if we get here, it means fname's origin is not from the base revision | 388 // if we get here, it means either fname's origin is not from the base revision |
384 return null; | 389 // or the last found rename is still valid |
390 return lastOriginFound; | |
385 } | 391 } |
386 HgFileRevision origin = df.getCopySource(fileRevIndex); | 392 HgFileRevision origin = df.getCopySource(fileRevIndex); |
387 // prepare for the next step, df(copyFromFileRev) would point to copy origin and its revision | 393 // prepare for the next step, df(copyFromFileRev) would point to copy origin and its revision |
388 df = hgRepo.getFileNode(origin.getPath()); | 394 df = hgRepo.getFileNode(origin.getPath()); |
389 int copyFromFileRevIndex = df.getRevisionIndex(origin.getRevision()); | 395 int copyFromFileRevIndex = df.getRevisionIndex(origin.getRevision()); |
398 } | 404 } |
399 // copy/rename happened in [copyFromCsetIndex..target], let's see if | 405 // copy/rename happened in [copyFromCsetIndex..target], let's see if |
400 // origin wasn't renamed once more in [originalChangesetIndex..copyFromCsetIndex] | 406 // origin wasn't renamed once more in [originalChangesetIndex..copyFromCsetIndex] |
401 lastOriginFound = origin.getPath(); | 407 lastOriginFound = origin.getPath(); |
402 // FALL-THROUGH | 408 // FALL-THROUGH |
409 } else { | |
410 // clear last known origin if the file was renamed once again to something we don't have in base | |
411 lastOriginFound = null; | |
403 } | 412 } |
404 // try more steps away | 413 // try more steps away |
405 // copyFromFileRev or one of its predecessors might be copies as well | 414 // copyFromFileRev or one of its predecessors might be copies as well |
406 fileRevIndex = copyFromFileRevIndex; // df is already origin file | 415 fileRevIndex = copyFromFileRevIndex; // df is already origin file |
407 } | 416 } |