comparison 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
comparison
equal deleted inserted replaced
39320:278eb4541758 39321:1cb7c9777852
15 from mercurial import ( 15 from mercurial import (
16 commands, 16 commands,
17 error, 17 error,
18 extensions, 18 extensions,
19 registrar, 19 registrar,
20 util,
20 ) 21 )
21 22
22 cmdtable = {} 23 cmdtable = {}
23 command = registrar.command(cmdtable) 24 command = registrar.command(cmdtable)
24 testedwith = 'ships-with-hg-core' 25 testedwith = 'ships-with-hg-core'
41 options = entry[1] 42 options = entry[1]
42 options.append(('', 'extra', [], 43 options.append(('', 'extra', [],
43 _('set a changeset\'s extra values'), _("KEY=VALUE"))) 44 _('set a changeset\'s extra values'), _("KEY=VALUE")))
44 45
45 def _commit(orig, ui, repo, *pats, **opts): 46 def _commit(orig, ui, repo, *pats, **opts):
46 origcommit = repo.commit 47 if util.safehasattr(repo, 'unfiltered'):
47 try: 48 repo = repo.unfiltered()
48 def _wrappedcommit(*innerpats, **inneropts): 49 class repoextra(repo.__class__):
50 def commit(self, *innerpats, **inneropts):
49 extras = opts.get(r'extra') 51 extras = opts.get(r'extra')
50 if extras: 52 if extras:
51 for raw in extras: 53 for raw in extras:
52 if '=' not in raw: 54 if '=' not in raw:
53 msg = _("unable to parse '%s', should follow " 55 msg = _("unable to parse '%s', should follow "
64 if k in usedinternally: 66 if k in usedinternally:
65 msg = _("key '%s' is used internally, can't be set " 67 msg = _("key '%s' is used internally, can't be set "
66 "manually") 68 "manually")
67 raise error.Abort(msg % k) 69 raise error.Abort(msg % k)
68 inneropts[r'extra'][k] = v 70 inneropts[r'extra'][k] = v
69 return origcommit(*innerpats, **inneropts) 71 return super(repoextra, self).commit(*innerpats, **inneropts)
70 72 repo.__class__ = repoextra
71 # This __dict__ logic is needed because the normal 73 return orig(ui, repo, *pats, **opts)
72 # extension.wrapfunction doesn't seem to work.
73 repo.__dict__[r'commit'] = _wrappedcommit
74 return orig(ui, repo, *pats, **opts)
75 finally:
76 del repo.__dict__[r'commit']