mercurial/merge.py
changeset 3101 87ea5a71f7b9
parent 3097 1b738357bba9
child 3102 36b08cd92fb7
equal deleted inserted replaced
3097:1b738357bba9 3101:87ea5a71f7b9
   105     repo.ui.debug(_(" overwrite %s branchmerge %s partial %s linear %s\n") %
   105     repo.ui.debug(_(" overwrite %s branchmerge %s partial %s linear %s\n") %
   106                   (overwrite, branchmerge, bool(partial), linear_path))
   106                   (overwrite, branchmerge, bool(partial), linear_path))
   107     repo.ui.debug(_(" ancestor %s local %s remote %s\n") %
   107     repo.ui.debug(_(" ancestor %s local %s remote %s\n") %
   108                   (short(p1), short(p2), short(pa)))
   108                   (short(p1), short(p2), short(pa)))
   109 
   109 
   110     action = {}
   110     action = []
   111     forget = []
   111     forget = []
   112 
   112 
   113     # update m1 from working dir
   113     # update m1 from working dir
   114     umap = dict.fromkeys(unknown)
   114     umap = dict.fromkeys(unknown)
   115 
   115 
   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[f] = (fmerge(f, m1, m2, ma), n[:20], m2[f])
   149                     action.append((f, 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[f] = (m2.execf(f), m2[f], None)
   156                     action.append((f, m2.execf(f), m2[f], None))
   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[f] = (m2.execf(f), m2[f], None)
   161                 action.append((f, m2.execf(f), m2[f], None))
   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[f] = (None, None, None)
   182                     action.append((f, None, None, None))
   183             else:
   183             else:
   184                 repo.ui.debug(_("other deleted %s\n") % f)
   184                 repo.ui.debug(_("other deleted %s\n") % f)
   185                 action[f] = (None, None, None)
   185                 action.append((f, None, None, None))
   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[f] = (None, None, None)
   190                 action.append((f, None, None, None))
   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[f] = (None, None, None)
   194                     action.append((f, None, None, None))
   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[f] = (m2.execf(f), n, None)
   210                 action.append((f, m2.execf(f), n, None))
   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[f] = (m2.execf(f), n, None)
   213             action.append((f, m2.execf(f), n, None))
   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[f] = (m2.execf(f), n, None)
   217                 action.append((f, m2.execf(f), n, None))
   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 
   233 
   233 
   234     repo.hook('preupdate', throw=True, parent1=xp1, parent2=xxp2)
   234     repo.hook('preupdate', throw=True, parent1=xp1, parent2=xxp2)
   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     files = action.keys()
   238     action.sort()
   239     files.sort()
   239     for a in action:
   240     for f in files:
   240         f, flag, my, other = a
   241         flag, my, other = action[f]
       
   242         if f[0] == "/":
   241         if f[0] == "/":
   243             continue
   242             continue
   244         if not my:
   243         if not my:
   245             repo.ui.note(_("removing %s\n") % f)
   244             repo.ui.note(_("removing %s\n") % f)
   246             util.audit_path(f)
   245             util.audit_path(f)
   266 
   265 
   267     # update dirstate
   266     # update dirstate
   268     if not partial:
   267     if not partial:
   269         repo.dirstate.setparents(p1, p2)
   268         repo.dirstate.setparents(p1, p2)
   270         repo.dirstate.forget(forget)
   269         repo.dirstate.forget(forget)
   271         files = action.keys()
   270         for a in action:
   272         files.sort()
   271             f, flag, my, other = a
   273         for f in files:
       
   274             flag, my, other = action[f]
       
   275             if not my:
   272             if not my:
   276                 if branchmerge:
   273                 if branchmerge:
   277                     repo.dirstate.update([f], 'r')
   274                     repo.dirstate.update([f], 'r')
   278                 else:
   275                 else:
   279                     repo.dirstate.forget([f])
   276                     repo.dirstate.forget([f])