##// END OF EJS Templates
update tcsh_completion for the new forget and summary commands
update tcsh_completion for the new forget and summary commands

File last commit:

r9610:d78fe60f default
r9638:8f8f9685 default
Show More
dispatch.py
511 lines | 17.5 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
# GNU General Public License version 2, incorporated herein by reference.
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
for name in 'SIGBREAK', 'SIGHUP', 'SIGTERM':
num = getattr(signal, name, None)
if num: signal.signal(num, catchterm)
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])
commands.help_(ui, 'shortlist')
except util.Abort, inst:
ui.warn(_("abort: %s\n") % inst)
except ImportError, inst:
m = str(inst).split()[-1]
ui.warn(_("abort: could not import module %s!\n") % m)
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
Jesse Glick
Infer a --repository argument from command arguments when reasonable....
r6150 def _findrepo(p):
Matt Mackall
dispatch: move command dispatching into its own module...
r5178 while not os.path.isdir(os.path.join(p, ".hg")):
oldp, p = p, os.path.dirname(p)
if p == oldp:
return None
return p
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
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
return
args = shlex.split(self.definition)
cmd = args.pop(0)
opts = []
help = ''
try:
self.fn, self.opts, self.help = cmdutil.findcmd(cmd, cmdtable, False)[1]
self.args = aliasargs(self.fn) + args
if cmd not in commands.norepo.split(' '):
self.norepo = False
except error.UnknownCommand:
def fn(ui, *args):
ui.warn(_("alias '%s' resolves to unknown command '%s'\n") \
% (self.name, cmd))
return 1
self.fn = fn
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
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:]
Matt Mackall
findcmd: have dispatch look up strict flag
r7213 aliases, i = 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]
Brendan Cully
Move alias into core
r8655 args = aliasargs(i[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
Matt Mackall
dispatch: move command dispatching into its own module...
r5178 c = list(i[1])
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]
return (cmd, cmd and i[0] or None, args, options, cmdoptions)
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):
raise util.Abort(_('malformed --config option: %s') % cfg)
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
Jesse Glick
Infer a --repository argument from command arguments when reasonable....
r6150 path = _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
Martin Geisler
extensions: load and configure extensions in well-defined phases...
r9410 # (uisetup is handled in extensions.loadall)
for name, module in exts:
Kirill Smelkov
dispatch: allow extensions to provide setup code...
r5828 extsetup = getattr(module, 'extsetup', None)
if extsetup:
Simon Heimberg
extensions: pass ui arguement to extsetup if accepted
r9411 try:
extsetup(ui)
except TypeError:
if extsetup.func_code.co_argcount != 0:
raise
extsetup() # old extsetup with no ui argument
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
repos = map(_findrepo, args)
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()