mercurial/merge.py
changeset 18134 6c35b53cd28b
parent 18042 551e2901192e
child 18143 242d2f4ec01c
equal deleted inserted replaced
18133:7f5a0eba3768 18134:6c35b53cd28b
   211 
   211 
   212     def act(msg, m, f, *args):
   212     def act(msg, m, f, *args):
   213         repo.ui.debug(" %s: %s -> %s\n" % (f, msg, m))
   213         repo.ui.debug(" %s: %s -> %s\n" % (f, msg, m))
   214         action.append((f, m) + args)
   214         action.append((f, m) + args)
   215 
   215 
   216     action, copy = [], {}
   216     action, copy, movewithdir = [], {}, {}
   217 
   217 
   218     if overwrite:
   218     if overwrite:
   219         pa = p1
   219         pa = p1
   220     elif pa == p2: # backwards
   220     elif pa == p2: # backwards
   221         pa = p1.p1()
   221         pa = p1.p1()
   222     elif pa and repo.ui.configbool("merge", "followcopies", True):
   222     elif pa and repo.ui.configbool("merge", "followcopies", True):
   223         copy, diverge, renamedelete = copies.mergecopies(repo, p1, p2, pa)
   223         ret = copies.mergecopies(repo, p1, p2, pa)
       
   224         copy, movewithdir, diverge, renamedelete = ret
   224         for of, fl in diverge.iteritems():
   225         for of, fl in diverge.iteritems():
   225             act("divergent renames", "dr", of, fl)
   226             act("divergent renames", "dr", of, fl)
   226         for of, fl in renamedelete.iteritems():
   227         for of, fl in renamedelete.iteritems():
   227             act("rename and delete", "rd", of, fl)
   228             act("rename and delete", "rd", of, fl)
   228 
   229 
   231                   % (bool(overwrite), bool(partial)))
   232                   % (bool(overwrite), bool(partial)))
   232     repo.ui.debug(" ancestor: %s, local: %s, remote: %s\n" % (pa, p1, p2))
   233     repo.ui.debug(" ancestor: %s, local: %s, remote: %s\n" % (pa, p1, p2))
   233 
   234 
   234     m1, m2, ma = p1.manifest(), p2.manifest(), pa.manifest()
   235     m1, m2, ma = p1.manifest(), p2.manifest(), pa.manifest()
   235     copied = set(copy.values())
   236     copied = set(copy.values())
       
   237     copied.update(movewithdir.values())
   236 
   238 
   237     if '.hgsubstate' in m1:
   239     if '.hgsubstate' in m1:
   238         # check whether sub state is modified
   240         # check whether sub state is modified
   239         for s in p1.substate:
   241         for s in p1.substate:
   240             if p1.sub(s).dirty():
   242             if p1.sub(s).dirty():
   257                 act("remote is newer", "g", f, rflags)
   259                 act("remote is newer", "g", f, rflags)
   258             else: # both changed
   260             else: # both changed
   259                 act("versions differ", "m", f, f, f, rflags, False)
   261                 act("versions differ", "m", f, f, f, rflags, False)
   260         elif f in copied: # files we'll deal with on m2 side
   262         elif f in copied: # files we'll deal with on m2 side
   261             pass
   263             pass
   262         elif f in copy:
   264         elif f in movewithdir: # directory rename
       
   265             f2 = movewithdir[f]
       
   266             act("remote renamed directory to " + f2, "d", f, None, f2,
       
   267                 m1.flags(f))
       
   268         elif f in copy: # case 2 A,B/B/B or case 4,21 A/B/B
   263             f2 = copy[f]
   269             f2 = copy[f]
   264             if f2 not in m2: # directory rename
   270             act("local copied/moved to " + f2, "m", f, f2, f,
   265                 act("remote renamed directory to " + f2, "d",
   271                 fmerge(f, f2, f2), False)
   266                     f, None, f2, m1.flags(f))
       
   267             else: # case 2 A,B/B/B or case 4,21 A/B/B
       
   268                 act("local copied/moved to " + f2, "m",
       
   269                     f, f2, f, fmerge(f, f2, f2), False)
       
   270         elif f in ma: # clean, a different, no remote
   272         elif f in ma: # clean, a different, no remote
   271             if n != ma[f]:
   273             if n != ma[f]:
   272                 if repo.ui.promptchoice(
   274                 if repo.ui.promptchoice(
   273                     _(" local changed %s which remote deleted\n"
   275                     _(" local changed %s which remote deleted\n"
   274                       "use (c)hanged version or (d)elete?") % f,
   276                       "use (c)hanged version or (d)elete?") % f,
   284     for f, n in m2.iteritems():
   286     for f, n in m2.iteritems():
   285         if partial and not partial(f):
   287         if partial and not partial(f):
   286             continue
   288             continue
   287         if f in m1 or f in copied: # files already visited
   289         if f in m1 or f in copied: # files already visited
   288             continue
   290             continue
   289         if f in copy:
   291         if f in movewithdir:
       
   292             f2 = movewithdir[f]
       
   293             act("local renamed directory to " + f2, "d", None, f, f2,
       
   294                 m2.flags(f))
       
   295         elif f in copy:
   290             f2 = copy[f]
   296             f2 = copy[f]
   291             if f2 not in m1: # directory rename
   297             if f2 in m2: # rename case 1, A/A,B/A
   292                 act("local renamed directory to " + f2, "d",
       
   293                     None, f, f2, m2.flags(f))
       
   294             elif f2 in m2: # rename case 1, A/A,B/A
       
   295                 act("remote copied to " + f, "m",
   298                 act("remote copied to " + f, "m",
   296                     f2, f, f, fmerge(f2, f, f2), False)
   299                     f2, f, f, fmerge(f2, f, f2), False)
   297             else: # case 3,20 A/B/A
   300             else: # case 3,20 A/B/A
   298                 act("remote moved to " + f, "m",
   301                 act("remote moved to " + f, "m",
   299                     f2, f, f, fmerge(f2, f, f2), True)
   302                     f2, f, f, fmerge(f2, f, f2), True)