commitextras: work nicely with other extensions
Before this change, it doesn't add these extra fields when loaded
alongside another extension that does a bunch of things, including
wrapping commit.
I did not investigate exactly why, but
- the documentation of extensions.wrapfunction says to use subclassing
to play nicely with other extensions
- using subclassing does make commitextras work when loaded alongside
my other extension
Differential Revision: https://phab.mercurial-scm.org/D4404
--- a/hgext/commitextras.py Sat Aug 25 11:20:13 2018 +0200
+++ b/hgext/commitextras.py Mon Aug 27 16:01:55 2018 -0400
@@ -17,6 +17,7 @@
error,
extensions,
registrar,
+ util,
)
cmdtable = {}
@@ -43,9 +44,10 @@
_('set a changeset\'s extra values'), _("KEY=VALUE")))
def _commit(orig, ui, repo, *pats, **opts):
- origcommit = repo.commit
- try:
- def _wrappedcommit(*innerpats, **inneropts):
+ if util.safehasattr(repo, 'unfiltered'):
+ repo = repo.unfiltered()
+ class repoextra(repo.__class__):
+ def commit(self, *innerpats, **inneropts):
extras = opts.get(r'extra')
if extras:
for raw in extras:
@@ -66,11 +68,6 @@
"manually")
raise error.Abort(msg % k)
inneropts[r'extra'][k] = v
- return origcommit(*innerpats, **inneropts)
-
- # This __dict__ logic is needed because the normal
- # extension.wrapfunction doesn't seem to work.
- repo.__dict__[r'commit'] = _wrappedcommit
- return orig(ui, repo, *pats, **opts)
- finally:
- del repo.__dict__[r'commit']
+ return super(repoextra, self).commit(*innerpats, **inneropts)
+ repo.__class__ = repoextra
+ return orig(ui, repo, *pats, **opts)