mercurial/merge.py
changeset 3218 8d4855fd9d7b
parent 3212 cac7be0b9b99
child 3247 7a0d70b69d74
equal deleted inserted replaced
3217:6d98149d70fe 3218:8d4855fd9d7b
    57 
    57 
    58     os.unlink(b)
    58     os.unlink(b)
    59     os.unlink(c)
    59     os.unlink(c)
    60     return r
    60     return r
    61 
    61 
    62 def checkunknown(repo, m2, status):
    62 def checkunknown(repo, m2, wctx):
    63     """
    63     """
    64     check for collisions between unknown files and files in m2
    64     check for collisions between unknown files and files in m2
    65     """
    65     """
    66     modified, added, removed, deleted, unknown = status[:5]
    66     for f in wctx.unknown():
    67     for f in unknown:
       
    68         if f in m2:
    67         if f in m2:
    69             if repo.file(f).cmp(m2[f], repo.wread(f)):
    68             if repo.file(f).cmp(m2[f], repo.wread(f)):
    70                 raise util.Abort(_("'%s' already exists in the working"
    69                 raise util.Abort(_("'%s' already exists in the working"
    71                                    " dir and differs from remote") % f)
    70                                    " dir and differs from remote") % f)
    72 
    71 
    73 def workingmanifest(repo, man, status):
    72 def forgetremoved(m2, wctx):
    74     """
       
    75     Update manifest to correspond to the working directory
       
    76     """
       
    77 
       
    78     copied = repo.dirstate.copies()
       
    79     modified, added, removed, deleted, unknown = status[:5]
       
    80     for i,l in (("a", added), ("m", modified), ("u", unknown)):
       
    81         for f in l:
       
    82             man[f] = man.get(copied.get(f, f), nullid) + i
       
    83             man.set(f, util.is_exec(repo.wjoin(f), man.execf(f)))
       
    84 
       
    85     for f in deleted + removed:
       
    86         del man[f]
       
    87 
       
    88     return man
       
    89 
       
    90 def forgetremoved(m2, status):
       
    91     """
    73     """
    92     Forget removed files
    74     Forget removed files
    93 
    75 
    94     If we're jumping between revisions (as opposed to merging), and if
    76     If we're jumping between revisions (as opposed to merging), and if
    95     neither the working directory nor the target rev has the file,
    77     neither the working directory nor the target rev has the file,
    96     then we need to remove it from the dirstate, to prevent the
    78     then we need to remove it from the dirstate, to prevent the
    97     dirstate from listing the file when it is no longer in the
    79     dirstate from listing the file when it is no longer in the
    98     manifest.
    80     manifest.
    99     """
    81     """
   100 
    82 
   101     modified, added, removed, deleted, unknown = status[:5]
       
   102     action = []
    83     action = []
   103 
    84 
   104     for f in deleted + removed:
    85     for f in wctx.deleted() + wctx.removed():
   105         if f not in m2:
    86         if f not in m2:
   106             action.append((f, "f"))
    87             action.append((f, "f"))
   107 
    88 
   108     return action
    89     return action
   109 
    90 
   330     if not wlock:
   311     if not wlock:
   331         wlock = repo.wlock()
   312         wlock = repo.wlock()
   332 
   313 
   333     ### check phase
   314     ### check phase
   334 
   315 
   335     pl = repo.parents()
   316     wc = repo.workingctx()
       
   317     pl = wc.parents()
   336     if not overwrite and len(pl) > 1:
   318     if not overwrite and len(pl) > 1:
   337         raise util.Abort(_("outstanding uncommitted merges"))
   319         raise util.Abort(_("outstanding uncommitted merges"))
   338 
   320 
   339     p1, p2 = pl[0], repo.changectx(node)
   321     p1, p2 = pl[0], repo.changectx(node)
   340     pa = p1.ancestor(p2)
   322     pa = p1.ancestor(p2)
   349                                "'hg update' or look at 'hg heads'"))
   331                                "'hg update' or look at 'hg heads'"))
   350     elif not (overwrite or branchmerge):
   332     elif not (overwrite or branchmerge):
   351         raise util.Abort(_("update spans branches, use 'hg merge' "
   333         raise util.Abort(_("update spans branches, use 'hg merge' "
   352                            "or 'hg update -C' to lose changes"))
   334                            "or 'hg update -C' to lose changes"))
   353 
   335 
   354     status = repo.status()
       
   355     modified, added, removed, deleted, unknown = status[:5]
       
   356     if branchmerge and not forcemerge:
   336     if branchmerge and not forcemerge:
   357         if modified or added or removed:
   337         if wc.modified() or wc.added() or wc.removed():
   358             raise util.Abort(_("outstanding uncommitted changes"))
   338             raise util.Abort(_("outstanding uncommitted changes"))
   359 
   339 
   360     m1 = p1.manifest().copy()
   340     m1 = wc.manifest().copy()
   361     m2 = p2.manifest().copy()
   341     m2 = p2.manifest().copy()
   362     ma = pa.manifest()
   342     ma = pa.manifest()
   363 
   343 
   364     # resolve the manifest to determine which files
   344     # resolve the manifest to determine which files
   365     # we care about merging
   345     # we care about merging
   369     repo.ui.debug(_(" ancestor %s local %s remote %s\n") % (p1, p2, pa))
   349     repo.ui.debug(_(" ancestor %s local %s remote %s\n") % (p1, p2, pa))
   370 
   350 
   371     action = []
   351     action = []
   372     copy = {}
   352     copy = {}
   373 
   353 
   374     m1 = workingmanifest(repo, m1, status)
       
   375     filtermanifest(m1, partial)
   354     filtermanifest(m1, partial)
   376     filtermanifest(m2, partial)
   355     filtermanifest(m2, partial)
   377 
   356 
   378     if not force:
   357     if not force:
   379         checkunknown(repo, m2, status)
   358         checkunknown(repo, m2, wc)
   380     if not branchmerge:
   359     if not branchmerge:
   381         action += forgetremoved(m2, status)
   360         action += forgetremoved(m2, wc)
   382     if not (backwards or overwrite):
   361     if not (backwards or overwrite):
   383         copy = findcopies(repo, m1, m2, pa.rev())
   362         copy = findcopies(repo, m1, m2, pa.rev())
   384 
   363 
   385     action += manifestmerge(repo.ui, m1, m2, ma, overwrite, backwards)
   364     action += manifestmerge(repo.ui, m1, m2, ma, overwrite, backwards)
   386     del m1, m2, ma
   365     del m1, m2, ma