Mercurial > hg
comparison mercurial/merge.py @ 20944:5b8d5803d7b7
merge: keep destination filename as key in actions for merge with dir rename
Avoids
None: local renamed directory to b/c -> d
updating:None 1/1 files (100.00%)
and makes it possible to compare/merge actions later.
author | Mads Kiilerich <madski@unity3d.com> |
---|---|
date | Sun, 02 Mar 2014 18:49:36 +0100 |
parents | 003cb972178d |
children | 18adc15635a1 |
comparison
equal
deleted
inserted
replaced
20943:003cb972178d | 20944:5b8d5803d7b7 |
---|---|
332 def removeop(f, args): | 332 def removeop(f, args): |
333 pmmf.discard(f) | 333 pmmf.discard(f) |
334 def nop(f, args): | 334 def nop(f, args): |
335 pass | 335 pass |
336 | 336 |
337 def renameop(f, args): | 337 def renamemoveop(f, args): |
338 f2, fd, flags = args | 338 f2, flags = args |
339 if f: | 339 pmmf.discard(f2) |
340 pmmf.discard(f) | 340 pmmf.add(f) |
341 pmmf.add(fd) | 341 def renamegetop(f, args): |
342 f2, flags = args | |
343 pmmf.add(f) | |
342 def mergeop(f, args): | 344 def mergeop(f, args): |
343 f2, fa, fd, move, anc = args | 345 f2, fa, fd, move, anc = args |
344 if move: | 346 if move: |
345 pmmf.discard(f) | 347 pmmf.discard(f) |
346 pmmf.add(fd) | 348 pmmf.add(fd) |
347 | 349 |
348 opmap = { | 350 opmap = { |
349 "a": addop, | 351 "a": addop, |
350 "d": renameop, | 352 "dm": renamemoveop, |
353 "dg": renamegetop, | |
351 "dr": nop, | 354 "dr": nop, |
352 "e": nop, | 355 "e": nop, |
353 "f": addop, # untracked file should be kept in working directory | 356 "f": addop, # untracked file should be kept in working directory |
354 "g": addop, | 357 "g": addop, |
355 "m": mergeop, | 358 "m": mergeop, |
470 else: # both changed something | 473 else: # both changed something |
471 actions.append((f, "m", (f, fa, f, False, pa.node()), | 474 actions.append((f, "m", (f, fa, f, False, pa.node()), |
472 "versions differ")) | 475 "versions differ")) |
473 elif f in copied: # files we'll deal with on m2 side | 476 elif f in copied: # files we'll deal with on m2 side |
474 pass | 477 pass |
475 elif n1 and f in movewithdir: # directory rename | 478 elif n1 and f in movewithdir: # directory rename, move local |
476 f2 = movewithdir[f] | 479 f2 = movewithdir[f] |
477 actions.append((f, "d", (None, f2, fl1), | 480 actions.append((f2, "dm", (f, fl1), |
478 "remote renamed directory to " + f2)) | 481 "remote directory rename - move from " + f)) |
479 elif n1 and f in copy: | 482 elif n1 and f in copy: |
480 f2 = copy[f] | 483 f2 = copy[f] |
481 actions.append((f, "m", (f2, f2, f, False, pa.node()), | 484 actions.append((f, "m", (f2, f2, f, False, pa.node()), |
482 "local copied/moved to " + f2)) | 485 "local copied/moved to " + f2)) |
483 elif n1 and f in ma: # clean, a different, no remote | 486 elif n1 and f in ma: # clean, a different, no remote |
490 actions.append((f, "f", None, "remote deleted")) | 493 actions.append((f, "f", None, "remote deleted")) |
491 else: | 494 else: |
492 actions.append((f, "r", None, "other deleted")) | 495 actions.append((f, "r", None, "other deleted")) |
493 elif n2 and f in movewithdir: | 496 elif n2 and f in movewithdir: |
494 f2 = movewithdir[f] | 497 f2 = movewithdir[f] |
495 actions.append((None, "d", (f, f2, fl2), | 498 actions.append((f2, "dg", (f, fl2), |
496 "local renamed directory to " + f2)) | 499 "local directory rename - get from " + f)) |
497 elif n2 and f in copy: | 500 elif n2 and f in copy: |
498 f2 = copy[f] | 501 f2 = copy[f] |
499 if f2 in m2: | 502 if f2 in m2: |
500 actions.append((f2, "m", (f, f2, f, False, pa.node()), | 503 actions.append((f2, "m", (f, f2, f, False, pa.node()), |
501 "remote copied to " + f)) | 504 "remote copied to " + f)) |
691 else: | 694 else: |
692 if r is None: | 695 if r is None: |
693 updated += 1 | 696 updated += 1 |
694 else: | 697 else: |
695 merged += 1 | 698 merged += 1 |
696 elif m == "d": # directory rename | 699 elif m == "dm": # directory rename, move local |
697 f2, fd, flags = args | 700 f0, flags = args |
698 if f: | 701 repo.ui.note(_("moving %s to %s\n") % (f0, f)) |
699 repo.ui.note(_("moving %s to %s\n") % (f, fd)) | 702 audit(f) |
700 audit(fd) | 703 repo.wwrite(f, wctx.filectx(f0).data(), flags) |
701 repo.wwrite(fd, wctx.filectx(f).data(), flags) | 704 util.unlinkpath(repo.wjoin(f0)) |
702 util.unlinkpath(repo.wjoin(f)) | 705 updated += 1 |
703 if f2: | 706 elif m == "dg": # local directory rename, get |
704 repo.ui.note(_("getting %s to %s\n") % (f2, fd)) | 707 f0, flags = args |
705 repo.wwrite(fd, mctx.filectx(f2).data(), flags) | 708 repo.ui.note(_("getting %s to %s\n") % (f0, f)) |
709 repo.wwrite(f, mctx.filectx(f0).data(), flags) | |
706 updated += 1 | 710 updated += 1 |
707 elif m == "dr": # divergent renames | 711 elif m == "dr": # divergent renames |
708 fl, = args | 712 fl, = args |
709 repo.ui.warn(_("note: possible conflict - %s was renamed " | 713 repo.ui.warn(_("note: possible conflict - %s was renamed " |
710 "multiple times to:\n") % f) | 714 "multiple times to:\n") % f) |
809 # modification. | 813 # modification. |
810 if f2 == fd: # file not locally copied/moved | 814 if f2 == fd: # file not locally copied/moved |
811 repo.dirstate.normallookup(fd) | 815 repo.dirstate.normallookup(fd) |
812 if move: | 816 if move: |
813 repo.dirstate.drop(f) | 817 repo.dirstate.drop(f) |
814 elif m == "d": # directory rename | 818 elif m == "dm": # directory rename, move local |
815 f2, fd, flag = args | 819 f0, flag = args |
816 if not f2 and f not in repo.dirstate: | 820 if f0 not in repo.dirstate: |
817 # untracked file moved | 821 # untracked file moved |
818 continue | 822 continue |
819 if branchmerge: | 823 if branchmerge: |
820 repo.dirstate.add(fd) | 824 repo.dirstate.add(f) |
821 if f: | 825 repo.dirstate.remove(f0) |
822 repo.dirstate.remove(f) | 826 repo.dirstate.copy(f0, f) |
823 repo.dirstate.copy(f, fd) | 827 else: |
824 if f2: | 828 repo.dirstate.normal(f) |
825 repo.dirstate.copy(f2, fd) | 829 repo.dirstate.drop(f0) |
826 else: | 830 elif m == "dg": # directory rename, get |
827 repo.dirstate.normal(fd) | 831 f0, flag = args |
828 if f: | 832 if branchmerge: |
829 repo.dirstate.drop(f) | 833 repo.dirstate.add(f) |
834 repo.dirstate.copy(f0, f) | |
835 else: | |
836 repo.dirstate.normal(f) | |
830 | 837 |
831 def update(repo, node, branchmerge, force, partial, ancestor=None, | 838 def update(repo, node, branchmerge, force, partial, ancestor=None, |
832 mergeancestor=False): | 839 mergeancestor=False): |
833 """ | 840 """ |
834 Perform a merge between the working directory and the given node | 841 Perform a merge between the working directory and the given node |