mercurial/merge.py
changeset 20945 18adc15635a1
parent 20944 5b8d5803d7b7
child 21024 7731a2281cf0
equal deleted inserted replaced
20944:5b8d5803d7b7 20945:18adc15635a1
   340         pmmf.add(f)
   340         pmmf.add(f)
   341     def renamegetop(f, args):
   341     def renamegetop(f, args):
   342         f2, flags = args
   342         f2, flags = args
   343         pmmf.add(f)
   343         pmmf.add(f)
   344     def mergeop(f, args):
   344     def mergeop(f, args):
   345         f2, fa, fd, move, anc = args
   345         f1, f2, fa, move, anc = args
   346         if move:
   346         if move:
   347             pmmf.discard(f)
   347             pmmf.discard(f1)
   348         pmmf.add(fd)
   348         pmmf.add(f)
   349 
   349 
   350     opmap = {
   350     opmap = {
   351         "a": addop,
   351         "a": addop,
   352         "dm": renamemoveop,
   352         "dm": renamemoveop,
   353         "dg": renamegetop,
   353         "dg": renamegetop,
   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