diff --git a/mercurial/context.py b/mercurial/context.py --- a/mercurial/context.py +++ b/mercurial/context.py @@ -14,8 +14,10 @@ import stat from .i18n import _ from .node import ( + addednodeid, bin, hex, + modifiednodeid, newnodeid, nullid, nullrev, @@ -1232,23 +1234,13 @@ class committablectx(basectx): """ parents = self.parents() - man1 = parents[0].manifest() - man = man1.copy() - if len(parents) > 1: - man2 = self.p2().manifest() - def getman(f): - if f in man1: - return man1 - return man2 - else: - getman = lambda f: man1 + man = parents[0].manifest().copy() - copied = self._repo.dirstate.copies() ff = self._flagfunc - for i, l in (("a", self._status.added), ("m", self._status.modified)): + for i, l in ((addednodeid, self._status.added), + (modifiednodeid, self._status.modified)): for f in l: - orig = copied.get(f, f) - man[f] = getman(orig).get(orig, nullid) + i + man[f] = i try: man.setflag(f, ff(f)) except OSError: diff --git a/mercurial/copies.py b/mercurial/copies.py --- a/mercurial/copies.py +++ b/mercurial/copies.py @@ -278,7 +278,7 @@ def _makegetfctx(ctx): ac = repo.changelog.ancestors(revs, inclusive=True) ctx._ancestrycontext = ac def makectx(f, n): - if len(n) != 20 or n in node.wdirnodes: # in a working context? + if n in node.wdirnodes: # in a working context? if ctx.rev() is None: return ctx.filectx(f) return repo[None][f] diff --git a/mercurial/merge.py b/mercurial/merge.py --- a/mercurial/merge.py +++ b/mercurial/merge.py @@ -15,6 +15,7 @@ import struct from .i18n import _ from .node import ( + addednodeid, bin, hex, nullhex, @@ -873,7 +874,7 @@ def manifestmerge(repo, wctx, p2, pa, br else: actions[f] = ('cd', (f, None, f, False, pa.node()), "prompt changed/deleted") - elif n1[20:] == 'a': + elif n1 == addednodeid: # This extra 'a' is added by working copy manifest to mark # the file as locally added. We should forget it instead of # deleting it. diff --git a/mercurial/node.py b/mercurial/node.py --- a/mercurial/node.py +++ b/mercurial/node.py @@ -20,8 +20,10 @@ nullhex = hex(nullid) # Phony node value to stand-in for new files in some uses of # manifests. newnodeid = '!' * 20 +addednodeid = ('0' * 15) + 'added' +modifiednodeid = ('0' * 12) + 'modified' -wdirnodes = set((newnodeid,)) +wdirnodes = set((newnodeid, addednodeid, modifiednodeid)) # pseudo identifiers for working directory # (they are experimental, so don't add too many dependencies on them)