memctx: fix manifest for removed files (
issue4470)
filectxfn returns None for removed files, so we have to check for None
before computing the new file content hash for the manifest.
Includes a test that proves this works, by demonstrating that we can
show the diff of an amended commit in the committemplate.
--- a/mercurial/context.py Fri Dec 12 15:53:17 2014 -0500
+++ b/mercurial/context.py Mon Dec 15 15:00:54 2014 -0500
@@ -1625,9 +1625,10 @@
# keep this simple for now; just worry about p1
pctx = self._parents[0]
+ pman = pctx.manifest()
man = pctx.manifest().copy()
- for f, fnode in man.iteritems():
+ for f, fnode in pman.iteritems():
p1node = nullid
p2node = nullid
p = pctx[f].parents() # if file isn't in pctx, check p2?
@@ -1635,7 +1636,12 @@
p1node = p[0].node()
if len(p) > 1:
p2node = p[1].node()
- man[f] = revlog.hash(self[f].data(), p1node, p2node)
+ fctx = self[f]
+ if fctx is None:
+ # removed file
+ del man[f]
+ else:
+ man[f] = revlog.hash(fctx.data(), p1node, p2node)
return man
--- a/tests/test-commit.t Fri Dec 12 15:53:17 2014 -0500
+++ b/tests/test-commit.t Mon Dec 15 15:00:54 2014 -0500
@@ -429,6 +429,67 @@
abort: empty commit message
[255]
+prove that we can show a diff of an amend using committemplate:
+
+ $ hg init issue4470
+ $ cd issue4470
+ $ cat >> .hg/hgrc <<EOF
+ > [committemplate]
+ > changeset = {desc}\n\n
+ > HG: {extramsg}
+ > HG: user: {author}\n{ifeq(p2rev, "-1", "",
+ > "HG: branch merge\n")
+ > }HG: branch '{branch}'\n{if(currentbookmark,
+ > "HG: bookmark '{currentbookmark}'\n") }{subrepos %
+ > "HG: subrepo {subrepo}\n" }
+ > {splitlines(diff()) % 'HG: {line}\n'}
+ > EOF
+ $ echo a > a
+ $ echo b > b
+ $ hg addr
+ adding a
+ adding b
+ $ hg ci -m 'init'
+ $ hg rm b
+ $ hg ci -m 'rm b'
+ $ hg export .
+ # HG changeset patch
+ # User test
+ # Date 0 0
+ # Thu Jan 01 00:00:00 1970 +0000
+ # Node ID 88d0ffa85e7a92ccc7c9cc187f9b17858bd206a7
+ # Parent 9118d25c26b1ca5cab5683b02100e7eb2c0d9471
+ rm b
+
+ diff -r 9118d25c26b1 -r 88d0ffa85e7a b
+ --- a/b Thu Jan 01 00:00:00 1970 +0000
+ +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
+ @@ -1,1 +0,0 @@
+ -b
+ $ echo a >> a
+ $ HGEDITOR=cat hg commit --amend
+ rm b
+
+
+ HG: Leave message empty to abort commit.
+ HG: user: test
+ HG: branch 'default'
+
+ HG: diff -r 9118d25c26b1 a
+ HG: --- a/a Thu Jan 01 00:00:00 1970 +0000
+ HG: +++ b/a Thu Jan 01 00:00:00 1970 +0000
+ HG: @@ -1,1 +1,2 @@
+ HG: a
+ HG: +a
+ HG: diff -r 9118d25c26b1 b
+ HG: --- a/b Thu Jan 01 00:00:00 1970 +0000
+ HG: +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
+ HG: @@ -1,1 +0,0 @@
+ HG: -b
+ saved backup bundle to $TESTTMP/*/*-amend-backup.hg (glob)
+ $ cd ..
+
+cleanup
$ cat >> .hg/hgrc <<EOF
> # disable customizing for subsequent tests
> [committemplate]