mercurial/merge.py
changeset 2849 19b3bc840182
parent 2848 e78cad1f6b1f
child 2850 b11c014dcbd9
equal deleted inserted replaced
2848:e78cad1f6b1f 2849:19b3bc840182
   155                     repo.ui.debug(_(" %s versions differ, resolve\n") % f)
   155                     repo.ui.debug(_(" %s versions differ, resolve\n") % f)
   156                     # merge executable bits
   156                     # merge executable bits
   157                     # "if we changed or they changed, change in merge"
   157                     # "if we changed or they changed, change in merge"
   158                     a, b, c = mfa.execf(f), mfw.execf(f), mf2.execf(f)
   158                     a, b, c = mfa.execf(f), mfw.execf(f), mf2.execf(f)
   159                     mode = ((a^b) | (a^c)) ^ a
   159                     mode = ((a^b) | (a^c)) ^ a
   160                     merge[f] = (m1.get(f, nullid), m2[f], mode)
   160                     merge[f] = (mode, m1.get(f, nullid), m2[f])
   161                     s = 1
   161                     s = 1
   162                 # are we clobbering?
   162                 # are we clobbering?
   163                 # is remote's version newer?
   163                 # is remote's version newer?
   164                 # or are we going back in time?
   164                 # or are we going back in time?
   165                 elif overwrite or m2[f] != a or (p2 == pa and mw[f] == m1[f]):
   165                 elif overwrite or m2[f] != a or (p2 == pa and mw[f] == m1[f]):
   166                     repo.ui.debug(_(" remote %s is newer, get\n") % f)
   166                     repo.ui.debug(_(" remote %s is newer, get\n") % f)
   167                     get[f] = m2[f]
   167                     get[f] = (m2.execf(f), m2[f])
   168                     s = 1
   168                     s = 1
   169             elif f in umap or f in added:
   169             elif f in umap or f in added:
   170                 # this unknown file is the same as the checkout
   170                 # this unknown file is the same as the checkout
   171                 # we need to reset the dirstate if the file was added
   171                 # we need to reset the dirstate if the file was added
   172                 get[f] = m2[f]
   172                 get[f] = (m2.execf(f), m2[f])
   173 
   173 
   174             if not s and mfw.execf(f) != mf2.execf(f):
   174             if not s and mfw.execf(f) != mf2.execf(f):
   175                 if overwrite:
   175                 if overwrite:
   176                     repo.ui.debug(_(" updating permissions for %s\n") % f)
   176                     repo.ui.debug(_(" updating permissions for %s\n") % f)
   177                     util.set_exec(repo.wjoin(f), mf2.execf(f))
   177                     util.set_exec(repo.wjoin(f), mf2.execf(f))
   219             if not overwrite and (linear_path or branchmerge):
   219             if not overwrite and (linear_path or branchmerge):
   220                 r = repo.ui.prompt(
   220                 r = repo.ui.prompt(
   221                     (_("remote changed %s which local deleted\n") % f) +
   221                     (_("remote changed %s which local deleted\n") % f) +
   222                      _("(k)eep or (d)elete?"), _("[kd]"), _("k"))
   222                      _("(k)eep or (d)elete?"), _("[kd]"), _("k"))
   223             if r == _("k"):
   223             if r == _("k"):
   224                 get[f] = n
   224                 get[f] = (m2.execf(f), n)
   225         elif f not in ma:
   225         elif f not in ma:
   226             repo.ui.debug(_("remote created %s\n") % f)
   226             repo.ui.debug(_("remote created %s\n") % f)
   227             get[f] = n
   227             get[f] = (m2.execf(f), n)
   228         else:
   228         else:
   229             if overwrite or p2 == pa: # going backwards?
   229             if overwrite or p2 == pa: # going backwards?
   230                 repo.ui.debug(_("local deleted %s, recreating\n") % f)
   230                 repo.ui.debug(_("local deleted %s, recreating\n") % f)
   231                 get[f] = n
   231                 get[f] = (m2.execf(f), n)
   232             else:
   232             else:
   233                 repo.ui.debug(_("local deleted %s\n") % f)
   233                 repo.ui.debug(_("local deleted %s\n") % f)
   234 
   234 
   235     del mw, m1, m2, ma
   235     del mw, m1, m2, ma
   236 
   236 
   237     if overwrite:
   237     if overwrite:
   238         for f in merge:
   238         for f in merge:
   239             get[f] = merge[f][1]
   239             get[f] = merge[f][:2]
   240         merge = {}
   240         merge = {}
   241 
   241 
   242     if linear_path or overwrite:
   242     if linear_path or overwrite:
   243         # we don't need to do any magic, just jump to the new rev
   243         # we don't need to do any magic, just jump to the new rev
   244         p1, p2 = p2, nullid
   244         p1, p2 = p2, nullid
   252 
   252 
   253     # get the files we don't need to change
   253     # get the files we don't need to change
   254     files = get.keys()
   254     files = get.keys()
   255     files.sort()
   255     files.sort()
   256     for f in files:
   256     for f in files:
       
   257         flag, node = get[f]
   257         if f[0] == "/":
   258         if f[0] == "/":
   258             continue
   259             continue
   259         repo.ui.note(_("getting %s\n") % f)
   260         repo.ui.note(_("getting %s\n") % f)
   260         t = repo.file(f).read(get[f])
   261         t = repo.file(f).read(node)
   261         repo.wwrite(f, t)
   262         repo.wwrite(f, t)
   262         util.set_exec(repo.wjoin(f), mf2.execf(f))
   263         util.set_exec(repo.wjoin(f), flag)
   263         if not partial:
   264         if not partial:
   264             if branchmerge:
   265             if branchmerge:
   265                 repo.dirstate.update([f], 'n', st_mtime=-1)
   266                 repo.dirstate.update([f], 'n', st_mtime=-1)
   266             else:
   267             else:
   267                 repo.dirstate.update([f], 'n')
   268                 repo.dirstate.update([f], 'n')
   270     unresolved = []
   271     unresolved = []
   271     files = merge.keys()
   272     files = merge.keys()
   272     files.sort()
   273     files.sort()
   273     for f in files:
   274     for f in files:
   274         repo.ui.status(_("merging %s\n") % f)
   275         repo.ui.status(_("merging %s\n") % f)
   275         my, other, flag = merge[f]
   276         flag, my, other = merge[f]
   276         ret = merge3(repo, f, my, other, xp1, xp2)
   277         ret = merge3(repo, f, my, other, xp1, xp2)
   277         if ret:
   278         if ret:
   278             unresolved.append(f)
   279             unresolved.append(f)
   279         util.set_exec(repo.wjoin(f), flag)
   280         util.set_exec(repo.wjoin(f), flag)
   280         if not partial:
   281         if not partial: