comparison src/org/tmatesoft/hg/repo/HgWorkingCopyStatusCollector.java @ 471:7bcfbc255f48

Merge changes from smartgit3 branch into 1.1 stream
author Artem Tikhomirov <tikhomirov.artem@gmail.com>
date Wed, 11 Jul 2012 20:40:47 +0200
parents 909306e412e2
children 5c09a9f2e073
comparison
equal deleted inserted replaced
470:31bd09da0dcf 471:7bcfbc255f48
383 private void checkLocalStatusAgainstBaseRevision(Set<Path> baseRevNames, ManifestRevision collect, int baseRevision, Path fname, FileInfo f, HgStatusInspector inspector) { 383 private void checkLocalStatusAgainstBaseRevision(Set<Path> baseRevNames, ManifestRevision collect, int baseRevision, Path fname, FileInfo f, HgStatusInspector inspector) {
384 // fname is in the dirstate, either Normal, Added, Removed or Merged 384 // fname is in the dirstate, either Normal, Added, Removed or Merged
385 Nodeid nid1 = collect.nodeid(fname); 385 Nodeid nid1 = collect.nodeid(fname);
386 HgManifest.Flags flags = collect.flags(fname); 386 HgManifest.Flags flags = collect.flags(fname);
387 HgDirstate.Record r; 387 HgDirstate.Record r;
388 final HgDirstate ds = getDirstateImpl();
388 if (nid1 == null) { 389 if (nid1 == null) {
389 // normal: added? 390 // not known at the time of baseRevision:
390 // added: not known at the time of baseRevision, shall report 391 // normal, added, merged: either added or copied since base revision.
391 // merged: was not known, report as added? 392 // removed: nothing to report,
392 if ((r = getDirstateImpl().checkNormal(fname)) != null) { 393 if (ds.checkNormal(fname) != null || ds.checkMerged(fname) != null) {
393 try { 394 try {
394 Path origin = HgStatusCollector.getOriginIfCopy(repo, fname, baseRevNames, baseRevision); 395 Path origin = HgStatusCollector.getOriginIfCopy(repo, fname, baseRevNames, baseRevision);
395 if (origin != null) { 396 if (origin != null) {
396 inspector.copied(getPathPool().mangle(origin), fname); 397 inspector.copied(getPathPool().mangle(origin), fname);
397 return; 398 return;
398 } 399 }
400 // fall-through, report as added
399 } catch (HgInvalidFileException ex) { 401 } catch (HgInvalidFileException ex) {
400 // report failure and continue status collection 402 // report failure and continue status collection
401 inspector.invalid(fname, ex); 403 inspector.invalid(fname, ex);
402 } 404 }
403 } else if ((r = getDirstateImpl().checkAdded(fname)) != null) { 405 } else if ((r = ds.checkAdded(fname)) != null) {
404 if (r.copySource() != null && baseRevNames.contains(r.copySource())) { 406 if (r.copySource() != null && baseRevNames.contains(r.copySource())) {
405 baseRevNames.remove(r.copySource()); // XXX surely I shall not report rename source as Removed? 407 baseRevNames.remove(r.copySource()); // FIXME likely I shall report rename source as Removed, same as above for Normal?
406 inspector.copied(r.copySource(), fname); 408 inspector.copied(r.copySource(), fname);
407 return; 409 return;
408 } 410 }
409 // fall-through, report as added 411 // fall-through, report as added
410 } else if (getDirstateImpl().checkRemoved(fname) != null) { 412 } else if (ds.checkRemoved(fname) != null) {
411 // removed: removed file was not known at the time of baseRevision, and we should not report it as removed 413 // removed: removed file was not known at the time of baseRevision, and we should not report it as removed
412 return; 414 return;
413 } 415 }
414 inspector.added(fname); 416 inspector.added(fname);
415 } else { 417 } else {
416 // was known; check whether clean or modified 418 // was known; check whether clean or modified
417 Nodeid nidFromDirstate = getDirstateParentManifest().nodeid(fname); 419 Nodeid nidFromDirstate = getDirstateParentManifest().nodeid(fname);
418 if ((r = getDirstateImpl().checkNormal(fname)) != null && nid1.equals(nidFromDirstate)) { 420 if ((r = ds.checkNormal(fname)) != null && nid1.equals(nidFromDirstate)) {
419 // regular file, was the same up to WC initialization. Check if was modified since, and, if not, report right away 421 // regular file, was the same up to WC initialization. Check if was modified since, and, if not, report right away
420 // same code as in #checkLocalStatusAgainstFile 422 // same code as in #checkLocalStatusAgainstFile
421 final boolean timestampEqual = f.lastModified() == r.modificationTime(), sizeEqual = r.size() == f.length(); 423 final boolean timestampEqual = f.lastModified() == r.modificationTime(), sizeEqual = r.size() == f.length();
422 boolean handled = false; 424 boolean handled = false;
423 if (timestampEqual && sizeEqual) { 425 if (timestampEqual && sizeEqual) {
437 } 439 }
438 // otherwise, shall check actual content (size not the same, or unknown (-1 or -2), or timestamp is different, 440 // otherwise, shall check actual content (size not the same, or unknown (-1 or -2), or timestamp is different,
439 // or nodeid in dirstate is different, but local change might have brought it back to baseRevision state) 441 // or nodeid in dirstate is different, but local change might have brought it back to baseRevision state)
440 // FALL THROUGH 442 // FALL THROUGH
441 } 443 }
442 if (r != null || (r = getDirstateImpl().checkMerged(fname)) != null || (r = getDirstateImpl().checkAdded(fname)) != null) { 444 if (r != null || (r = ds.checkMerged(fname)) != null || (r = ds.checkAdded(fname)) != null) {
443 try { 445 try {
444 // check actual content to see actual changes 446 // check actual content to see actual changes
445 // when added - seems to be the case of a file added once again, hence need to check if content is different 447 // when added - seems to be the case of a file added once again, hence need to check if content is different
446 // either clean or modified 448 // either clean or modified
447 HgDataFile fileNode = repo.getFileNode(fname); 449 HgDataFile fileNode = repo.getFileNode(fname);