commitextras: work nicely with other extensions
authorValentin Gatien-Baron <vgatien-baron@janestreet.com>
Mon, 27 Aug 2018 16:01:55 -0400
changeset 39294 1cb7c9777852
parent 39293 278eb4541758
child 39295 3a60416c4fd8
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
hgext/commitextras.py
--- 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)