metadataonlyctx: don't crash when reusing the manifest with deletions
This was originally fixed by Mateusz Kwapich for the `metaedit` command in
fb-hgext with a test for the `metaedit` command. It didn't get upstreamed
because `metaedit` was not in core.
This patch fixes the crash and adds a test about `metadataonlyctx` to
avoid future regressions.
Differential Revision: https://phab.mercurial-scm.org/D550
--- a/mercurial/context.py Mon Aug 28 16:49:41 2017 -0700
+++ b/mercurial/context.py Mon Aug 28 16:58:59 2017 -0700
@@ -2371,7 +2371,7 @@
for f in self._files:
if not managing(f):
added.append(f)
- elif self[f]:
+ elif f in self:
modified.append(f)
else:
removed.append(f)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-context-metadata.t Mon Aug 28 16:58:59 2017 -0700
@@ -0,0 +1,50 @@
+Tests about metadataonlyctx
+
+ $ hg init
+ $ echo A > A
+ $ hg commit -A A -m 'Add A'
+ $ echo B > B
+ $ hg commit -A B -m 'Add B'
+ $ hg rm A
+ $ echo C > C
+ $ echo B2 > B
+ $ hg add C -q
+ $ hg commit -m 'Remove A'
+
+ $ cat > metaedit.py <<EOF
+ > from __future__ import absolute_import
+ > from mercurial import context, registrar
+ > cmdtable = {}
+ > command = registrar.command(cmdtable)
+ > @command('metaedit')
+ > def metaedit(ui, repo, arg):
+ > # Modify commit message to "FOO"
+ > with repo.wlock(), repo.lock(), repo.transaction('metaedit'):
+ > old = repo['.']
+ > kwargs = dict(s.split('=', 1) for s in arg.split(';'))
+ > if 'parents' in kwargs:
+ > kwargs['parents'] = kwargs['parents'].split(',')
+ > new = context.metadataonlyctx(repo, old, **kwargs)
+ > new.commit()
+ > EOF
+ $ hg --config extensions.metaedit=$TESTTMP/metaedit.py metaedit 'text=Changed'
+ $ hg log -r tip
+ changeset: 3:ad83e9e00ec9
+ tag: tip
+ parent: 1:3afb7afe6632
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: Changed
+
+ $ hg --config extensions.metaedit=$TESTTMP/metaedit.py metaedit 'parents=0' 2>&1 | egrep '^\S*Error'
+ RuntimeError: can't reuse the manifest: its p1 doesn't match the new ctx p1
+
+ $ hg --config extensions.metaedit=$TESTTMP/metaedit.py metaedit 'user=foo <foo@example.com>'
+ $ hg log -r tip
+ changeset: 4:1f86eaeca92b
+ tag: tip
+ parent: 1:3afb7afe6632
+ user: foo <foo@example.com>
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: Remove A
+