changeset 23584:db03ed8cbfa3

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.
author Augie Fackler <augie@google.com>
date Mon, 15 Dec 2014 15:00:54 -0500
parents a8edcb9c1199
children 94b25d71dd0f
files mercurial/context.py tests/test-commit.t
diffstat 2 files changed, 69 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- 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]