annotate mercurial/dispatch.py @ 11053:59d0d715fbfa stable

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.
author Dan Villiom Podlaski Christiansen <danchr@gmail.com>
date Fri, 30 Apr 2010 18:11:56 +0200
parents 6c2c766afefe
children 355a7535bcac ed71cb07d7b2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
1 # dispatch.py - command dispatching for mercurial
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
2 #
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
3 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
4 #
8225
46293a0c7e9f updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 8206
diff changeset
5 # This software may be used and distributed according to the terms of the
10263
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 9993
diff changeset
6 # GNU General Public License version 2 or any later version.
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
7
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
8 from i18n import _
7388
5751631246de dispatch: generalize signature checking for extension command wrapping
Matt Mackall <mpm@selenic.com>
parents: 7280
diff changeset
9 import os, sys, atexit, signal, pdb, socket, errno, shlex, time
7873
4a4c7f6a5912 cleanup: drop unused imports
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7819
diff changeset
10 import util, commands, hg, fancyopts, extensions, hook, error
7948
de377b1a9a84 move encoding bits from util to encoding
Matt Mackall <mpm@selenic.com>
parents: 7873
diff changeset
11 import cmdutil, encoding
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
12 import ui as _ui
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
13
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
14 def run():
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
15 "run the command in sys.argv"
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
16 sys.exit(dispatch(sys.argv[1:]))
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
17
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
18 def dispatch(args):
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
19 "run the command specified in args"
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
20 try:
8136
6b5522cb2ad2 ui: refactor option setting
Matt Mackall <mpm@selenic.com>
parents: 8024
diff changeset
21 u = _ui.ui()
6b5522cb2ad2 ui: refactor option setting
Matt Mackall <mpm@selenic.com>
parents: 8024
diff changeset
22 if '--traceback' in args:
6b5522cb2ad2 ui: refactor option setting
Matt Mackall <mpm@selenic.com>
parents: 8024
diff changeset
23 u.setconfig('ui', 'traceback', 'on')
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
24 except util.Abort, inst:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
25 sys.stderr.write(_("abort: %s\n") % inst)
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
26 return -1
9470
ba75830d17a9 dispatch: catch ConfigError while constructing ui
Martin Geisler <mg@lazybytes.net>
parents: 8936
diff changeset
27 except error.ConfigError, inst:
ba75830d17a9 dispatch: catch ConfigError while constructing ui
Martin Geisler <mg@lazybytes.net>
parents: 8936
diff changeset
28 sys.stderr.write(_("hg: %s\n") % inst)
ba75830d17a9 dispatch: catch ConfigError while constructing ui
Martin Geisler <mg@lazybytes.net>
parents: 8936
diff changeset
29 return -1
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
30 return _runcatch(u, args)
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
31
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
32 def _runcatch(ui, args):
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
33 def catchterm(*args):
7644
182b7114d35a error: move SignalInterrupt
Matt Mackall <mpm@selenic.com>
parents: 7643
diff changeset
34 raise error.SignalInterrupt
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
35
10952
6c2c766afefe dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents: 10793
diff changeset
36 try:
6c2c766afefe dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents: 10793
diff changeset
37 for name in 'SIGBREAK', 'SIGHUP', 'SIGTERM':
6c2c766afefe dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents: 10793
diff changeset
38 num = getattr(signal, name, None)
6c2c766afefe dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents: 10793
diff changeset
39 if num:
6c2c766afefe dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents: 10793
diff changeset
40 signal.signal(num, catchterm)
6c2c766afefe dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents: 10793
diff changeset
41 except ValueError:
6c2c766afefe dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents: 10793
diff changeset
42 pass # happens if called in a thread
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
43
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
44 try:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
45 try:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
46 # enter the debugger before command execution
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
47 if '--debugger' in args:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
48 pdb.set_trace()
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
49 try:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
50 return _dispatch(ui, args)
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
51 finally:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
52 ui.flush()
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
53 except:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
54 # enter the debugger when we hit an exception
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
55 if '--debugger' in args:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
56 pdb.post_mortem(sys.exc_info()[2])
8206
cce63ef1045b ui: print_exc() -> traceback()
Matt Mackall <mpm@selenic.com>
parents: 8190
diff changeset
57 ui.traceback()
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
58 raise
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
59
7645
020a896a5292 dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents: 7644
diff changeset
60 # Global exception handling, alphabetically
020a896a5292 dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents: 7644
diff changeset
61 # Mercurial-specific first, followed by built-in and library exceptions
7643
9a1ea6587557 error: move UnknownCommand and AmbiguousCommand
Matt Mackall <mpm@selenic.com>
parents: 7641
diff changeset
62 except error.AmbiguousCommand, inst:
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
63 ui.warn(_("hg: command '%s' is ambiguous:\n %s\n") %
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
64 (inst.args[0], " ".join(inst.args[1])))
8144
fca54469480e ui: introduce new config parser
Matt Mackall <mpm@selenic.com>
parents: 8137
diff changeset
65 except error.ConfigError, inst:
fca54469480e ui: introduce new config parser
Matt Mackall <mpm@selenic.com>
parents: 8137
diff changeset
66 ui.warn(_("hg: %s\n") % inst.args[0])
7640
7197812e8d44 error: move lock errors
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
67 except error.LockHeld, inst:
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
68 if inst.errno == errno.ETIMEDOUT:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
69 reason = _('timed out waiting for lock held by %s') % inst.locker
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
70 else:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
71 reason = _('lock held by %s') % inst.locker
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
72 ui.warn(_("abort: %s: %s\n") % (inst.desc or inst.filename, reason))
7640
7197812e8d44 error: move lock errors
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
73 except error.LockUnavailable, inst:
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
74 ui.warn(_("abort: could not lock %s: %s\n") %
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
75 (inst.desc or inst.filename, inst.strerror))
7645
020a896a5292 dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents: 7644
diff changeset
76 except error.ParseError, inst:
020a896a5292 dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents: 7644
diff changeset
77 if inst.args[0]:
020a896a5292 dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents: 7644
diff changeset
78 ui.warn(_("hg %s: %s\n") % (inst.args[0], inst.args[1]))
020a896a5292 dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents: 7644
diff changeset
79 commands.help_(ui, inst.args[0])
020a896a5292 dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents: 7644
diff changeset
80 else:
020a896a5292 dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents: 7644
diff changeset
81 ui.warn(_("hg: %s\n") % inst.args[1])
020a896a5292 dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents: 7644
diff changeset
82 commands.help_(ui, 'shortlist')
020a896a5292 dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents: 7644
diff changeset
83 except error.RepoError, inst:
020a896a5292 dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents: 7644
diff changeset
84 ui.warn(_("abort: %s!\n") % inst)
020a896a5292 dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents: 7644
diff changeset
85 except error.ResponseError, inst:
020a896a5292 dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents: 7644
diff changeset
86 ui.warn(_("abort: %s") % inst.args[0])
020a896a5292 dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents: 7644
diff changeset
87 if not isinstance(inst.args[1], basestring):
020a896a5292 dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents: 7644
diff changeset
88 ui.warn(" %r\n" % (inst.args[1],))
020a896a5292 dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents: 7644
diff changeset
89 elif not inst.args[1]:
020a896a5292 dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents: 7644
diff changeset
90 ui.warn(_(" empty string\n"))
020a896a5292 dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents: 7644
diff changeset
91 else:
020a896a5292 dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents: 7644
diff changeset
92 ui.warn("\n%r\n" % util.ellipsis(inst.args[1]))
7633
08cabecfa8a8 errors: move revlog errors
Matt Mackall <mpm@selenic.com>
parents: 7632
diff changeset
93 except error.RevlogError, inst:
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
94 ui.warn(_("abort: %s!\n") % inst)
7644
182b7114d35a error: move SignalInterrupt
Matt Mackall <mpm@selenic.com>
parents: 7643
diff changeset
95 except error.SignalInterrupt:
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
96 ui.warn(_("killed!\n"))
7645
020a896a5292 dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents: 7644
diff changeset
97 except error.UnknownCommand, inst:
020a896a5292 dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents: 7644
diff changeset
98 ui.warn(_("hg: unknown command '%s'\n") % inst.args[0])
10364
de1e7099d100 dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents: 10282
diff changeset
99 try:
de1e7099d100 dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents: 10282
diff changeset
100 # check if the command is in a disabled extension
de1e7099d100 dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents: 10282
diff changeset
101 # (but don't check for extensions themselves)
de1e7099d100 dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents: 10282
diff changeset
102 commands.help_(ui, inst.args[0], unknowncmd=True)
de1e7099d100 dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents: 10282
diff changeset
103 except error.UnknownCommand:
de1e7099d100 dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents: 10282
diff changeset
104 commands.help_(ui, 'shortlist')
7645
020a896a5292 dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents: 7644
diff changeset
105 except util.Abort, inst:
020a896a5292 dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents: 7644
diff changeset
106 ui.warn(_("abort: %s\n") % inst)
020a896a5292 dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents: 7644
diff changeset
107 except ImportError, inst:
11053
59d0d715fbfa dispatch: don't mangle ImportError abort messages
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 10952
diff changeset
108 ui.warn(_("abort: %s!\n") % inst)
7645
020a896a5292 dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents: 7644
diff changeset
109 m = str(inst).split()[-1]
020a896a5292 dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents: 7644
diff changeset
110 if m in "mpatch bdiff".split():
020a896a5292 dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents: 7644
diff changeset
111 ui.warn(_("(did you forget to compile extensions?)\n"))
020a896a5292 dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents: 7644
diff changeset
112 elif m in "zlib".split():
020a896a5292 dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents: 7644
diff changeset
113 ui.warn(_("(is your Python install correct?)\n"))
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
114 except IOError, inst:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
115 if hasattr(inst, "code"):
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
116 ui.warn(_("abort: %s\n") % inst)
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
117 elif hasattr(inst, "reason"):
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
118 try: # usually it is in the form (errno, strerror)
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
119 reason = inst.reason.args[1]
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
120 except: # it might be anything, for example a string
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
121 reason = inst.reason
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
122 ui.warn(_("abort: error: %s\n") % reason)
7474
b2cbced7bb50 use inst.args instead of using __getitem__ directly
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7388
diff changeset
123 elif hasattr(inst, "args") and inst.args[0] == errno.EPIPE:
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
124 if ui.debugflag:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
125 ui.warn(_("broken pipe\n"))
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
126 elif getattr(inst, "strerror", None):
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
127 if getattr(inst, "filename", None):
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
128 ui.warn(_("abort: %s: %s\n") % (inst.strerror, inst.filename))
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
129 else:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
130 ui.warn(_("abort: %s\n") % inst.strerror)
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
131 else:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
132 raise
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
133 except OSError, inst:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
134 if getattr(inst, "filename", None):
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
135 ui.warn(_("abort: %s: %s\n") % (inst.strerror, inst.filename))
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
136 else:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
137 ui.warn(_("abort: %s\n") % inst.strerror)
7645
020a896a5292 dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents: 7644
diff changeset
138 except KeyboardInterrupt:
020a896a5292 dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents: 7644
diff changeset
139 try:
020a896a5292 dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents: 7644
diff changeset
140 ui.warn(_("interrupted!\n"))
020a896a5292 dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents: 7644
diff changeset
141 except IOError, inst:
020a896a5292 dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents: 7644
diff changeset
142 if inst.errno == errno.EPIPE:
020a896a5292 dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents: 7644
diff changeset
143 if ui.debugflag:
020a896a5292 dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents: 7644
diff changeset
144 ui.warn(_("\nbroken pipe\n"))
020a896a5292 dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents: 7644
diff changeset
145 else:
020a896a5292 dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents: 7644
diff changeset
146 raise
5633
e04a65111a80 dispatch: report OOM rather than traceback
Matt Mackall <mpm@selenic.com>
parents: 5542
diff changeset
147 except MemoryError:
e04a65111a80 dispatch: report OOM rather than traceback
Matt Mackall <mpm@selenic.com>
parents: 5542
diff changeset
148 ui.warn(_("abort: out of memory\n"))
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
149 except SystemExit, inst:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
150 # Commands shouldn't sys.exit directly, but give a return code.
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
151 # Just in case catch this and and pass exit code to caller.
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
152 return inst.code
7645
020a896a5292 dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents: 7644
diff changeset
153 except socket.error, inst:
020a896a5292 dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents: 7644
diff changeset
154 ui.warn(_("abort: %s\n") % inst.args[-1])
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
155 except:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
156 ui.warn(_("** unknown exception encountered, details follow\n"))
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
157 ui.warn(_("** report bug details to "
8936
1de6e7e1bb9f change wiki/bts URLs to point to new hostname
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8916
diff changeset
158 "http://mercurial.selenic.com/bts/\n"))
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
159 ui.warn(_("** or mercurial@selenic.com\n"))
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
160 ui.warn(_("** Mercurial Distributed SCM (version %s)\n")
7632
9626819b2e3d refactor version code
Matt Mackall <mpm@selenic.com>
parents: 7474
diff changeset
161 % util.version())
6985
5cf3bf3c19ba show extensions loaded on traceback
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 6217
diff changeset
162 ui.warn(_("** Extensions loaded: %s\n")
5cf3bf3c19ba show extensions loaded on traceback
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 6217
diff changeset
163 % ", ".join([x[0] for x in extensions.extensions()]))
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
164 raise
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
165
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
166 return -1
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
167
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
168 def aliasargs(fn):
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
169 if hasattr(fn, 'args'):
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
170 return fn.args
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
171 return []
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
172
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
173 class cmdalias(object):
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
174 def __init__(self, name, definition, cmdtable):
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
175 self.name = name
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
176 self.definition = definition
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
177 self.args = []
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
178 self.opts = []
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
179 self.help = ''
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
180 self.norepo = True
10021
0022f5c5459e help: don't display bogus help messages for invalid aliases
Brodie Rao <me+hg@dackz.net>
parents: 9994
diff changeset
181 self.badalias = False
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
182
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
183 try:
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
184 cmdutil.findcmd(self.name, cmdtable, True)
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
185 self.shadows = True
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
186 except error.UnknownCommand:
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
187 self.shadows = False
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
188
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
189 if not self.definition:
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
190 def fn(ui, *args):
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
191 ui.warn(_("no definition for alias '%s'\n") % self.name)
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
192 return 1
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
193 self.fn = fn
10021
0022f5c5459e help: don't display bogus help messages for invalid aliases
Brodie Rao <me+hg@dackz.net>
parents: 9994
diff changeset
194 self.badalias = True
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
195
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
196 return
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
197
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
198 args = shlex.split(self.definition)
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
199 cmd = args.pop(0)
10793
16df09a54113 expand paths in aliases
Alexander Solovyov <piranha@piranha.org.ua>
parents: 10564
diff changeset
200 args = map(util.expandpath, args)
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
201
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
202 try:
9993
8bce1e0d2801 alias: do not crash when aliased command has no usage help text
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 9825
diff changeset
203 tableentry = cmdutil.findcmd(cmd, cmdtable, False)[1]
8bce1e0d2801 alias: do not crash when aliased command has no usage help text
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 9825
diff changeset
204 if len(tableentry) > 2:
8bce1e0d2801 alias: do not crash when aliased command has no usage help text
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 9825
diff changeset
205 self.fn, self.opts, self.help = tableentry
8bce1e0d2801 alias: do not crash when aliased command has no usage help text
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 9825
diff changeset
206 else:
8bce1e0d2801 alias: do not crash when aliased command has no usage help text
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 9825
diff changeset
207 self.fn, self.opts = tableentry
8bce1e0d2801 alias: do not crash when aliased command has no usage help text
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 9825
diff changeset
208
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
209 self.args = aliasargs(self.fn) + args
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
210 if cmd not in commands.norepo.split(' '):
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
211 self.norepo = False
9876
6e8a16dd3e30 alias: improve help text for command aliases
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 9875
diff changeset
212 if self.help.startswith("hg " + cmd):
6e8a16dd3e30 alias: improve help text for command aliases
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 9875
diff changeset
213 # drop prefix in old-style help lines so hg shows the alias
6e8a16dd3e30 alias: improve help text for command aliases
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 9875
diff changeset
214 self.help = self.help[4 + len(cmd):]
10564
6ded6243bde2 alias: fixes exception when displaying translated help text
Yuya Nishihara <yuya@tcha.org>
parents: 10402
diff changeset
215 self.__doc__ = self.fn.__doc__
9876
6e8a16dd3e30 alias: improve help text for command aliases
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 9875
diff changeset
216
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
217 except error.UnknownCommand:
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
218 def fn(ui, *args):
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
219 ui.warn(_("alias '%s' resolves to unknown command '%s'\n") \
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
220 % (self.name, cmd))
10364
de1e7099d100 dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents: 10282
diff changeset
221 try:
de1e7099d100 dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents: 10282
diff changeset
222 # check if the command is in a disabled extension
de1e7099d100 dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents: 10282
diff changeset
223 commands.help_(ui, cmd, unknowncmd=True)
de1e7099d100 dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents: 10282
diff changeset
224 except error.UnknownCommand:
de1e7099d100 dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents: 10282
diff changeset
225 pass
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
226 return 1
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
227 self.fn = fn
10021
0022f5c5459e help: don't display bogus help messages for invalid aliases
Brodie Rao <me+hg@dackz.net>
parents: 9994
diff changeset
228 self.badalias = True
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
229 except error.AmbiguousCommand:
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
230 def fn(ui, *args):
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
231 ui.warn(_("alias '%s' resolves to ambiguous command '%s'\n") \
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
232 % (self.name, cmd))
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
233 return 1
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
234 self.fn = fn
10021
0022f5c5459e help: don't display bogus help messages for invalid aliases
Brodie Rao <me+hg@dackz.net>
parents: 9994
diff changeset
235 self.badalias = True
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
236
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
237 def __call__(self, ui, *args, **opts):
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
238 if self.shadows:
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9436
diff changeset
239 ui.debug("alias '%s' shadows command\n" % self.name)
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
240
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
241 return self.fn(ui, *args, **opts)
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
242
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
243 def addaliases(ui, cmdtable):
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
244 # aliases are processed after extensions have been loaded, so they
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
245 # may use extension commands. Aliases can also use other alias definitions,
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
246 # but only if they have been defined prior to the current definition.
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
247 for alias, definition in ui.configitems('alias'):
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
248 aliasdef = cmdalias(alias, definition, cmdtable)
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
249 cmdtable[alias] = (aliasdef, aliasdef.opts, aliasdef.help)
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
250 if aliasdef.norepo:
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
251 commands.norepo += ' %s' % alias
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
252
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
253 def _parse(ui, args):
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
254 options = {}
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
255 cmdoptions = {}
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
256
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
257 try:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
258 args = fancyopts.fancyopts(args, commands.globalopts, options)
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
259 except fancyopts.getopt.GetoptError, inst:
7636
e3f8c6d6b72e error: move ParseError
Matt Mackall <mpm@selenic.com>
parents: 7633
diff changeset
260 raise error.ParseError(None, inst)
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
261
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
262 if args:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
263 cmd, args = args[0], args[1:]
9875
d6a95c5f6ff9 dispatch: minor refactoring
Henri Wiechers <hwiechers@gmail.com>
parents: 9825
diff changeset
264 aliases, entry = cmdutil.findcmd(cmd, commands.table,
7224
12a90281d83d Minor cleanup: Add missing space forgotten in recent change.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 7213
diff changeset
265 ui.config("ui", "strict"))
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
266 cmd = aliases[0]
9875
d6a95c5f6ff9 dispatch: minor refactoring
Henri Wiechers <hwiechers@gmail.com>
parents: 9825
diff changeset
267 args = aliasargs(entry[0]) + args
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
268 defaults = ui.config("defaults", cmd)
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
269 if defaults:
9610
d78fe60f6bda make path expanding more consistent
Alexander Solovyov <piranha@piranha.org.ua>
parents: 9569
diff changeset
270 args = map(util.expandpath, shlex.split(defaults)) + args
9875
d6a95c5f6ff9 dispatch: minor refactoring
Henri Wiechers <hwiechers@gmail.com>
parents: 9825
diff changeset
271 c = list(entry[1])
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
272 else:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
273 cmd = None
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
274 c = []
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
275
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
276 # combine global options into local
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
277 for o in commands.globalopts:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
278 c.append((o[0], o[1], options[o[1]], o[3]))
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
279
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
280 try:
7772
88887054d277 fancyopts: Parse options that occur after arguments.
Augie Fackler <durin42@gmail.com>
parents: 7733
diff changeset
281 args = fancyopts.fancyopts(args, c, cmdoptions, True)
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
282 except fancyopts.getopt.GetoptError, inst:
7636
e3f8c6d6b72e error: move ParseError
Matt Mackall <mpm@selenic.com>
parents: 7633
diff changeset
283 raise error.ParseError(cmd, inst)
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
284
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
285 # separate global options back out
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
286 for o in commands.globalopts:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
287 n = o[1]
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
288 options[n] = cmdoptions[n]
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
289 del cmdoptions[n]
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
290
9875
d6a95c5f6ff9 dispatch: minor refactoring
Henri Wiechers <hwiechers@gmail.com>
parents: 9825
diff changeset
291 return (cmd, cmd and entry[0] or None, args, options, cmdoptions)
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
292
8137
7fd0616b3d80 ui: kill updateopts
Matt Mackall <mpm@selenic.com>
parents: 8136
diff changeset
293 def _parseconfig(ui, config):
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
294 """parse the --config options from the command line"""
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
295 for cfg in config:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
296 try:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
297 name, value = cfg.split('=', 1)
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
298 section, name = name.split('.', 1)
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
299 if not section or not name:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
300 raise IndexError
8137
7fd0616b3d80 ui: kill updateopts
Matt Mackall <mpm@selenic.com>
parents: 8136
diff changeset
301 ui.setconfig(section, name, value)
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
302 except (IndexError, ValueError):
9825
0d850f8beea6 dispatch: better error message for --config option
Bill Schroeder <bschroeder@allstontrading.com>
parents: 9679
diff changeset
303 raise util.Abort(_('malformed --config option: %r '
0d850f8beea6 dispatch: better error message for --config option
Bill Schroeder <bschroeder@allstontrading.com>
parents: 9679
diff changeset
304 '(use --config section.name=value)') % cfg)
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
305
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
306 def _earlygetopt(aliases, args):
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
307 """Return list of values for an option (or aliases).
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
308
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
309 The values are listed in the order they appear in args.
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
310 The options and values are removed from args.
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
311 """
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
312 try:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
313 argcount = args.index("--")
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
314 except ValueError:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
315 argcount = len(args)
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
316 shortopts = [opt for opt in aliases if len(opt) == 2]
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
317 values = []
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
318 pos = 0
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
319 while pos < argcount:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
320 if args[pos] in aliases:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
321 if pos + 1 >= argcount:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
322 # ignore and let getopt report an error if there is no value
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
323 break
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
324 del args[pos]
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
325 values.append(args.pop(pos))
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
326 argcount -= 2
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
327 elif args[pos][:2] in shortopts:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
328 # short option can have no following space, e.g. hg log -Rfoo
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
329 values.append(args.pop(pos)[2:])
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
330 argcount -= 1
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
331 else:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
332 pos += 1
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
333 return values
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
334
7819
14b703252f14 dispatch: extract command execution block into method
Bill Barry <after.fallout@gmail.com>
parents: 7772
diff changeset
335 def runcommand(lui, repo, cmd, fullargs, ui, options, d):
14b703252f14 dispatch: extract command execution block into method
Bill Barry <after.fallout@gmail.com>
parents: 7772
diff changeset
336 # run pre-hook, and abort if it fails
14b703252f14 dispatch: extract command execution block into method
Bill Barry <after.fallout@gmail.com>
parents: 7772
diff changeset
337 ret = hook.hook(lui, repo, "pre-%s" % cmd, False, args=" ".join(fullargs))
14b703252f14 dispatch: extract command execution block into method
Bill Barry <after.fallout@gmail.com>
parents: 7772
diff changeset
338 if ret:
14b703252f14 dispatch: extract command execution block into method
Bill Barry <after.fallout@gmail.com>
parents: 7772
diff changeset
339 return ret
14b703252f14 dispatch: extract command execution block into method
Bill Barry <after.fallout@gmail.com>
parents: 7772
diff changeset
340 ret = _runcommand(ui, options, cmd, d)
14b703252f14 dispatch: extract command execution block into method
Bill Barry <after.fallout@gmail.com>
parents: 7772
diff changeset
341 # run post-hook, passing command result
14b703252f14 dispatch: extract command execution block into method
Bill Barry <after.fallout@gmail.com>
parents: 7772
diff changeset
342 hook.hook(lui, repo, "post-%s" % cmd, False, args=" ".join(fullargs),
14b703252f14 dispatch: extract command execution block into method
Bill Barry <after.fallout@gmail.com>
parents: 7772
diff changeset
343 result = ret)
14b703252f14 dispatch: extract command execution block into method
Bill Barry <after.fallout@gmail.com>
parents: 7772
diff changeset
344 return ret
14b703252f14 dispatch: extract command execution block into method
Bill Barry <after.fallout@gmail.com>
parents: 7772
diff changeset
345
8304
991ca609ccd6 dispatch: remember loaded extensions in a real set
Martin Geisler <mg@lazybytes.net>
parents: 8225
diff changeset
346 _loaded = set()
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
347 def _dispatch(ui, args):
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
348 # read --config before doing anything else
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
349 # (e.g. to change trust settings for reading .hg/hgrc)
8137
7fd0616b3d80 ui: kill updateopts
Matt Mackall <mpm@selenic.com>
parents: 8136
diff changeset
350 _parseconfig(ui, _earlygetopt(['--config'], args))
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
351
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
352 # check for cwd
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
353 cwd = _earlygetopt(['--cwd'], args)
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
354 if cwd:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
355 os.chdir(cwd[-1])
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
356
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
357 # read the local repository .hgrc into a local ui object
10402
d216fa04e48a mq: make init -Q do what qinit -c did
Brendan Cully <brendan@kublai.com>
parents: 10364
diff changeset
358 path = cmdutil.findrepo(os.getcwd()) or ""
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
359 if not path:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
360 lui = ui
9436
96379c93ba6f improve code readability
Andrey Somov <py4fun@gmail.com>
parents: 9411
diff changeset
361 else:
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
362 try:
8190
9b8ac5fb7760 ui: kill most users of parentui name and arg, replace with .copy()
Matt Mackall <mpm@selenic.com>
parents: 8144
diff changeset
363 lui = ui.copy()
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
364 lui.readconfig(os.path.join(path, ".hg", "hgrc"))
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
365 except IOError:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
366 pass
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
367
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
368 # now we can expand paths, even ones in .hg/hgrc
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
369 rpath = _earlygetopt(["-R", "--repository", "--repo"], args)
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
370 if rpath:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
371 path = lui.expandpath(rpath[-1])
8190
9b8ac5fb7760 ui: kill most users of parentui name and arg, replace with .copy()
Matt Mackall <mpm@selenic.com>
parents: 8144
diff changeset
372 lui = ui.copy()
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
373 lui.readconfig(os.path.join(path, ".hg", "hgrc"))
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
374
9410
1c83938b6a8e extensions: load and configure extensions in well-defined phases
Martin Geisler <mg@lazybytes.net>
parents: 8936
diff changeset
375 # Configure extensions in phases: uisetup, extsetup, cmdtable, and
1c83938b6a8e extensions: load and configure extensions in well-defined phases
Martin Geisler <mg@lazybytes.net>
parents: 8936
diff changeset
376 # reposetup. Programs like TortoiseHg will call _dispatch several
1c83938b6a8e extensions: load and configure extensions in well-defined phases
Martin Geisler <mg@lazybytes.net>
parents: 8936
diff changeset
377 # times so we keep track of configured extensions in _loaded.
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
378 extensions.loadall(lui)
9410
1c83938b6a8e extensions: load and configure extensions in well-defined phases
Martin Geisler <mg@lazybytes.net>
parents: 8936
diff changeset
379 exts = [ext for ext in extensions.extensions() if ext[0] not in _loaded]
5828
863e237b58fb dispatch: allow extensions to provide setup code
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5664
diff changeset
380
9660
e0eae93e6c67 extensions: changed to call extsetup() from extensions.loadall()
Yuya Nishihara <yuya@tcha.org>
parents: 9610
diff changeset
381 # (uisetup and extsetup are handled in extensions.loadall)
5828
863e237b58fb dispatch: allow extensions to provide setup code
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5664
diff changeset
382
9410
1c83938b6a8e extensions: load and configure extensions in well-defined phases
Martin Geisler <mg@lazybytes.net>
parents: 8936
diff changeset
383 for name, module in exts:
5192
60acf1432ee0 Move cmdtable and reposetup handling out of extensions.py
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5178
diff changeset
384 cmdtable = getattr(module, 'cmdtable', {})
60acf1432ee0 Move cmdtable and reposetup handling out of extensions.py
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5178
diff changeset
385 overrides = [cmd for cmd in cmdtable if cmd in commands.table]
60acf1432ee0 Move cmdtable and reposetup handling out of extensions.py
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5178
diff changeset
386 if overrides:
60acf1432ee0 Move cmdtable and reposetup handling out of extensions.py
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5178
diff changeset
387 ui.warn(_("extension '%s' overrides commands: %s\n")
60acf1432ee0 Move cmdtable and reposetup handling out of extensions.py
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5178
diff changeset
388 % (name, " ".join(overrides)))
60acf1432ee0 Move cmdtable and reposetup handling out of extensions.py
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5178
diff changeset
389 commands.table.update(cmdtable)
8304
991ca609ccd6 dispatch: remember loaded extensions in a real set
Martin Geisler <mg@lazybytes.net>
parents: 8225
diff changeset
390 _loaded.add(name)
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
391
9410
1c83938b6a8e extensions: load and configure extensions in well-defined phases
Martin Geisler <mg@lazybytes.net>
parents: 8936
diff changeset
392 # (reposetup is handled in hg.repository)
1c83938b6a8e extensions: load and configure extensions in well-defined phases
Martin Geisler <mg@lazybytes.net>
parents: 8936
diff changeset
393
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
394 addaliases(lui, commands.table)
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
395
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
396 # check for fallback encoding
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
397 fallback = lui.config('ui', 'fallbackencoding')
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
398 if fallback:
7948
de377b1a9a84 move encoding bits from util to encoding
Matt Mackall <mpm@selenic.com>
parents: 7873
diff changeset
399 encoding.fallbackencoding = fallback
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
400
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
401 fullargs = args
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
402 cmd, func, args, options, cmdoptions = _parse(lui, args)
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
403
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
404 if options["config"]:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
405 raise util.Abort(_("Option --config may not be abbreviated!"))
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
406 if options["cwd"]:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
407 raise util.Abort(_("Option --cwd may not be abbreviated!"))
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
408 if options["repository"]:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
409 raise util.Abort(_(
8911
62e3b9466700 translated a bunch of strings to danish
Sune Foldager <cryo@cyanite.org>
parents: 8655
diff changeset
410 "Option -R has to be separated from other options (e.g. not -qR) "
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
411 "and --repository may only be abbreviated as --repo!"))
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
412
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
413 if options["encoding"]:
7948
de377b1a9a84 move encoding bits from util to encoding
Matt Mackall <mpm@selenic.com>
parents: 7873
diff changeset
414 encoding.encoding = options["encoding"]
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
415 if options["encodingmode"]:
7948
de377b1a9a84 move encoding bits from util to encoding
Matt Mackall <mpm@selenic.com>
parents: 7873
diff changeset
416 encoding.encodingmode = options["encodingmode"]
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
417 if options["time"]:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
418 def get_times():
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
419 t = os.times()
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
420 if t[4] == 0.0: # Windows leaves this as zero, so use time.clock()
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
421 t = (t[0], t[1], t[2], t[3], time.clock())
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
422 return t
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
423 s = get_times()
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
424 def print_time():
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
425 t = get_times()
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
426 ui.warn(_("Time: real %.3f secs (user %.3f+%.3f sys %.3f+%.3f)\n") %
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
427 (t[4]-s[4], t[0]-s[0], t[2]-s[2], t[1]-s[1], t[3]-s[3]))
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
428 atexit.register(print_time)
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
429
8136
6b5522cb2ad2 ui: refactor option setting
Matt Mackall <mpm@selenic.com>
parents: 8024
diff changeset
430 if options['verbose'] or options['debug'] or options['quiet']:
6b5522cb2ad2 ui: refactor option setting
Matt Mackall <mpm@selenic.com>
parents: 8024
diff changeset
431 ui.setconfig('ui', 'verbose', str(bool(options['verbose'])))
6b5522cb2ad2 ui: refactor option setting
Matt Mackall <mpm@selenic.com>
parents: 8024
diff changeset
432 ui.setconfig('ui', 'debug', str(bool(options['debug'])))
6b5522cb2ad2 ui: refactor option setting
Matt Mackall <mpm@selenic.com>
parents: 8024
diff changeset
433 ui.setconfig('ui', 'quiet', str(bool(options['quiet'])))
6b5522cb2ad2 ui: refactor option setting
Matt Mackall <mpm@selenic.com>
parents: 8024
diff changeset
434 if options['traceback']:
6b5522cb2ad2 ui: refactor option setting
Matt Mackall <mpm@selenic.com>
parents: 8024
diff changeset
435 ui.setconfig('ui', 'traceback', 'on')
6b5522cb2ad2 ui: refactor option setting
Matt Mackall <mpm@selenic.com>
parents: 8024
diff changeset
436 if options['noninteractive']:
6b5522cb2ad2 ui: refactor option setting
Matt Mackall <mpm@selenic.com>
parents: 8024
diff changeset
437 ui.setconfig('ui', 'interactive', 'off')
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
438
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
439 if options['help']:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
440 return commands.help_(ui, cmd, options['version'])
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
441 elif options['version']:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
442 return commands.version_(ui)
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
443 elif not cmd:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
444 return commands.help_(ui, 'shortlist')
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
445
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
446 repo = None
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
447 if cmd not in commands.norepo.split():
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
448 try:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
449 repo = hg.repository(ui, path=path)
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
450 ui = repo.ui
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
451 if not repo.local():
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
452 raise util.Abort(_("repository '%s' is not local") % path)
6105
6480af8fd53c Set bundle.mainreporoot only after checking that it's a local repo
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5997
diff changeset
453 ui.setconfig("bundle", "mainreporoot", repo.root)
7637
1d54e2f6c0b7 error: move repo errors
Matt Mackall <mpm@selenic.com>
parents: 7636
diff changeset
454 except error.RepoError:
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
455 if cmd not in commands.optionalrepo.split():
6150
aafdea37f796 Infer a --repository argument from command arguments when reasonable.
Jesse Glick <jesse.glick@sun.com>
parents: 6142
diff changeset
456 if args and not path: # try to infer -R from command args
10402
d216fa04e48a mq: make init -Q do what qinit -c did
Brendan Cully <brendan@kublai.com>
parents: 10364
diff changeset
457 repos = map(cmdutil.findrepo, args)
6150
aafdea37f796 Infer a --repository argument from command arguments when reasonable.
Jesse Glick <jesse.glick@sun.com>
parents: 6142
diff changeset
458 guess = repos[0]
aafdea37f796 Infer a --repository argument from command arguments when reasonable.
Jesse Glick <jesse.glick@sun.com>
parents: 6142
diff changeset
459 if guess and repos.count(guess) == len(repos):
aafdea37f796 Infer a --repository argument from command arguments when reasonable.
Jesse Glick <jesse.glick@sun.com>
parents: 6142
diff changeset
460 return _dispatch(ui, ['--repository', guess] + fullargs)
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
461 if not path:
7637
1d54e2f6c0b7 error: move repo errors
Matt Mackall <mpm@selenic.com>
parents: 7636
diff changeset
462 raise error.RepoError(_("There is no Mercurial repository"
1d54e2f6c0b7 error: move repo errors
Matt Mackall <mpm@selenic.com>
parents: 7636
diff changeset
463 " here (.hg not found)"))
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
464 raise
7388
5751631246de dispatch: generalize signature checking for extension command wrapping
Matt Mackall <mpm@selenic.com>
parents: 7280
diff changeset
465 args.insert(0, repo)
7733
30e95eafc1d0 warn if --repository provided for norepo commands
Matt Mackall <mpm@selenic.com>
parents: 7646
diff changeset
466 elif rpath:
30e95eafc1d0 warn if --repository provided for norepo commands
Matt Mackall <mpm@selenic.com>
parents: 7646
diff changeset
467 ui.warn("warning: --repository ignored\n")
7388
5751631246de dispatch: generalize signature checking for extension command wrapping
Matt Mackall <mpm@selenic.com>
parents: 7280
diff changeset
468
5751631246de dispatch: generalize signature checking for extension command wrapping
Matt Mackall <mpm@selenic.com>
parents: 7280
diff changeset
469 d = lambda: util.checksignature(func)(ui, *args, **cmdoptions)
7819
14b703252f14 dispatch: extract command execution block into method
Bill Barry <after.fallout@gmail.com>
parents: 7772
diff changeset
470 return runcommand(lui, repo, cmd, fullargs, ui, options, d)
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
471
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
472 def _runcommand(ui, options, cmd, cmdfunc):
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
473 def checkargs():
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
474 try:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
475 return cmdfunc()
7646
e62a456b8dc5 error: move SignatureError
Matt Mackall <mpm@selenic.com>
parents: 7645
diff changeset
476 except error.SignatureError:
7636
e3f8c6d6b72e error: move ParseError
Matt Mackall <mpm@selenic.com>
parents: 7633
diff changeset
477 raise error.ParseError(cmd, _("invalid arguments"))
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
478
6141
90e5c82a3859 Backed out changeset b913d3aacddc (see issue971/msg5317)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5995
diff changeset
479 if options['profile']:
8023
fd9debb3ea1b profiling: Adding a profiling.format config variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8022
diff changeset
480 format = ui.config('profiling', 'format', default='text')
fd9debb3ea1b profiling: Adding a profiling.format config variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8022
diff changeset
481
8024
9a1b86cfd29e profiling: Adding support for kcachegrind output format, using lsprofcalltree
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8023
diff changeset
482 if not format in ['text', 'kcachegrind']:
8023
fd9debb3ea1b profiling: Adding a profiling.format config variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8022
diff changeset
483 ui.warn(_("unrecognized profiling format '%s'"
fd9debb3ea1b profiling: Adding a profiling.format config variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8022
diff changeset
484 " - Ignored\n") % format)
fd9debb3ea1b profiling: Adding a profiling.format config variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8022
diff changeset
485 format = 'text'
fd9debb3ea1b profiling: Adding a profiling.format config variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8022
diff changeset
486
8022
4f3fdfaa3874 profiling: Adding profiling.output config variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8021
diff changeset
487 output = ui.config('profiling', 'output')
4f3fdfaa3874 profiling: Adding profiling.output config variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8021
diff changeset
488
4f3fdfaa3874 profiling: Adding profiling.output config variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8021
diff changeset
489 if output:
9610
d78fe60f6bda make path expanding more consistent
Alexander Solovyov <piranha@piranha.org.ua>
parents: 9569
diff changeset
490 path = ui.expandpath(output)
8022
4f3fdfaa3874 profiling: Adding profiling.output config variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8021
diff changeset
491 ostream = open(path, 'wb')
4f3fdfaa3874 profiling: Adding profiling.output config variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8021
diff changeset
492 else:
4f3fdfaa3874 profiling: Adding profiling.output config variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8021
diff changeset
493 ostream = sys.stderr
4f3fdfaa3874 profiling: Adding profiling.output config variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8021
diff changeset
494
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
495 try:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
496 from mercurial import lsprof
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
497 except ImportError:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
498 raise util.Abort(_(
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
499 'lsprof not available - install from '
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
500 'http://codespeak.net/svn/user/arigo/hack/misc/lsprof/'))
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
501 p = lsprof.Profiler()
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
502 p.enable(subcalls=True)
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
503 try:
6141
90e5c82a3859 Backed out changeset b913d3aacddc (see issue971/msg5317)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5995
diff changeset
504 return checkargs()
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
505 finally:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
506 p.disable()
8024
9a1b86cfd29e profiling: Adding support for kcachegrind output format, using lsprofcalltree
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8023
diff changeset
507
9a1b86cfd29e profiling: Adding support for kcachegrind output format, using lsprofcalltree
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8023
diff changeset
508 if format == 'kcachegrind':
9a1b86cfd29e profiling: Adding support for kcachegrind output format, using lsprofcalltree
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8023
diff changeset
509 import lsprofcalltree
9a1b86cfd29e profiling: Adding support for kcachegrind output format, using lsprofcalltree
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8023
diff changeset
510 calltree = lsprofcalltree.KCacheGrind(p)
9a1b86cfd29e profiling: Adding support for kcachegrind output format, using lsprofcalltree
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8023
diff changeset
511 calltree.output(ostream)
9a1b86cfd29e profiling: Adding support for kcachegrind output format, using lsprofcalltree
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8023
diff changeset
512 else:
9a1b86cfd29e profiling: Adding support for kcachegrind output format, using lsprofcalltree
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8023
diff changeset
513 # format == 'text'
9a1b86cfd29e profiling: Adding support for kcachegrind output format, using lsprofcalltree
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8023
diff changeset
514 stats = lsprof.Stats(p.getstats())
9a1b86cfd29e profiling: Adding support for kcachegrind output format, using lsprofcalltree
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8023
diff changeset
515 stats.sort()
9a1b86cfd29e profiling: Adding support for kcachegrind output format, using lsprofcalltree
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8023
diff changeset
516 stats.pprint(top=10, file=ostream, climit=5)
8022
4f3fdfaa3874 profiling: Adding profiling.output config variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8021
diff changeset
517
4f3fdfaa3874 profiling: Adding profiling.output config variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8021
diff changeset
518 if output:
4f3fdfaa3874 profiling: Adding profiling.output config variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8021
diff changeset
519 ostream.close()
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
520 else:
6141
90e5c82a3859 Backed out changeset b913d3aacddc (see issue971/msg5317)
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5995
diff changeset
521 return checkargs()