D550: metadataonlyctx: don't crash when reusing the manifest with deletions

quark (Jun Wu) phabricator at mercurial-scm.org
Tue Aug 29 00:49:15 UTC 2017


quark created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.

REVISION SUMMARY
  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.

REPOSITORY
  rHG Mercurial

REVISION DETAIL
  https://phab.mercurial-scm.org/D550

AFFECTED FILES
  mercurial/context.py
  tests/test-context-metadata.t

CHANGE DETAILS

diff --git a/tests/test-context-metadata.t b/tests/test-context-metadata.t
new file mode 100644
--- /dev/null
+++ b/tests/test-context-metadata.t
@@ -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 at example.com>'
+  $ hg log -r tip
+  changeset:   4:1f86eaeca92b
+  tag:         tip
+  parent:      1:3afb7afe6632
+  user:        foo <foo at example.com>
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     Remove A
+  
diff --git a/mercurial/context.py b/mercurial/context.py
--- a/mercurial/context.py
+++ b/mercurial/context.py
@@ -2378,7 +2378,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)



To: quark, #hg-reviewers
Cc: mercurial-devel


More information about the Mercurial-devel mailing list