##// END OF EJS Templates
memfilectx: make changectx argument mandatory in constructor (API)...
memfilectx: make changectx argument mandatory in constructor (API) committablefilectx has three subclasses: workingfilectx, memfilectx, and overlayfilectx. committablefilectx takes an optional (change) ctx instance to its constructor. If it's provided, it's set on the instance as self._changectx. If not, that property is supposed to be defined by the class. However, only workingfilectx does that. The other two will have the property undefined if it's not passed in the constructor. That seems bad to me. This patch makes the changectx argument to the memfilectx constructor mandatory because that fixes the failure I ran into. It seems like we should also fix the overlayfilectx case. Differential Revision: https://phab.mercurial-scm.org/D1658

File last commit:

r34976:901a18b0 default
r35401:8a0cac20 default
Show More
commitextras.py
76 lines | 2.3 KiB | text/x-python | PythonLexer
# commitextras.py
#
# Copyright 2013 Facebook, Inc.
#
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.
'''adds a new flag extras to commit (ADVANCED)'''
from __future__ import absolute_import
import re
from mercurial.i18n import _
from mercurial import (
commands,
error,
extensions,
registrar,
)
cmdtable = {}
command = registrar.command(cmdtable)
testedwith = 'ships-with-hg-core'
usedinternally = {
'amend_source',
'branch',
'close',
'histedit_source',
'topic',
'rebase_source',
'intermediate-source',
'__touch-noise__',
'source',
'transplant_source',
}
def extsetup(ui):
entry = extensions.wrapcommand(commands.table, 'commit', _commit)
options = entry[1]
options.append(('', 'extra', [],
_('set a changeset\'s extra values'), _("KEY=VALUE")))
def _commit(orig, ui, repo, *pats, **opts):
origcommit = repo.commit
try:
def _wrappedcommit(*innerpats, **inneropts):
extras = opts.get(r'extra')
if extras:
for raw in extras:
if '=' not in raw:
msg = _("unable to parse '%s', should follow "
"KEY=VALUE format")
raise error.Abort(msg % raw)
k, v = raw.split('=', 1)
if not k:
msg = _("unable to parse '%s', keys can't be empty")
raise error.Abort(msg % raw)
if re.search('[^\w-]', k):
msg = _("keys can only contain ascii letters, digits,"
" '_' and '-'")
raise error.Abort(msg)
if k in usedinternally:
msg = _("key '%s' is used internally, can't be set "
"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__['commit'] = _wrappedcommit
return orig(ui, repo, *pats, **opts)
finally:
del repo.__dict__['commit']