mercurial/merge.py
changeset 20897 0b50788c160c
parent 20870 6500a2eebee8
child 20943 003cb972178d
equal deleted inserted replaced
20896:9fae01831dea 20897:0b50788c160c
   338         f2, fd, flags = args
   338         f2, fd, flags = args
   339         if f:
   339         if f:
   340             pmmf.discard(f)
   340             pmmf.discard(f)
   341         pmmf.add(fd)
   341         pmmf.add(fd)
   342     def mergeop(f, args):
   342     def mergeop(f, args):
   343         f2, fd, move = args
   343         f2, fa, fd, move = args
   344         if move:
   344         if move:
   345             pmmf.discard(f)
   345             pmmf.discard(f)
   346         pmmf.add(fd)
   346         pmmf.add(fd)
   347 
   347 
   348     opmap = {
   348     opmap = {
   466             elif nol and n2 == a: # remote only changed 'x'
   466             elif nol and n2 == a: # remote only changed 'x'
   467                 actions.append((f, "e", (fl2,), "update permissions"))
   467                 actions.append((f, "e", (fl2,), "update permissions"))
   468             elif nol and n1 == a: # local only changed 'x'
   468             elif nol and n1 == a: # local only changed 'x'
   469                 actions.append((f, "g", (fl1,), "remote is newer"))
   469                 actions.append((f, "g", (fl1,), "remote is newer"))
   470             else: # both changed something
   470             else: # both changed something
   471                 actions.append((f, "m", (f, f, False), "versions differ"))
   471                 actions.append((f, "m", (f, fa, f, False), "versions differ"))
   472         elif f in copied: # files we'll deal with on m2 side
   472         elif f in copied: # files we'll deal with on m2 side
   473             pass
   473             pass
   474         elif n1 and f in movewithdir: # directory rename
   474         elif n1 and f in movewithdir: # directory rename
   475             f2 = movewithdir[f]
   475             f2 = movewithdir[f]
   476             actions.append((f, "d", (None, f2, fl1),
   476             actions.append((f, "d", (None, f2, fl1),
   477                             "remote renamed directory to " + f2))
   477                             "remote renamed directory to " + f2))
   478         elif n1 and f in copy:
   478         elif n1 and f in copy:
   479             f2 = copy[f]
   479             f2 = copy[f]
   480             actions.append((f, "m", (f2, f, False),
   480             actions.append((f, "m", (f2, f2, f, False),
   481                             "local copied/moved to " + f2))
   481                             "local copied/moved to " + f2))
   482         elif n1 and f in ma: # clean, a different, no remote
   482         elif n1 and f in ma: # clean, a different, no remote
   483             if n1 != ma[f]:
   483             if n1 != ma[f]:
   484                 if acceptremote:
   484                 if acceptremote:
   485                     actions.append((f, "r", None, "remote delete"))
   485                     actions.append((f, "r", None, "remote delete"))
   494             actions.append((None, "d", (f, f2, fl2),
   494             actions.append((None, "d", (f, f2, fl2),
   495                             "local renamed directory to " + f2))
   495                             "local renamed directory to " + f2))
   496         elif n2 and f in copy:
   496         elif n2 and f in copy:
   497             f2 = copy[f]
   497             f2 = copy[f]
   498             if f2 in m2:
   498             if f2 in m2:
   499                 actions.append((f2, "m", (f, f, False),
   499                 actions.append((f2, "m", (f, f2, f, False),
   500                                 "remote copied to " + f))
   500                                 "remote copied to " + f))
   501             else:
   501             else:
   502                 actions.append((f2, "m", (f, f, True),
   502                 actions.append((f2, "m", (f, f2, f, True),
   503                                 "remote moved to " + f))
   503                                 "remote moved to " + f))
   504         elif n2 and f not in ma:
   504         elif n2 and f not in ma:
   505             # local unknown, remote created: the logic is described by the
   505             # local unknown, remote created: the logic is described by the
   506             # following table:
   506             # following table:
   507             #
   507             #
   517             if force and not branchmerge:
   517             if force and not branchmerge:
   518                 actions.append((f, "g", (fl2,), "remote created"))
   518                 actions.append((f, "g", (fl2,), "remote created"))
   519             else:
   519             else:
   520                 different = _checkunknownfile(repo, wctx, p2, f)
   520                 different = _checkunknownfile(repo, wctx, p2, f)
   521                 if force and branchmerge and different:
   521                 if force and branchmerge and different:
   522                     actions.append((f, "m", (f, f, False),
   522                     # FIXME: This is wrong - f is not in ma ...
       
   523                     actions.append((f, "m", (f, f, f, False),
   523                                     "remote differs from untracked local"))
   524                                     "remote differs from untracked local"))
   524                 elif not force and different:
   525                 elif not force and different:
   525                     aborts.append((f, "ud"))
   526                     aborts.append((f, "ud"))
   526                 else:
   527                 else:
   527                     actions.append((f, "g", (fl2,), "remote created"))
   528                     actions.append((f, "g", (fl2,), "remote created"))
   615     # prescan for merges
   616     # prescan for merges
   616     for a in actions:
   617     for a in actions:
   617         f, m, args, msg = a
   618         f, m, args, msg = a
   618         repo.ui.debug(" %s: %s -> %s\n" % (f, msg, m))
   619         repo.ui.debug(" %s: %s -> %s\n" % (f, msg, m))
   619         if m == "m": # merge
   620         if m == "m": # merge
   620             f2, fd, move = args
   621             f2, fa, fd, move = args
   621             if fd == '.hgsubstate': # merged internally
   622             if fd == '.hgsubstate': # merged internally
   622                 continue
   623                 continue
   623             repo.ui.debug("  preserving %s for resolve of %s\n" % (f, fd))
   624             repo.ui.debug("  preserving %s for resolve of %s\n" % (f, fd))
   624             fcl = wctx[f]
   625             fcl = wctx[f]
   625             fco = mctx[f2]
   626             fco = mctx[f2]
   626             if mctx == actx: # backwards, use working dir parent as ancestor
   627             if mctx == actx: # backwards, use working dir parent as ancestor
   627                 if fcl.parents():
   628                 if fcl.parents():
   628                     fca = fcl.p1()
   629                     fca = fcl.p1()
   629                 else:
   630                 else:
   630                     fca = repo.filectx(f, fileid=nullrev)
   631                     fca = repo.filectx(f, fileid=nullrev)
       
   632             elif fa in actx:
       
   633                 fca = actx[fa]
   631             else:
   634             else:
   632                 fca = fcl.ancestor(fco, actx)
       
   633             if not fca:
       
   634                 fca = repo.filectx(f, fileid=nullrev)
   635                 fca = repo.filectx(f, fileid=nullrev)
   635             ms.add(fcl, fco, fca, fd)
   636             ms.add(fcl, fco, fca, fd)
   636             if f != fd and move:
   637             if f != fd and move:
   637                 moves.append(f)
   638                 moves.append(f)
   638 
   639 
   680 
   681 
   681     for i, a in enumerate(actions):
   682     for i, a in enumerate(actions):
   682         f, m, args, msg = a
   683         f, m, args, msg = a
   683         progress(_updating, z + i + 1, item=f, total=numupdates, unit=_files)
   684         progress(_updating, z + i + 1, item=f, total=numupdates, unit=_files)
   684         if m == "m": # merge
   685         if m == "m": # merge
   685             f2, fd, move = args
   686             f2, fa, fd, move = args
   686             if fd == '.hgsubstate': # subrepo states need updating
   687             if fd == '.hgsubstate': # subrepo states need updating
   687                 subrepo.submerge(repo, wctx, mctx, wctx.ancestor(mctx),
   688                 subrepo.submerge(repo, wctx, mctx, wctx.ancestor(mctx),
   688                                  overwrite)
   689                                  overwrite)
   689                 continue
   690                 continue
   690             audit(fd)
   691             audit(fd)
   790             if branchmerge:
   791             if branchmerge:
   791                 repo.dirstate.otherparent(f)
   792                 repo.dirstate.otherparent(f)
   792             else:
   793             else:
   793                 repo.dirstate.normal(f)
   794                 repo.dirstate.normal(f)
   794         elif m == "m": # merge
   795         elif m == "m": # merge
   795             f2, fd, move = args
   796             f2, fa, fd, move = args
   796             if branchmerge:
   797             if branchmerge:
   797                 # We've done a branch merge, mark this file as merged
   798                 # We've done a branch merge, mark this file as merged
   798                 # so that we properly record the merger later
   799                 # so that we properly record the merger later
   799                 repo.dirstate.merge(fd)
   800                 repo.dirstate.merge(fd)
   800                 if f != f2: # copy/rename
   801                 if f != f2: # copy/rename