diff --git a/hgext/commitextras.py b/hgext/commitextras.py --- a/hgext/commitextras.py +++ b/hgext/commitextras.py @@ -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)