##// END OF EJS Templates
dispatch: don't mangle ImportError abort messages...
dispatch: don't mangle ImportError abort messages Previously, Mercurial assumed that the last word of the string representation was the name of the moduled that was imported. This assmption is incorrect, despite being true for the common case of an exception raised by the Python VM. For example, hgsubversion raises an ImportError with a helpful message if the Subversion bindings were not found. The final word of this message is not meaningful on its own, and is never the name of a module. This patch changes the output printed to be a simple stringification of the exception instance. In most cases, this will be `abort: No module named X!' rather than `abort: could not import module X!'. No functionality change; all tests pass.

File last commit:

r11053:59d0d715 stable
r11053:59d0d715 stable
Show More
dispatch.py
521 lines | 18.1 KiB | text/x-python | PythonLexer
Matt Mackall
dispatch: move command dispatching into its own module...
r5178 # dispatch.py - command dispatching for mercurial
#
# Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
#
Martin Geisler
updated license to be explicit about GPL version 2
r8225 # This software may be used and distributed according to the terms of the
Matt Mackall
Update license to GPLv2+
r10263 # GNU General Public License version 2 or any later version.
Matt Mackall
dispatch: move command dispatching into its own module...
r5178
from i18n import _
Matt Mackall
dispatch: generalize signature checking for extension command wrapping
r7388 import os, sys, atexit, signal, pdb, socket, errno, shlex, time
Peter Arrenbrecht
cleanup: drop unused imports
r7873 import util, commands, hg, fancyopts, extensions, hook, error
Matt Mackall
move encoding bits from util to encoding...
r7948 import cmdutil, encoding
Matt Mackall
dispatch: move command dispatching into its own module...
r5178 import ui as _ui
def run():
"run the command in sys.argv"
sys.exit(dispatch(sys.argv[1:]))
def dispatch(args):
"run the command specified in args"
try:
Matt Mackall
ui: refactor option setting...
r8136 u = _ui.ui()
if '--traceback' in args:
u.setconfig('ui', 'traceback', 'on')
Matt Mackall
dispatch: move command dispatching into its own module...
r5178 except util.Abort, inst:
sys.stderr.write(_("abort: %s\n") % inst)
return -1
Martin Geisler
dispatch: catch ConfigError while constructing ui
r9470 except error.ConfigError, inst:
sys.stderr.write(_("hg: %s\n") % inst)
return -1
Matt Mackall
dispatch: move command dispatching into its own module...
r5178 return _runcatch(u, args)
def _runcatch(ui, args):
def catchterm(*args):
Matt Mackall
error: move SignalInterrupt...
r7644 raise error.SignalInterrupt
Matt Mackall
dispatch: move command dispatching into its own module...
r5178
Simon Heimberg
dispatch: ignore if signals can not be set...
r10952 try:
for name in 'SIGBREAK', 'SIGHUP', 'SIGTERM':
num = getattr(signal, name, None)
if num:
signal.signal(num, catchterm)
except ValueError:
pass # happens if called in a thread
Matt Mackall
dispatch: move command dispatching into its own module...
r5178
try:
try:
# enter the debugger before command execution
if '--debugger' in args:
pdb.set_trace()
try:
return _dispatch(ui, args)
finally:
ui.flush()
except:
# enter the debugger when we hit an exception
if '--debugger' in args:
pdb.post_mortem(sys.exc_info()[2])
Matt Mackall
ui: print_exc() -> traceback()
r8206 ui.traceback()
Matt Mackall
dispatch: move command dispatching into its own module...
r5178 raise
Matt Mackall
dispatch: sort exception handlers
r7645 # Global exception handling, alphabetically
# Mercurial-specific first, followed by built-in and library exceptions
Matt Mackall
error: move UnknownCommand and AmbiguousCommand
r7643 except error.AmbiguousCommand, inst:
Matt Mackall
dispatch: move command dispatching into its own module...
r5178 ui.warn(_("hg: command '%s' is ambiguous:\n %s\n") %
(inst.args[0], " ".join(inst.args[1])))
Matt Mackall
ui: introduce new config parser
r8144 except error.ConfigError, inst:
ui.warn(_("hg: %s\n") % inst.args[0])
Matt Mackall
error: move lock errors...
r7640 except error.LockHeld, inst:
Matt Mackall
dispatch: move command dispatching into its own module...
r5178 if inst.errno == errno.ETIMEDOUT:
reason = _('timed out waiting for lock held by %s') % inst.locker
else:
reason = _('lock held by %s') % inst.locker
ui.warn(_("abort: %s: %s\n") % (inst.desc or inst.filename, reason))
Matt Mackall
error: move lock errors...
r7640 except error.LockUnavailable, inst:
Matt Mackall
dispatch: move command dispatching into its own module...
r5178 ui.warn(_("abort: could not lock %s: %s\n") %
(inst.desc or inst.filename, inst.strerror))
Matt Mackall
dispatch: sort exception handlers
r7645 except error.ParseError, inst:
if inst.args[0]:
ui.warn(_("hg %s: %s\n") % (inst.args[0], inst.args[1]))
commands.help_(ui, inst.args[0])
else:
ui.warn(_("hg: %s\n") % inst.args[1])
commands.help_(ui, 'shortlist')
except error.RepoError, inst:
ui.warn(_("abort: %s!\n") % inst)
except error.ResponseError, inst:
ui.warn(_("abort: %s") % inst.args[0])
if not isinstance(inst.args[1], basestring):
ui.warn(" %r\n" % (inst.args[1],))
elif not inst.args[1]:
ui.warn(_(" empty string\n"))
else:
ui.warn("\n%r\n" % util.ellipsis(inst.args[1]))
Matt Mackall
errors: move revlog errors...
r7633 except error.RevlogError, inst:
Matt Mackall
dispatch: move command dispatching into its own module...
r5178 ui.warn(_("abort: %s!\n") % inst)
Matt Mackall
error: move SignalInterrupt...
r7644 except error.SignalInterrupt:
Matt Mackall
dispatch: move command dispatching into its own module...
r5178 ui.warn(_("killed!\n"))
Matt Mackall
dispatch: sort exception handlers
r7645 except error.UnknownCommand, inst:
ui.warn(_("hg: unknown command '%s'\n") % inst.args[0])
Brodie Rao
dispatch: provide help for disabled extensions and commands...
r10364 try:
# check if the command is in a disabled extension
# (but don't check for extensions themselves)
commands.help_(ui, inst.args[0], unknowncmd=True)
except error.UnknownCommand:
commands.help_(ui, 'shortlist')
Matt Mackall
dispatch: sort exception handlers
r7645 except util.Abort, inst:
ui.warn(_("abort: %s\n") % inst)
except ImportError, inst:
Dan Villiom Podlaski Christiansen
dispatch: don't mangle ImportError abort messages...
r11053 ui.warn(_("abort: %s!\n") % inst)
Matt Mackall
dispatch: sort exception handlers
r7645 m = str(inst).split()[-1]
if m in "mpatch bdiff".split():
ui.warn(_("(did you forget to compile extensions?)\n"))
elif m in "zlib".split():
ui.warn(_("(is your Python install correct?)\n"))
Matt Mackall
dispatch: move command dispatching into its own module...
r5178 except IOError, inst:
if hasattr(inst, "code"):
ui.warn(_("abort: %s\n") % inst)
elif hasattr(inst, "reason"):
try: # usually it is in the form (errno, strerror)
reason = inst.reason.args[1]
except: # it might be anything, for example a string
reason = inst.reason
ui.warn(_("abort: error: %s\n") % reason)
Benoit Boissinot
use inst.args instead of using __getitem__ directly...
r7474 elif hasattr(inst, "args") and inst.args[0] == errno.EPIPE:
Matt Mackall
dispatch: move command dispatching into its own module...
r5178 if ui.debugflag:
ui.warn(_("broken pipe\n"))
elif getattr(inst, "strerror", None):
if getattr(inst, "filename", None):
ui.warn(_("abort: %s: %s\n") % (inst.strerror, inst.filename))
else:
ui.warn(_("abort: %s\n") % inst.strerror)
else:
raise
except OSError, inst:
if getattr(inst, "filename", None):
ui.warn(_("abort: %s: %s\n") % (inst.strerror, inst.filename))
else:
ui.warn(_("abort: %s\n") % inst.strerror)
Matt Mackall
dispatch: sort exception handlers
r7645 except KeyboardInterrupt:
try:
ui.warn(_("interrupted!\n"))
except IOError, inst:
if inst.errno == errno.EPIPE:
if ui.debugflag:
ui.warn(_("\nbroken pipe\n"))
else:
raise
Matt Mackall
dispatch: report OOM rather than traceback
r5633 except MemoryError:
ui.warn(_("abort: out of memory\n"))
Matt Mackall
dispatch: move command dispatching into its own module...
r5178 except SystemExit, inst:
# Commands shouldn't sys.exit directly, but give a return code.
# Just in case catch this and and pass exit code to caller.
return inst.code
Matt Mackall
dispatch: sort exception handlers
r7645 except socket.error, inst:
ui.warn(_("abort: %s\n") % inst.args[-1])
Matt Mackall
dispatch: move command dispatching into its own module...
r5178 except:
ui.warn(_("** unknown exception encountered, details follow\n"))
ui.warn(_("** report bug details to "
Dirkjan Ochtman
change wiki/bts URLs to point to new hostname
r8936 "http://mercurial.selenic.com/bts/\n"))
Matt Mackall
dispatch: move command dispatching into its own module...
r5178 ui.warn(_("** or mercurial@selenic.com\n"))
ui.warn(_("** Mercurial Distributed SCM (version %s)\n")
Matt Mackall
refactor version code...
r7632 % util.version())
Benoit Boissinot
show extensions loaded on traceback
r6985 ui.warn(_("** Extensions loaded: %s\n")
% ", ".join([x[0] for x in extensions.extensions()]))
Matt Mackall
dispatch: move command dispatching into its own module...
r5178 raise
return -1
Brendan Cully
Move alias into core
r8655 def aliasargs(fn):
if hasattr(fn, 'args'):
return fn.args
return []
class cmdalias(object):
def __init__(self, name, definition, cmdtable):
self.name = name
self.definition = definition
self.args = []
self.opts = []
self.help = ''
self.norepo = True
Brodie Rao
help: don't display bogus help messages for invalid aliases
r10021 self.badalias = False
Brendan Cully
Move alias into core
r8655
try:
cmdutil.findcmd(self.name, cmdtable, True)
self.shadows = True
except error.UnknownCommand:
self.shadows = False
if not self.definition:
def fn(ui, *args):
ui.warn(_("no definition for alias '%s'\n") % self.name)
return 1
self.fn = fn
Brodie Rao
help: don't display bogus help messages for invalid aliases
r10021 self.badalias = True
Brendan Cully
Move alias into core
r8655
return
args = shlex.split(self.definition)
cmd = args.pop(0)
Alexander Solovyov
expand paths in aliases
r10793 args = map(util.expandpath, args)
Brendan Cully
Move alias into core
r8655
try:
Nicolas Dumazet
alias: do not crash when aliased command has no usage help text
r9993 tableentry = cmdutil.findcmd(cmd, cmdtable, False)[1]
if len(tableentry) > 2:
self.fn, self.opts, self.help = tableentry
else:
self.fn, self.opts = tableentry
Brendan Cully
Move alias into core
r8655 self.args = aliasargs(self.fn) + args
if cmd not in commands.norepo.split(' '):
self.norepo = False
Peter Arrenbrecht
alias: improve help text for command aliases...
r9876 if self.help.startswith("hg " + cmd):
# drop prefix in old-style help lines so hg shows the alias
self.help = self.help[4 + len(cmd):]
Yuya Nishihara
alias: fixes exception when displaying translated help text...
r10564 self.__doc__ = self.fn.__doc__
Peter Arrenbrecht
alias: improve help text for command aliases...
r9876
Brendan Cully
Move alias into core
r8655 except error.UnknownCommand:
def fn(ui, *args):
ui.warn(_("alias '%s' resolves to unknown command '%s'\n") \
% (self.name, cmd))
Brodie Rao
dispatch: provide help for disabled extensions and commands...
r10364 try:
# check if the command is in a disabled extension
commands.help_(ui, cmd, unknowncmd=True)
except error.UnknownCommand:
pass
Brendan Cully
Move alias into core
r8655 return 1
self.fn = fn
Brodie Rao
help: don't display bogus help messages for invalid aliases
r10021 self.badalias = True
Brendan Cully
Move alias into core
r8655 except error.AmbiguousCommand:
def fn(ui, *args):
ui.warn(_("alias '%s' resolves to ambiguous command '%s'\n") \
% (self.name, cmd))
return 1
self.fn = fn
Brodie Rao
help: don't display bogus help messages for invalid aliases
r10021 self.badalias = True
Brendan Cully
Move alias into core
r8655
def __call__(self, ui, *args, **opts):
if self.shadows:
Martin Geisler
do not attempt to translate ui.debug output
r9467 ui.debug("alias '%s' shadows command\n" % self.name)
Brendan Cully
Move alias into core
r8655
return self.fn(ui, *args, **opts)
def addaliases(ui, cmdtable):
# aliases are processed after extensions have been loaded, so they
# may use extension commands. Aliases can also use other alias definitions,
# but only if they have been defined prior to the current definition.
for alias, definition in ui.configitems('alias'):
aliasdef = cmdalias(alias, definition, cmdtable)
cmdtable[alias] = (aliasdef, aliasdef.opts, aliasdef.help)
if aliasdef.norepo:
commands.norepo += ' %s' % alias
Matt Mackall
dispatch: move command dispatching into its own module...
r5178 def _parse(ui, args):
options = {}
cmdoptions = {}
try:
args = fancyopts.fancyopts(args, commands.globalopts, options)
except fancyopts.getopt.GetoptError, inst:
Matt Mackall
error: move ParseError
r7636 raise error.ParseError(None, inst)
Matt Mackall
dispatch: move command dispatching into its own module...
r5178
if args:
cmd, args = args[0], args[1:]
Henri Wiechers
dispatch: minor refactoring...
r9875 aliases, entry = cmdutil.findcmd(cmd, commands.table,
Thomas Arendsen Hein
Minor cleanup: Add missing space forgotten in recent change.
r7224 ui.config("ui", "strict"))
Matt Mackall
dispatch: move command dispatching into its own module...
r5178 cmd = aliases[0]
Henri Wiechers
dispatch: minor refactoring...
r9875 args = aliasargs(entry[0]) + args
Matt Mackall
dispatch: move command dispatching into its own module...
r5178 defaults = ui.config("defaults", cmd)
if defaults:
Alexander Solovyov
make path expanding more consistent...
r9610 args = map(util.expandpath, shlex.split(defaults)) + args
Henri Wiechers
dispatch: minor refactoring...
r9875 c = list(entry[1])
Matt Mackall
dispatch: move command dispatching into its own module...
r5178 else:
cmd = None
c = []
# combine global options into local
for o in commands.globalopts:
c.append((o[0], o[1], options[o[1]], o[3]))
try:
Augie Fackler
fancyopts: Parse options that occur after arguments....
r7772 args = fancyopts.fancyopts(args, c, cmdoptions, True)
Matt Mackall
dispatch: move command dispatching into its own module...
r5178 except fancyopts.getopt.GetoptError, inst:
Matt Mackall
error: move ParseError
r7636 raise error.ParseError(cmd, inst)
Matt Mackall
dispatch: move command dispatching into its own module...
r5178
# separate global options back out
for o in commands.globalopts:
n = o[1]
options[n] = cmdoptions[n]
del cmdoptions[n]
Henri Wiechers
dispatch: minor refactoring...
r9875 return (cmd, cmd and entry[0] or None, args, options, cmdoptions)
Matt Mackall
dispatch: move command dispatching into its own module...
r5178
Matt Mackall
ui: kill updateopts...
r8137 def _parseconfig(ui, config):
Matt Mackall
dispatch: move command dispatching into its own module...
r5178 """parse the --config options from the command line"""
for cfg in config:
try:
name, value = cfg.split('=', 1)
section, name = name.split('.', 1)
if not section or not name:
raise IndexError
Matt Mackall
ui: kill updateopts...
r8137 ui.setconfig(section, name, value)
Matt Mackall
dispatch: move command dispatching into its own module...
r5178 except (IndexError, ValueError):
Bill Schroeder
dispatch: better error message for --config option
r9825 raise util.Abort(_('malformed --config option: %r '
'(use --config section.name=value)') % cfg)
Matt Mackall
dispatch: move command dispatching into its own module...
r5178
def _earlygetopt(aliases, args):
"""Return list of values for an option (or aliases).
The values are listed in the order they appear in args.
The options and values are removed from args.
"""
try:
argcount = args.index("--")
except ValueError:
argcount = len(args)
shortopts = [opt for opt in aliases if len(opt) == 2]
values = []
pos = 0
while pos < argcount:
if args[pos] in aliases:
if pos + 1 >= argcount:
# ignore and let getopt report an error if there is no value
break
del args[pos]
values.append(args.pop(pos))
argcount -= 2
elif args[pos][:2] in shortopts:
# short option can have no following space, e.g. hg log -Rfoo
values.append(args.pop(pos)[2:])
argcount -= 1
else:
pos += 1
return values
Bill Barry
dispatch: extract command execution block into method...
r7819 def runcommand(lui, repo, cmd, fullargs, ui, options, d):
# run pre-hook, and abort if it fails
ret = hook.hook(lui, repo, "pre-%s" % cmd, False, args=" ".join(fullargs))
if ret:
return ret
ret = _runcommand(ui, options, cmd, d)
# run post-hook, passing command result
hook.hook(lui, repo, "post-%s" % cmd, False, args=" ".join(fullargs),
result = ret)
return ret
Martin Geisler
dispatch: remember loaded extensions in a real set
r8304 _loaded = set()
Matt Mackall
dispatch: move command dispatching into its own module...
r5178 def _dispatch(ui, args):
# read --config before doing anything else
# (e.g. to change trust settings for reading .hg/hgrc)
Matt Mackall
ui: kill updateopts...
r8137 _parseconfig(ui, _earlygetopt(['--config'], args))
Matt Mackall
dispatch: move command dispatching into its own module...
r5178
# check for cwd
cwd = _earlygetopt(['--cwd'], args)
if cwd:
os.chdir(cwd[-1])
# read the local repository .hgrc into a local ui object
Brendan Cully
mq: make init -Q do what qinit -c did
r10402 path = cmdutil.findrepo(os.getcwd()) or ""
Matt Mackall
dispatch: move command dispatching into its own module...
r5178 if not path:
lui = ui
Andrey Somov
improve code readability
r9436 else:
Matt Mackall
dispatch: move command dispatching into its own module...
r5178 try:
Matt Mackall
ui: kill most users of parentui name and arg, replace with .copy()
r8190 lui = ui.copy()
Matt Mackall
dispatch: move command dispatching into its own module...
r5178 lui.readconfig(os.path.join(path, ".hg", "hgrc"))
except IOError:
pass
# now we can expand paths, even ones in .hg/hgrc
rpath = _earlygetopt(["-R", "--repository", "--repo"], args)
if rpath:
path = lui.expandpath(rpath[-1])
Matt Mackall
ui: kill most users of parentui name and arg, replace with .copy()
r8190 lui = ui.copy()
Matt Mackall
dispatch: move command dispatching into its own module...
r5178 lui.readconfig(os.path.join(path, ".hg", "hgrc"))
Martin Geisler
extensions: load and configure extensions in well-defined phases...
r9410 # Configure extensions in phases: uisetup, extsetup, cmdtable, and
# reposetup. Programs like TortoiseHg will call _dispatch several
# times so we keep track of configured extensions in _loaded.
Matt Mackall
dispatch: move command dispatching into its own module...
r5178 extensions.loadall(lui)
Martin Geisler
extensions: load and configure extensions in well-defined phases...
r9410 exts = [ext for ext in extensions.extensions() if ext[0] not in _loaded]
Kirill Smelkov
dispatch: allow extensions to provide setup code...
r5828
Yuya Nishihara
extensions: changed to call extsetup() from extensions.loadall()...
r9660 # (uisetup and extsetup are handled in extensions.loadall)
Kirill Smelkov
dispatch: allow extensions to provide setup code...
r5828
Martin Geisler
extensions: load and configure extensions in well-defined phases...
r9410 for name, module in exts:
Alexis S. L. Carvalho
Move cmdtable and reposetup handling out of extensions.py...
r5192 cmdtable = getattr(module, 'cmdtable', {})
overrides = [cmd for cmd in cmdtable if cmd in commands.table]
if overrides:
ui.warn(_("extension '%s' overrides commands: %s\n")
% (name, " ".join(overrides)))
commands.table.update(cmdtable)
Martin Geisler
dispatch: remember loaded extensions in a real set
r8304 _loaded.add(name)
Brendan Cully
Move alias into core
r8655
Martin Geisler
extensions: load and configure extensions in well-defined phases...
r9410 # (reposetup is handled in hg.repository)
Brendan Cully
Move alias into core
r8655 addaliases(lui, commands.table)
Matt Mackall
dispatch: move command dispatching into its own module...
r5178 # check for fallback encoding
fallback = lui.config('ui', 'fallbackencoding')
if fallback:
Matt Mackall
move encoding bits from util to encoding...
r7948 encoding.fallbackencoding = fallback
Matt Mackall
dispatch: move command dispatching into its own module...
r5178
fullargs = args
cmd, func, args, options, cmdoptions = _parse(lui, args)
if options["config"]:
raise util.Abort(_("Option --config may not be abbreviated!"))
if options["cwd"]:
raise util.Abort(_("Option --cwd may not be abbreviated!"))
if options["repository"]:
raise util.Abort(_(
Sune Foldager
translated a bunch of strings to danish
r8911 "Option -R has to be separated from other options (e.g. not -qR) "
Matt Mackall
dispatch: move command dispatching into its own module...
r5178 "and --repository may only be abbreviated as --repo!"))
if options["encoding"]:
Matt Mackall
move encoding bits from util to encoding...
r7948 encoding.encoding = options["encoding"]
Matt Mackall
dispatch: move command dispatching into its own module...
r5178 if options["encodingmode"]:
Matt Mackall
move encoding bits from util to encoding...
r7948 encoding.encodingmode = options["encodingmode"]
Matt Mackall
dispatch: move command dispatching into its own module...
r5178 if options["time"]:
def get_times():
t = os.times()
if t[4] == 0.0: # Windows leaves this as zero, so use time.clock()
t = (t[0], t[1], t[2], t[3], time.clock())
return t
s = get_times()
def print_time():
t = get_times()
ui.warn(_("Time: real %.3f secs (user %.3f+%.3f sys %.3f+%.3f)\n") %
(t[4]-s[4], t[0]-s[0], t[2]-s[2], t[1]-s[1], t[3]-s[3]))
atexit.register(print_time)
Matt Mackall
ui: refactor option setting...
r8136 if options['verbose'] or options['debug'] or options['quiet']:
ui.setconfig('ui', 'verbose', str(bool(options['verbose'])))
ui.setconfig('ui', 'debug', str(bool(options['debug'])))
ui.setconfig('ui', 'quiet', str(bool(options['quiet'])))
if options['traceback']:
ui.setconfig('ui', 'traceback', 'on')
if options['noninteractive']:
ui.setconfig('ui', 'interactive', 'off')
Matt Mackall
dispatch: move command dispatching into its own module...
r5178
if options['help']:
return commands.help_(ui, cmd, options['version'])
elif options['version']:
return commands.version_(ui)
elif not cmd:
return commands.help_(ui, 'shortlist')
repo = None
if cmd not in commands.norepo.split():
try:
repo = hg.repository(ui, path=path)
ui = repo.ui
if not repo.local():
raise util.Abort(_("repository '%s' is not local") % path)
Alexis S. L. Carvalho
Set bundle.mainreporoot only after checking that it's a local repo...
r6105 ui.setconfig("bundle", "mainreporoot", repo.root)
Matt Mackall
error: move repo errors...
r7637 except error.RepoError:
Matt Mackall
dispatch: move command dispatching into its own module...
r5178 if cmd not in commands.optionalrepo.split():
Jesse Glick
Infer a --repository argument from command arguments when reasonable....
r6150 if args and not path: # try to infer -R from command args
Brendan Cully
mq: make init -Q do what qinit -c did
r10402 repos = map(cmdutil.findrepo, args)
Jesse Glick
Infer a --repository argument from command arguments when reasonable....
r6150 guess = repos[0]
if guess and repos.count(guess) == len(repos):
return _dispatch(ui, ['--repository', guess] + fullargs)
Matt Mackall
dispatch: move command dispatching into its own module...
r5178 if not path:
Matt Mackall
error: move repo errors...
r7637 raise error.RepoError(_("There is no Mercurial repository"
" here (.hg not found)"))
Matt Mackall
dispatch: move command dispatching into its own module...
r5178 raise
Matt Mackall
dispatch: generalize signature checking for extension command wrapping
r7388 args.insert(0, repo)
Matt Mackall
warn if --repository provided for norepo commands
r7733 elif rpath:
ui.warn("warning: --repository ignored\n")
Matt Mackall
dispatch: generalize signature checking for extension command wrapping
r7388
d = lambda: util.checksignature(func)(ui, *args, **cmdoptions)
Bill Barry
dispatch: extract command execution block into method...
r7819 return runcommand(lui, repo, cmd, fullargs, ui, options, d)
Matt Mackall
dispatch: move command dispatching into its own module...
r5178
def _runcommand(ui, options, cmd, cmdfunc):
def checkargs():
try:
return cmdfunc()
Matt Mackall
error: move SignatureError
r7646 except error.SignatureError:
Matt Mackall
error: move ParseError
r7636 raise error.ParseError(cmd, _("invalid arguments"))
Matt Mackall
dispatch: move command dispatching into its own module...
r5178
Thomas Arendsen Hein
Backed out changeset b913d3aacddc (see issue971/msg5317)
r6141 if options['profile']:
Nicolas Dumazet
profiling: Adding a profiling.format config variable...
r8023 format = ui.config('profiling', 'format', default='text')
Nicolas Dumazet
profiling: Adding support for kcachegrind output format, using lsprofcalltree
r8024 if not format in ['text', 'kcachegrind']:
Nicolas Dumazet
profiling: Adding a profiling.format config variable...
r8023 ui.warn(_("unrecognized profiling format '%s'"
" - Ignored\n") % format)
format = 'text'
Nicolas Dumazet
profiling: Adding profiling.output config variable...
r8022 output = ui.config('profiling', 'output')
if output:
Alexander Solovyov
make path expanding more consistent...
r9610 path = ui.expandpath(output)
Nicolas Dumazet
profiling: Adding profiling.output config variable...
r8022 ostream = open(path, 'wb')
else:
ostream = sys.stderr
Matt Mackall
dispatch: move command dispatching into its own module...
r5178 try:
from mercurial import lsprof
except ImportError:
raise util.Abort(_(
'lsprof not available - install from '
'http://codespeak.net/svn/user/arigo/hack/misc/lsprof/'))
p = lsprof.Profiler()
p.enable(subcalls=True)
try:
Thomas Arendsen Hein
Backed out changeset b913d3aacddc (see issue971/msg5317)
r6141 return checkargs()
Matt Mackall
dispatch: move command dispatching into its own module...
r5178 finally:
p.disable()
Nicolas Dumazet
profiling: Adding support for kcachegrind output format, using lsprofcalltree
r8024
if format == 'kcachegrind':
import lsprofcalltree
calltree = lsprofcalltree.KCacheGrind(p)
calltree.output(ostream)
else:
# format == 'text'
stats = lsprof.Stats(p.getstats())
stats.sort()
stats.pprint(top=10, file=ostream, climit=5)
Nicolas Dumazet
profiling: Adding profiling.output config variable...
r8022
if output:
ostream.close()
Matt Mackall
dispatch: move command dispatching into its own module...
r5178 else:
Thomas Arendsen Hein
Backed out changeset b913d3aacddc (see issue971/msg5317)
r6141 return checkargs()