Mercurial > hg-stable
diff hgext/commitextras.py @ 39321:1cb7c9777852
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
author | Valentin Gatien-Baron <vgatien-baron@janestreet.com> |
---|---|
date | Mon, 27 Aug 2018 16:01:55 -0400 |
parents | 75c76cee1b1b |
children | 3a60416c4fd8 |
line wrap: on
line diff
--- 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)