mercurial/merge.py
changeset 3101 36b08cd92fb7
parent 3100 87ea5a71f7b9
child 3102 22336ad45cf2
equal deleted inserted replaced
3100:87ea5a71f7b9 3101:36b08cd92fb7
   144             if n != m2[f]:
   144             if n != m2[f]:
   145                 a = ma.get(f, nullid)
   145                 a = ma.get(f, nullid)
   146                 # are both different from the ancestor?
   146                 # are both different from the ancestor?
   147                 if not overwrite and n != a and m2[f] != a:
   147                 if not overwrite and n != a and m2[f] != a:
   148                     repo.ui.debug(_(" %s versions differ, resolve\n") % f)
   148                     repo.ui.debug(_(" %s versions differ, resolve\n") % f)
   149                     action.append((f, fmerge(f, m1, m2, ma), n[:20], m2[f]))
   149                     action.append((f, "m", fmerge(f, m1, m2, ma), n[:20], m2[f]))
   150                     queued = 1
   150                     queued = 1
   151                 # are we clobbering?
   151                 # are we clobbering?
   152                 # is remote's version newer?
   152                 # is remote's version newer?
   153                 # or are we going back in time and clean?
   153                 # or are we going back in time and clean?
   154                 elif overwrite or m2[f] != a or (backwards and not n[20:]):
   154                 elif overwrite or m2[f] != a or (backwards and not n[20:]):
   155                     repo.ui.debug(_(" remote %s is newer, get\n") % f)
   155                     repo.ui.debug(_(" remote %s is newer, get\n") % f)
   156                     action.append((f, m2.execf(f), m2[f], None))
   156                     action.append((f, "g", m2.execf(f), m2[f]))
   157                     queued = 1
   157                     queued = 1
   158             elif n[20:] in ("u","a"):
   158             elif n[20:] in ("u","a"):
   159                 # this unknown file is the same as the checkout
   159                 # this unknown file is the same as the checkout
   160                 # we need to reset the dirstate if the file was added
   160                 # we need to reset the dirstate if the file was added
   161                 action.append((f, m2.execf(f), m2[f], None))
   161                 action.append((f, "g", m2.execf(f), m2[f]))
   162 
   162 
   163             # do we still need to look at mode bits?
   163             # do we still need to look at mode bits?
   164             if not queued and m1.execf(f) != m2.execf(f):
   164             if not queued and m1.execf(f) != m2.execf(f):
   165                 if overwrite:
   165                 if overwrite:
   166                     repo.ui.debug(_(" updating permissions for %s\n") % f)
   166                     repo.ui.debug(_(" updating permissions for %s\n") % f)
   177                 if not overwrite:
   177                 if not overwrite:
   178                     r = repo.ui.prompt(
   178                     r = repo.ui.prompt(
   179                         (_(" local changed %s which remote deleted\n") % f) +
   179                         (_(" local changed %s which remote deleted\n") % f) +
   180                          _("(k)eep or (d)elete?"), _("[kd]"), _("k"))
   180                          _("(k)eep or (d)elete?"), _("[kd]"), _("k"))
   181                 if r == _("d"):
   181                 if r == _("d"):
   182                     action.append((f, None, None, None))
   182                     action.append((f, "r"))
   183             else:
   183             else:
   184                 repo.ui.debug(_("other deleted %s\n") % f)
   184                 repo.ui.debug(_("other deleted %s\n") % f)
   185                 action.append((f, None, None, None))
   185                 action.append((f, "r"))
   186         else:
   186         else:
   187             # file is created on branch or in working directory
   187             # file is created on branch or in working directory
   188             if overwrite and n[20:] != "u":
   188             if overwrite and n[20:] != "u":
   189                 repo.ui.debug(_("remote deleted %s, clobbering\n") % f)
   189                 repo.ui.debug(_("remote deleted %s, clobbering\n") % f)
   190                 action.append((f, None, None, None))
   190                 action.append((f, "r"))
   191             elif not n[20:]: # same as parent
   191             elif not n[20:]: # same as parent
   192                 if backwards:
   192                 if backwards:
   193                     repo.ui.debug(_("remote deleted %s\n") % f)
   193                     repo.ui.debug(_("remote deleted %s\n") % f)
   194                     action.append((f, None, None, None))
   194                     action.append((f, "r"))
   195                 else:
   195                 else:
   196                     repo.ui.debug(_("local modified %s, keeping\n") % f)
   196                     repo.ui.debug(_("local modified %s, keeping\n") % f)
   197             else:
   197             else:
   198                 repo.ui.debug(_("working dir created %s, keeping\n") % f)
   198                 repo.ui.debug(_("working dir created %s, keeping\n") % f)
   199 
   199 
   205             if not overwrite:
   205             if not overwrite:
   206                 r = repo.ui.prompt(
   206                 r = repo.ui.prompt(
   207                     (_("remote changed %s which local deleted\n") % f) +
   207                     (_("remote changed %s which local deleted\n") % f) +
   208                      _("(k)eep or (d)elete?"), _("[kd]"), _("k"))
   208                      _("(k)eep or (d)elete?"), _("[kd]"), _("k"))
   209             if r == _("k"):
   209             if r == _("k"):
   210                 action.append((f, m2.execf(f), n, None))
   210                 action.append((f, "g", m2.execf(f), n))
   211         elif f not in ma:
   211         elif f not in ma:
   212             repo.ui.debug(_("remote created %s\n") % f)
   212             repo.ui.debug(_("remote created %s\n") % f)
   213             action.append((f, m2.execf(f), n, None))
   213             action.append((f, "g", m2.execf(f), n))
   214         else:
   214         else:
   215             if overwrite or backwards:
   215             if overwrite or backwards:
   216                 repo.ui.debug(_("local deleted %s, recreating\n") % f)
   216                 repo.ui.debug(_("local deleted %s, recreating\n") % f)
   217                 action.append((f, m2.execf(f), n, None))
   217                 action.append((f, "g", m2.execf(f), n))
   218             else:
   218             else:
   219                 repo.ui.debug(_("local deleted %s\n") % f)
   219                 repo.ui.debug(_("local deleted %s\n") % f)
   220 
   220 
   221     del m1, m2, ma
   221     del m1, m2, ma
   222 
   222 
   235 
   235 
   236     # update files
   236     # update files
   237     updated, merged, removed, unresolved = 0, 0, 0, 0
   237     updated, merged, removed, unresolved = 0, 0, 0, 0
   238     action.sort()
   238     action.sort()
   239     for a in action:
   239     for a in action:
   240         f, flag, my, other = a
   240         f, m = a[:2]
   241         if f[0] == "/":
   241         if f[0] == "/":
   242             continue
   242             continue
   243         if not my:
   243         if m == "r": # remove
   244             repo.ui.note(_("removing %s\n") % f)
   244             repo.ui.note(_("removing %s\n") % f)
   245             util.audit_path(f)
   245             util.audit_path(f)
   246             try:
   246             try:
   247                 util.unlink(repo.wjoin(f))
   247                 util.unlink(repo.wjoin(f))
   248             except OSError, inst:
   248             except OSError, inst:
   249                 if inst.errno != errno.ENOENT:
   249                 if inst.errno != errno.ENOENT:
   250                     repo.ui.warn(_("update failed to remove %s: %s!\n") %
   250                     repo.ui.warn(_("update failed to remove %s: %s!\n") %
   251                                  (f, inst.strerror))
   251                                  (f, inst.strerror))
   252             removed +=1
   252             removed +=1
   253         elif other:
   253         elif m == "m": # merge
       
   254             flag, my, other = a[2:]
   254             repo.ui.status(_("merging %s\n") % f)
   255             repo.ui.status(_("merging %s\n") % f)
   255             if merge3(repo, f, my, other, xp1, xp2):
   256             if merge3(repo, f, my, other, xp1, xp2):
   256                 unresolved += 1
   257                 unresolved += 1
   257             util.set_exec(repo.wjoin(f), flag)
   258             util.set_exec(repo.wjoin(f), flag)
   258             merged += 1
   259             merged += 1
   259         else:
   260         elif m == "g": # get
       
   261             flag, node = a[2:]
   260             repo.ui.note(_("getting %s\n") % f)
   262             repo.ui.note(_("getting %s\n") % f)
   261             t = repo.file(f).read(my)
   263             t = repo.file(f).read(node)
   262             repo.wwrite(f, t)
   264             repo.wwrite(f, t)
   263             util.set_exec(repo.wjoin(f), flag)
   265             util.set_exec(repo.wjoin(f), flag)
   264             updated += 1
   266             updated += 1
   265 
   267 
   266     # update dirstate
   268     # update dirstate
   267     if not partial:
   269     if not partial:
   268         repo.dirstate.setparents(p1, p2)
   270         repo.dirstate.setparents(p1, p2)
   269         repo.dirstate.forget(forget)
   271         repo.dirstate.forget(forget)
   270         for a in action:
   272         for a in action:
   271             f, flag, my, other = a
   273             f, m = a[:2]
   272             if not my:
   274             if m == "r": # remove
   273                 if branchmerge:
   275                 if branchmerge:
   274                     repo.dirstate.update([f], 'r')
   276                     repo.dirstate.update([f], 'r')
   275                 else:
   277                 else:
   276                     repo.dirstate.forget([f])
   278                     repo.dirstate.forget([f])
   277             elif not other:
   279             elif m == "g": # get
   278                 if branchmerge:
   280                 if branchmerge:
   279                     repo.dirstate.update([f], 'n', st_mtime=-1)
   281                     repo.dirstate.update([f], 'n', st_mtime=-1)
   280                 else:
   282                 else:
   281                     repo.dirstate.update([f], 'n')
   283                     repo.dirstate.update([f], 'n')
   282             else:
   284             elif m == "m": # merge
       
   285                 flag, my, other = a[2:]
   283                 if branchmerge:
   286                 if branchmerge:
   284                     # We've done a branch merge, mark this file as merged
   287                     # We've done a branch merge, mark this file as merged
   285                     # so that we properly record the merger later
   288                     # so that we properly record the merger later
   286                     repo.dirstate.update([f], 'm')
   289                     repo.dirstate.update([f], 'm')
   287                 else:
   290                 else: