comparison mercurial/patch.py @ 3696:562a65635bcb

diff: better detection of renames when comparing with the working dir.
author Alexis S. L. Carvalho <alexis@cecm.usp.br>
date Mon, 20 Nov 2006 19:32:38 -0200
parents 3a2fc90d27d6
children 05c8704a3743
comparison
equal deleted inserted replaced
3695:3a2fc90d27d6 3696:562a65635bcb
465 modified, added, removed = map(filterfiles, (modified, added, removed)) 465 modified, added, removed = map(filterfiles, (modified, added, removed))
466 466
467 if not modified and not added and not removed: 467 if not modified and not added and not removed:
468 return 468 return
469 469
470 # returns False if there was no rename between n1 and n2
471 # returns None if the file was created between n1 and n2
472 # returns the (file, node) present in n1 that was renamed to f in n2
470 def renamedbetween(f, n1, n2): 473 def renamedbetween(f, n1, n2):
471 r1, r2 = map(repo.changelog.rev, (n1, n2)) 474 r1, r2 = map(repo.changelog.rev, (n1, n2))
472 orig = f 475 orig = f
473 src = None 476 src = None
474 while r2 > r1: 477 while r2 > r1:
481 return None 484 return None
482 if src: 485 if src:
483 f = src[0] 486 f = src[0]
484 n2 = repo.changelog.parents(n2)[0] 487 n2 = repo.changelog.parents(n2)[0]
485 r2 = repo.changelog.rev(n2) 488 r2 = repo.changelog.rev(n2)
486 if orig == f:
487 return None
488 cl = getchangelog(n1) 489 cl = getchangelog(n1)
489 m = getmanifest(cl[0]) 490 m = getmanifest(cl[0])
490 if f not in m: 491 if f not in m:
491 return None 492 return None
493 if f == orig:
494 return False
492 return f, m[f] 495 return f, m[f]
493 496
494 if node2: 497 if node2:
495 change = getchangelog(node2) 498 change = getchangelog(node2)
496 mmap2 = getmanifest(change[0]) 499 mmap2 = getmanifest(change[0])
516 src = repo.dirstate.copied(f) 519 src = repo.dirstate.copied(f)
517 parent = repo.dirstate.parents()[0] 520 parent = repo.dirstate.parents()[0]
518 if src: 521 if src:
519 f = src 522 f = src
520 of = renamedbetween(f, node1, parent) 523 of = renamedbetween(f, node1, parent)
521 if of: 524 if of or of is None:
522 return of 525 return of
523 elif src: 526 elif src:
524 cl = getchangelog(parent)[0] 527 cl = getchangelog(parent)[0]
525 return (src, getmanifest(cl)[src]) 528 return (src, getmanifest(cl)[src])
526 else: 529 else: