469 elif nol and n2 == a: # remote only changed 'x' |
469 elif nol and n2 == a: # remote only changed 'x' |
470 actions.append((f, "e", (fl2,), "update permissions")) |
470 actions.append((f, "e", (fl2,), "update permissions")) |
471 elif nol and n1 == a: # local only changed 'x' |
471 elif nol and n1 == a: # local only changed 'x' |
472 actions.append((f, "g", (fl1,), "remote is newer")) |
472 actions.append((f, "g", (fl1,), "remote is newer")) |
473 else: # both changed something |
473 else: # both changed something |
474 actions.append((f, "m", (f, fa, f, False, pa.node()), |
474 actions.append((f, "m", (f, f, fa, False, pa.node()), |
475 "versions differ")) |
475 "versions differ")) |
476 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 |
477 pass |
477 pass |
478 elif n1 and f in movewithdir: # directory rename, move local |
478 elif n1 and f in movewithdir: # directory rename, move local |
479 f2 = movewithdir[f] |
479 f2 = movewithdir[f] |
480 actions.append((f2, "dm", (f, fl1), |
480 actions.append((f2, "dm", (f, fl1), |
481 "remote directory rename - move from " + f)) |
481 "remote directory rename - move from " + f)) |
482 elif n1 and f in copy: |
482 elif n1 and f in copy: |
483 f2 = copy[f] |
483 f2 = copy[f] |
484 actions.append((f, "m", (f2, f2, f, False, pa.node()), |
484 actions.append((f, "m", (f, f2, f2, False, pa.node()), |
485 "local copied/moved to " + f2)) |
485 "local copied/moved from " + f2)) |
486 elif n1 and f in ma: # clean, a different, no remote |
486 elif n1 and f in ma: # clean, a different, no remote |
487 if n1 != ma[f]: |
487 if n1 != ma[f]: |
488 if acceptremote: |
488 if acceptremote: |
489 actions.append((f, "r", None, "remote delete")) |
489 actions.append((f, "r", None, "remote delete")) |
490 else: |
490 else: |
498 actions.append((f2, "dg", (f, fl2), |
498 actions.append((f2, "dg", (f, fl2), |
499 "local directory rename - get from " + f)) |
499 "local directory rename - get from " + f)) |
500 elif n2 and f in copy: |
500 elif n2 and f in copy: |
501 f2 = copy[f] |
501 f2 = copy[f] |
502 if f2 in m2: |
502 if f2 in m2: |
503 actions.append((f2, "m", (f, f2, f, False, pa.node()), |
503 actions.append((f, "m", (f2, f, f2, False, pa.node()), |
504 "remote copied to " + f)) |
504 "remote copied from " + f2)) |
505 else: |
505 else: |
506 actions.append((f2, "m", (f, f2, f, True, pa.node()), |
506 actions.append((f, "m", (f2, f, f2, True, pa.node()), |
507 "remote moved to " + f)) |
507 "remote moved from " + f2)) |
508 elif n2 and f not in ma: |
508 elif n2 and f not in ma: |
509 # local unknown, remote created: the logic is described by the |
509 # local unknown, remote created: the logic is described by the |
510 # following table: |
510 # following table: |
511 # |
511 # |
512 # force branchmerge different | action |
512 # force branchmerge different | action |
619 # prescan for merges |
619 # prescan for merges |
620 for a in actions: |
620 for a in actions: |
621 f, m, args, msg = a |
621 f, m, args, msg = a |
622 repo.ui.debug(" %s: %s -> %s\n" % (f, msg, m)) |
622 repo.ui.debug(" %s: %s -> %s\n" % (f, msg, m)) |
623 if m == "m": # merge |
623 if m == "m": # merge |
624 f2, fa, fd, move, anc = args |
624 f1, f2, fa, move, anc = args |
625 if fd == '.hgsubstate': # merged internally |
625 if f == '.hgsubstate': # merged internally |
626 continue |
626 continue |
627 repo.ui.debug(" preserving %s for resolve of %s\n" % (f, fd)) |
627 repo.ui.debug(" preserving %s for resolve of %s\n" % (f1, f)) |
628 fcl = wctx[f] |
628 fcl = wctx[f1] |
629 fco = mctx[f2] |
629 fco = mctx[f2] |
630 actx = repo[anc] |
630 actx = repo[anc] |
631 if fa in actx: |
631 if fa in actx: |
632 fca = actx[fa] |
632 fca = actx[fa] |
633 else: |
633 else: |
634 fca = repo.filectx(f, fileid=nullrev) |
634 fca = repo.filectx(f1, fileid=nullrev) |
635 ms.add(fcl, fco, fca, fd) |
635 ms.add(fcl, fco, fca, f) |
636 if f != fd and move: |
636 if f1 != f and move: |
637 moves.append(f) |
637 moves.append(f1) |
638 |
638 |
639 audit = repo.wopener.audit |
639 audit = repo.wopener.audit |
640 |
640 |
641 # remove renamed files after safely stored |
641 # remove renamed files after safely stored |
642 for f in moves: |
642 for f in moves: |
680 |
680 |
681 for i, a in enumerate(actions): |
681 for i, a in enumerate(actions): |
682 f, m, args, msg = a |
682 f, m, args, msg = a |
683 progress(_updating, z + i + 1, item=f, total=numupdates, unit=_files) |
683 progress(_updating, z + i + 1, item=f, total=numupdates, unit=_files) |
684 if m == "m": # merge |
684 if m == "m": # merge |
685 f2, fa, fd, move, anc = args |
685 f1, f2, fa, move, anc = args |
686 if fd == '.hgsubstate': # subrepo states need updating |
686 if f == '.hgsubstate': # subrepo states need updating |
687 subrepo.submerge(repo, wctx, mctx, wctx.ancestor(mctx), |
687 subrepo.submerge(repo, wctx, mctx, wctx.ancestor(mctx), |
688 overwrite) |
688 overwrite) |
689 continue |
689 continue |
690 audit(fd) |
690 audit(f) |
691 r = ms.resolve(fd, wctx) |
691 r = ms.resolve(f, wctx) |
692 if r is not None and r > 0: |
692 if r is not None and r > 0: |
693 unresolved += 1 |
693 unresolved += 1 |
694 else: |
694 else: |
695 if r is None: |
695 if r is None: |
696 updated += 1 |
696 updated += 1 |
791 if branchmerge: |
791 if branchmerge: |
792 repo.dirstate.otherparent(f) |
792 repo.dirstate.otherparent(f) |
793 else: |
793 else: |
794 repo.dirstate.normal(f) |
794 repo.dirstate.normal(f) |
795 elif m == "m": # merge |
795 elif m == "m": # merge |
796 f2, fa, fd, move, anc = args |
796 f1, f2, fa, move, anc = args |
797 if branchmerge: |
797 if branchmerge: |
798 # We've done a branch merge, mark this file as merged |
798 # We've done a branch merge, mark this file as merged |
799 # so that we properly record the merger later |
799 # so that we properly record the merger later |
800 repo.dirstate.merge(fd) |
800 repo.dirstate.merge(f) |
801 if f != f2: # copy/rename |
801 if f1 != f2: # copy/rename |
802 if move: |
802 if move: |
803 repo.dirstate.remove(f) |
803 repo.dirstate.remove(f1) |
804 if f != fd: |
804 if f1 != f: |
805 repo.dirstate.copy(f, fd) |
805 repo.dirstate.copy(f1, f) |
806 else: |
806 else: |
807 repo.dirstate.copy(f2, fd) |
807 repo.dirstate.copy(f2, f) |
808 else: |
808 else: |
809 # We've update-merged a locally modified file, so |
809 # We've update-merged a locally modified file, so |
810 # we set the dirstate to emulate a normal checkout |
810 # we set the dirstate to emulate a normal checkout |
811 # of that file some time in the past. Thus our |
811 # of that file some time in the past. Thus our |
812 # merge will appear as a normal local file |
812 # merge will appear as a normal local file |
813 # modification. |
813 # modification. |
814 if f2 == fd: # file not locally copied/moved |
814 if f2 == f: # file not locally copied/moved |
815 repo.dirstate.normallookup(fd) |
815 repo.dirstate.normallookup(f) |
816 if move: |
816 if move: |
817 repo.dirstate.drop(f) |
817 repo.dirstate.drop(f1) |
818 elif m == "dm": # directory rename, move local |
818 elif m == "dm": # directory rename, move local |
819 f0, flag = args |
819 f0, flag = args |
820 if f0 not in repo.dirstate: |
820 if f0 not in repo.dirstate: |
821 # untracked file moved |
821 # untracked file moved |
822 continue |
822 continue |