Mercurial > hg-stable
annotate mercurial/dispatch.py @ 11676:e4357c214bf1 stable
alias: ensure checksignature() is applied directly to the command (issue2286)
Aliased commands that received bad arguments would raise TypeError instead of
SignatureError. This only affected commands that weren't wrapped by extensions.
Using util.checksignature() in cmdalias.__call__() ensures SignatureError is
raised correctly.
author | Brodie Rao <brodie@bitheap.org> |
---|---|
date | Thu, 22 Jul 2010 15:26:26 -0400 |
parents | f92f8921a5cc |
children | c5e555e064d0 b6360a113478 9cbc62f68328 |
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 | 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 |
10651
5f091fc1bab7
style: use consistent variable names (*mod) with imports which would shadow
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10564
diff
changeset
|
12 import ui as uimod |
5178
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: |
10651
5f091fc1bab7
style: use consistent variable names (*mod) with imports which would shadow
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10564
diff
changeset
|
21 u = uimod.ui() |
8136
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 |
11288
2123aad24d56
error: add new ParseError for various parsing errors
Matt Mackall <mpm@selenic.com>
parents:
11287
diff
changeset
|
27 except error.ParseError, inst: |
2123aad24d56
error: add new ParseError for various parsing errors
Matt Mackall <mpm@selenic.com>
parents:
11287
diff
changeset
|
28 if len(inst.args) > 1: |
2123aad24d56
error: add new ParseError for various parsing errors
Matt Mackall <mpm@selenic.com>
parents:
11287
diff
changeset
|
29 sys.stderr.write(_("hg: parse error at %s: %s\n") % |
2123aad24d56
error: add new ParseError for various parsing errors
Matt Mackall <mpm@selenic.com>
parents:
11287
diff
changeset
|
30 (inst.args[1], inst.args[0])) |
2123aad24d56
error: add new ParseError for various parsing errors
Matt Mackall <mpm@selenic.com>
parents:
11287
diff
changeset
|
31 else: |
11305
d4cafcb63f77
cleanups: undefined variables
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
11288
diff
changeset
|
32 sys.stderr.write(_("hg: parse error: %s\n") % inst.args[0]) |
9470
ba75830d17a9
dispatch: catch ConfigError while constructing ui
Martin Geisler <mg@lazybytes.net>
parents:
8936
diff
changeset
|
33 return -1 |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
34 return _runcatch(u, args) |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
35 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
36 def _runcatch(ui, args): |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
37 def catchterm(*args): |
7644
182b7114d35a
error: move SignalInterrupt
Matt Mackall <mpm@selenic.com>
parents:
7643
diff
changeset
|
38 raise error.SignalInterrupt |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
39 |
10952
6c2c766afefe
dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents:
10793
diff
changeset
|
40 try: |
6c2c766afefe
dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents:
10793
diff
changeset
|
41 for name in 'SIGBREAK', 'SIGHUP', 'SIGTERM': |
6c2c766afefe
dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents:
10793
diff
changeset
|
42 num = getattr(signal, name, None) |
6c2c766afefe
dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents:
10793
diff
changeset
|
43 if num: |
6c2c766afefe
dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents:
10793
diff
changeset
|
44 signal.signal(num, catchterm) |
6c2c766afefe
dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents:
10793
diff
changeset
|
45 except ValueError: |
6c2c766afefe
dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents:
10793
diff
changeset
|
46 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
|
47 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
48 try: |
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 # enter the debugger before command execution |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
51 if '--debugger' in args: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
52 pdb.set_trace() |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
53 try: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
54 return _dispatch(ui, args) |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
55 finally: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
56 ui.flush() |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
57 except: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
58 # 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
|
59 if '--debugger' in args: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
60 pdb.post_mortem(sys.exc_info()[2]) |
8206
cce63ef1045b
ui: print_exc() -> traceback()
Matt Mackall <mpm@selenic.com>
parents:
8190
diff
changeset
|
61 ui.traceback() |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
62 raise |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
63 |
7645
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
64 # Global exception handling, alphabetically |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
65 # 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
|
66 except error.AmbiguousCommand, inst: |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
67 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
|
68 (inst.args[0], " ".join(inst.args[1]))) |
11288
2123aad24d56
error: add new ParseError for various parsing errors
Matt Mackall <mpm@selenic.com>
parents:
11287
diff
changeset
|
69 except error.ParseError, inst: |
2123aad24d56
error: add new ParseError for various parsing errors
Matt Mackall <mpm@selenic.com>
parents:
11287
diff
changeset
|
70 if len(inst.args) > 1: |
2123aad24d56
error: add new ParseError for various parsing errors
Matt Mackall <mpm@selenic.com>
parents:
11287
diff
changeset
|
71 ui.warn(_("hg: parse error at %s: %s\n") % |
2123aad24d56
error: add new ParseError for various parsing errors
Matt Mackall <mpm@selenic.com>
parents:
11287
diff
changeset
|
72 (inst.args[1], inst.args[0])) |
2123aad24d56
error: add new ParseError for various parsing errors
Matt Mackall <mpm@selenic.com>
parents:
11287
diff
changeset
|
73 else: |
2123aad24d56
error: add new ParseError for various parsing errors
Matt Mackall <mpm@selenic.com>
parents:
11287
diff
changeset
|
74 ui.warn(_("hg: parse error: %s\n") % inst.args[0]) |
2123aad24d56
error: add new ParseError for various parsing errors
Matt Mackall <mpm@selenic.com>
parents:
11287
diff
changeset
|
75 return -1 |
7640 | 76 except error.LockHeld, inst: |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
77 if inst.errno == errno.ETIMEDOUT: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
78 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
|
79 else: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
80 reason = _('lock held by %s') % inst.locker |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
81 ui.warn(_("abort: %s: %s\n") % (inst.desc or inst.filename, reason)) |
7640 | 82 except error.LockUnavailable, inst: |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
83 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
|
84 (inst.desc or inst.filename, inst.strerror)) |
11287
b901bb751999
error: change ParseError to CommandError
Matt Mackall <mpm@selenic.com>
parents:
11209
diff
changeset
|
85 except error.CommandError, inst: |
7645
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
86 if inst.args[0]: |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
87 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
|
88 commands.help_(ui, inst.args[0]) |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
89 else: |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
90 ui.warn(_("hg: %s\n") % inst.args[1]) |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
91 commands.help_(ui, 'shortlist') |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
92 except error.RepoError, inst: |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
93 ui.warn(_("abort: %s!\n") % inst) |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
94 except error.ResponseError, inst: |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
95 ui.warn(_("abort: %s") % inst.args[0]) |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
96 if not isinstance(inst.args[1], basestring): |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
97 ui.warn(" %r\n" % (inst.args[1],)) |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
98 elif not inst.args[1]: |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
99 ui.warn(_(" empty string\n")) |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
100 else: |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
101 ui.warn("\n%r\n" % util.ellipsis(inst.args[1])) |
7633 | 102 except error.RevlogError, inst: |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
103 ui.warn(_("abort: %s!\n") % inst) |
7644
182b7114d35a
error: move SignalInterrupt
Matt Mackall <mpm@selenic.com>
parents:
7643
diff
changeset
|
104 except error.SignalInterrupt: |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
105 ui.warn(_("killed!\n")) |
7645
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
106 except error.UnknownCommand, inst: |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
107 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
|
108 try: |
de1e7099d100
dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents:
10282
diff
changeset
|
109 # 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
|
110 # (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
|
111 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
|
112 except error.UnknownCommand: |
de1e7099d100
dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents:
10282
diff
changeset
|
113 commands.help_(ui, 'shortlist') |
7645
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
114 except util.Abort, inst: |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
115 ui.warn(_("abort: %s\n") % inst) |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
116 except ImportError, inst: |
11053
59d0d715fbfa
dispatch: don't mangle ImportError abort messages
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
10952
diff
changeset
|
117 ui.warn(_("abort: %s!\n") % inst) |
7645
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
118 m = str(inst).split()[-1] |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
119 if m in "mpatch bdiff".split(): |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
120 ui.warn(_("(did you forget to compile extensions?)\n")) |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
121 elif m in "zlib".split(): |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
122 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
|
123 except IOError, inst: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
124 if hasattr(inst, "code"): |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
125 ui.warn(_("abort: %s\n") % inst) |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
126 elif hasattr(inst, "reason"): |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
127 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
|
128 reason = inst.reason.args[1] |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
129 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
|
130 reason = inst.reason |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
131 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
|
132 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
|
133 if ui.debugflag: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
134 ui.warn(_("broken pipe\n")) |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
135 elif getattr(inst, "strerror", None): |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
136 if getattr(inst, "filename", None): |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
137 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
|
138 else: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
139 ui.warn(_("abort: %s\n") % inst.strerror) |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
140 else: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
141 raise |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
142 except OSError, inst: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
143 if getattr(inst, "filename", None): |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
144 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
|
145 else: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
146 ui.warn(_("abort: %s\n") % inst.strerror) |
7645
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
147 except KeyboardInterrupt: |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
148 try: |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
149 ui.warn(_("interrupted!\n")) |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
150 except IOError, inst: |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
151 if inst.errno == errno.EPIPE: |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
152 if ui.debugflag: |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
153 ui.warn(_("\nbroken pipe\n")) |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
154 else: |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
155 raise |
5633
e04a65111a80
dispatch: report OOM rather than traceback
Matt Mackall <mpm@selenic.com>
parents:
5542
diff
changeset
|
156 except MemoryError: |
e04a65111a80
dispatch: report OOM rather than traceback
Matt Mackall <mpm@selenic.com>
parents:
5542
diff
changeset
|
157 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
|
158 except SystemExit, inst: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
159 # 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
|
160 # 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
|
161 return inst.code |
7645
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
162 except socket.error, inst: |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
163 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
|
164 except: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
165 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
|
166 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
|
167 "http://mercurial.selenic.com/bts/\n")) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
168 ui.warn(_("** or mercurial@selenic.com\n")) |
11206
ed71cb07d7b2
dispatch: include Python version in traceback
Martin Geisler <mg@aragost.com>
parents:
11053
diff
changeset
|
169 ui.warn(_("** Python %s\n") % sys.version.replace('\n', '')) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
170 ui.warn(_("** Mercurial Distributed SCM (version %s)\n") |
7632 | 171 % util.version()) |
6985
5cf3bf3c19ba
show extensions loaded on traceback
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
6217
diff
changeset
|
172 ui.warn(_("** Extensions loaded: %s\n") |
5cf3bf3c19ba
show extensions loaded on traceback
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
6217
diff
changeset
|
173 % ", ".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
|
174 raise |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
175 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
176 return -1 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
177 |
8655 | 178 def aliasargs(fn): |
179 if hasattr(fn, 'args'): | |
180 return fn.args | |
181 return [] | |
182 | |
183 class cmdalias(object): | |
184 def __init__(self, name, definition, cmdtable): | |
185 self.name = name | |
186 self.definition = definition | |
187 self.args = [] | |
188 self.opts = [] | |
189 self.help = '' | |
190 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
|
191 self.badalias = False |
8655 | 192 |
193 try: | |
194 cmdutil.findcmd(self.name, cmdtable, True) | |
195 self.shadows = True | |
196 except error.UnknownCommand: | |
197 self.shadows = False | |
198 | |
199 if not self.definition: | |
200 def fn(ui, *args): | |
201 ui.warn(_("no definition for alias '%s'\n") % self.name) | |
202 return 1 | |
203 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
|
204 self.badalias = True |
8655 | 205 |
206 return | |
207 | |
208 args = shlex.split(self.definition) | |
209 cmd = args.pop(0) | |
10793
16df09a54113
expand paths in aliases
Alexander Solovyov <piranha@piranha.org.ua>
parents:
10564
diff
changeset
|
210 args = map(util.expandpath, args) |
8655 | 211 |
212 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
|
213 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
|
214 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
|
215 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
|
216 else: |
8bce1e0d2801
alias: do not crash when aliased command has no usage help text
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9825
diff
changeset
|
217 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
|
218 |
8655 | 219 self.args = aliasargs(self.fn) + args |
220 if cmd not in commands.norepo.split(' '): | |
221 self.norepo = False | |
9876
6e8a16dd3e30
alias: improve help text for command aliases
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
9875
diff
changeset
|
222 if self.help.startswith("hg " + cmd): |
6e8a16dd3e30
alias: improve help text for command aliases
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
9875
diff
changeset
|
223 # 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
|
224 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
|
225 self.__doc__ = self.fn.__doc__ |
9876
6e8a16dd3e30
alias: improve help text for command aliases
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
9875
diff
changeset
|
226 |
8655 | 227 except error.UnknownCommand: |
228 def fn(ui, *args): | |
229 ui.warn(_("alias '%s' resolves to unknown command '%s'\n") \ | |
230 % (self.name, cmd)) | |
10364
de1e7099d100
dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents:
10282
diff
changeset
|
231 try: |
de1e7099d100
dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents:
10282
diff
changeset
|
232 # 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
|
233 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
|
234 except error.UnknownCommand: |
de1e7099d100
dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents:
10282
diff
changeset
|
235 pass |
8655 | 236 return 1 |
237 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
|
238 self.badalias = True |
8655 | 239 except error.AmbiguousCommand: |
240 def fn(ui, *args): | |
241 ui.warn(_("alias '%s' resolves to ambiguous command '%s'\n") \ | |
242 % (self.name, cmd)) | |
243 return 1 | |
244 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
|
245 self.badalias = True |
8655 | 246 |
247 def __call__(self, ui, *args, **opts): | |
248 if self.shadows: | |
9467
4c041f1ee1b4
do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents:
9436
diff
changeset
|
249 ui.debug("alias '%s' shadows command\n" % self.name) |
8655 | 250 |
11676
e4357c214bf1
alias: ensure checksignature() is applied directly to the command (issue2286)
Brodie Rao <brodie@bitheap.org>
parents:
11675
diff
changeset
|
251 return util.checksignature(self.fn)(ui, *args, **opts) |
8655 | 252 |
253 def addaliases(ui, cmdtable): | |
254 # aliases are processed after extensions have been loaded, so they | |
255 # may use extension commands. Aliases can also use other alias definitions, | |
256 # but only if they have been defined prior to the current definition. | |
257 for alias, definition in ui.configitems('alias'): | |
258 aliasdef = cmdalias(alias, definition, cmdtable) | |
259 cmdtable[alias] = (aliasdef, aliasdef.opts, aliasdef.help) | |
260 if aliasdef.norepo: | |
261 commands.norepo += ' %s' % alias | |
262 | |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
263 def _parse(ui, args): |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
264 options = {} |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
265 cmdoptions = {} |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
266 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
267 try: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
268 args = fancyopts.fancyopts(args, commands.globalopts, options) |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
269 except fancyopts.getopt.GetoptError, inst: |
11287
b901bb751999
error: change ParseError to CommandError
Matt Mackall <mpm@selenic.com>
parents:
11209
diff
changeset
|
270 raise error.CommandError(None, inst) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
271 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
272 if args: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
273 cmd, args = args[0], args[1:] |
9875
d6a95c5f6ff9
dispatch: minor refactoring
Henri Wiechers <hwiechers@gmail.com>
parents:
9825
diff
changeset
|
274 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
|
275 ui.config("ui", "strict")) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
276 cmd = aliases[0] |
9875
d6a95c5f6ff9
dispatch: minor refactoring
Henri Wiechers <hwiechers@gmail.com>
parents:
9825
diff
changeset
|
277 args = aliasargs(entry[0]) + args |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
278 defaults = ui.config("defaults", cmd) |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
279 if defaults: |
9610
d78fe60f6bda
make path expanding more consistent
Alexander Solovyov <piranha@piranha.org.ua>
parents:
9569
diff
changeset
|
280 args = map(util.expandpath, shlex.split(defaults)) + args |
9875
d6a95c5f6ff9
dispatch: minor refactoring
Henri Wiechers <hwiechers@gmail.com>
parents:
9825
diff
changeset
|
281 c = list(entry[1]) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
282 else: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
283 cmd = None |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
284 c = [] |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
285 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
286 # combine global options into local |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
287 for o in commands.globalopts: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
288 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
|
289 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
290 try: |
7772
88887054d277
fancyopts: Parse options that occur after arguments.
Augie Fackler <durin42@gmail.com>
parents:
7733
diff
changeset
|
291 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
|
292 except fancyopts.getopt.GetoptError, inst: |
11287
b901bb751999
error: change ParseError to CommandError
Matt Mackall <mpm@selenic.com>
parents:
11209
diff
changeset
|
293 raise error.CommandError(cmd, inst) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
294 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
295 # separate global options back out |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
296 for o in commands.globalopts: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
297 n = o[1] |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
298 options[n] = cmdoptions[n] |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
299 del cmdoptions[n] |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
300 |
9875
d6a95c5f6ff9
dispatch: minor refactoring
Henri Wiechers <hwiechers@gmail.com>
parents:
9825
diff
changeset
|
301 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
|
302 |
8137 | 303 def _parseconfig(ui, config): |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
304 """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
|
305 for cfg in config: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
306 try: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
307 name, value = cfg.split('=', 1) |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
308 section, name = name.split('.', 1) |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
309 if not section or not name: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
310 raise IndexError |
8137 | 311 ui.setconfig(section, name, value) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
312 except (IndexError, ValueError): |
9825
0d850f8beea6
dispatch: better error message for --config option
Bill Schroeder <bschroeder@allstontrading.com>
parents:
9679
diff
changeset
|
313 raise util.Abort(_('malformed --config option: %r ' |
0d850f8beea6
dispatch: better error message for --config option
Bill Schroeder <bschroeder@allstontrading.com>
parents:
9679
diff
changeset
|
314 '(use --config section.name=value)') % cfg) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
315 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
316 def _earlygetopt(aliases, args): |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
317 """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
|
318 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
319 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
|
320 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
|
321 """ |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
322 try: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
323 argcount = args.index("--") |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
324 except ValueError: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
325 argcount = len(args) |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
326 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
|
327 values = [] |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
328 pos = 0 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
329 while pos < argcount: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
330 if args[pos] in aliases: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
331 if pos + 1 >= argcount: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
332 # 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
|
333 break |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
334 del args[pos] |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
335 values.append(args.pop(pos)) |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
336 argcount -= 2 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
337 elif args[pos][:2] in shortopts: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
338 # 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
|
339 values.append(args.pop(pos)[2:]) |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
340 argcount -= 1 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
341 else: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
342 pos += 1 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
343 return values |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
344 |
11330
713ae78bb583
provide pre- and post- hooks with parsed command line arguments.
Chad Dombrova <chadrik@gmail.com>
parents:
11305
diff
changeset
|
345 def runcommand(lui, repo, cmd, fullargs, ui, options, d, cmdpats, cmdoptions): |
7819
14b703252f14
dispatch: extract command execution block into method
Bill Barry <after.fallout@gmail.com>
parents:
7772
diff
changeset
|
346 # run pre-hook, and abort if it fails |
11330
713ae78bb583
provide pre- and post- hooks with parsed command line arguments.
Chad Dombrova <chadrik@gmail.com>
parents:
11305
diff
changeset
|
347 ret = hook.hook(lui, repo, "pre-%s" % cmd, False, args=" ".join(fullargs), |
713ae78bb583
provide pre- and post- hooks with parsed command line arguments.
Chad Dombrova <chadrik@gmail.com>
parents:
11305
diff
changeset
|
348 pats=cmdpats, opts=cmdoptions) |
7819
14b703252f14
dispatch: extract command execution block into method
Bill Barry <after.fallout@gmail.com>
parents:
7772
diff
changeset
|
349 if ret: |
14b703252f14
dispatch: extract command execution block into method
Bill Barry <after.fallout@gmail.com>
parents:
7772
diff
changeset
|
350 return ret |
14b703252f14
dispatch: extract command execution block into method
Bill Barry <after.fallout@gmail.com>
parents:
7772
diff
changeset
|
351 ret = _runcommand(ui, options, cmd, d) |
14b703252f14
dispatch: extract command execution block into method
Bill Barry <after.fallout@gmail.com>
parents:
7772
diff
changeset
|
352 # run post-hook, passing command result |
14b703252f14
dispatch: extract command execution block into method
Bill Barry <after.fallout@gmail.com>
parents:
7772
diff
changeset
|
353 hook.hook(lui, repo, "post-%s" % cmd, False, args=" ".join(fullargs), |
11330
713ae78bb583
provide pre- and post- hooks with parsed command line arguments.
Chad Dombrova <chadrik@gmail.com>
parents:
11305
diff
changeset
|
354 result=ret, pats=cmdpats, opts=cmdoptions) |
7819
14b703252f14
dispatch: extract command execution block into method
Bill Barry <after.fallout@gmail.com>
parents:
7772
diff
changeset
|
355 return ret |
14b703252f14
dispatch: extract command execution block into method
Bill Barry <after.fallout@gmail.com>
parents:
7772
diff
changeset
|
356 |
8304
991ca609ccd6
dispatch: remember loaded extensions in a real set
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
357 _loaded = set() |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
358 def _dispatch(ui, args): |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
359 # read --config before doing anything else |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
360 # (e.g. to change trust settings for reading .hg/hgrc) |
8137 | 361 _parseconfig(ui, _earlygetopt(['--config'], args)) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
362 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
363 # check for cwd |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
364 cwd = _earlygetopt(['--cwd'], args) |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
365 if cwd: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
366 os.chdir(cwd[-1]) |
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 # read the local repository .hgrc into a local ui object |
11675
f92f8921a5cc
dispatch: give better error message when cwd doesn't exist (issue2293)
Mads Kiilerich <mads@kiilerich.com>
parents:
11600
diff
changeset
|
369 try: |
f92f8921a5cc
dispatch: give better error message when cwd doesn't exist (issue2293)
Mads Kiilerich <mads@kiilerich.com>
parents:
11600
diff
changeset
|
370 wd = os.getcwd() |
f92f8921a5cc
dispatch: give better error message when cwd doesn't exist (issue2293)
Mads Kiilerich <mads@kiilerich.com>
parents:
11600
diff
changeset
|
371 except OSError, e: |
f92f8921a5cc
dispatch: give better error message when cwd doesn't exist (issue2293)
Mads Kiilerich <mads@kiilerich.com>
parents:
11600
diff
changeset
|
372 raise util.Abort(_("error getting current working directory: %s") % |
f92f8921a5cc
dispatch: give better error message when cwd doesn't exist (issue2293)
Mads Kiilerich <mads@kiilerich.com>
parents:
11600
diff
changeset
|
373 e.strerror) |
f92f8921a5cc
dispatch: give better error message when cwd doesn't exist (issue2293)
Mads Kiilerich <mads@kiilerich.com>
parents:
11600
diff
changeset
|
374 path = cmdutil.findrepo(wd) or "" |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
375 if not path: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
376 lui = ui |
9436 | 377 else: |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
378 try: |
8190
9b8ac5fb7760
ui: kill most users of parentui name and arg, replace with .copy()
Matt Mackall <mpm@selenic.com>
parents:
8144
diff
changeset
|
379 lui = ui.copy() |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
380 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
|
381 except IOError: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
382 pass |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
383 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
384 # 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
|
385 rpath = _earlygetopt(["-R", "--repository", "--repo"], args) |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
386 if rpath: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
387 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
|
388 lui = ui.copy() |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
389 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
|
390 |
9410
1c83938b6a8e
extensions: load and configure extensions in well-defined phases
Martin Geisler <mg@lazybytes.net>
parents:
8936
diff
changeset
|
391 # 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
|
392 # 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
|
393 # 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
|
394 extensions.loadall(lui) |
9410
1c83938b6a8e
extensions: load and configure extensions in well-defined phases
Martin Geisler <mg@lazybytes.net>
parents:
8936
diff
changeset
|
395 exts = [ext for ext in extensions.extensions() if ext[0] not in _loaded] |
11555
d8d0fc3988ca
color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents:
11330
diff
changeset
|
396 # Propagate any changes to lui.__class__ by extensions |
d8d0fc3988ca
color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents:
11330
diff
changeset
|
397 ui.__class__ = lui.__class__ |
5828
863e237b58fb
dispatch: allow extensions to provide setup code
Kirill Smelkov <kirr@mns.spb.ru>
parents:
5664
diff
changeset
|
398 |
9660
e0eae93e6c67
extensions: changed to call extsetup() from extensions.loadall()
Yuya Nishihara <yuya@tcha.org>
parents:
9610
diff
changeset
|
399 # (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
|
400 |
9410
1c83938b6a8e
extensions: load and configure extensions in well-defined phases
Martin Geisler <mg@lazybytes.net>
parents:
8936
diff
changeset
|
401 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
|
402 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
|
403 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
|
404 if overrides: |
60acf1432ee0
Move cmdtable and reposetup handling out of extensions.py
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5178
diff
changeset
|
405 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
|
406 % (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
|
407 commands.table.update(cmdtable) |
8304
991ca609ccd6
dispatch: remember loaded extensions in a real set
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
408 _loaded.add(name) |
8655 | 409 |
9410
1c83938b6a8e
extensions: load and configure extensions in well-defined phases
Martin Geisler <mg@lazybytes.net>
parents:
8936
diff
changeset
|
410 # (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
|
411 |
8655 | 412 addaliases(lui, commands.table) |
413 | |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
414 # check for fallback encoding |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
415 fallback = lui.config('ui', 'fallbackencoding') |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
416 if fallback: |
7948
de377b1a9a84
move encoding bits from util to encoding
Matt Mackall <mpm@selenic.com>
parents:
7873
diff
changeset
|
417 encoding.fallbackencoding = fallback |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
418 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
419 fullargs = args |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
420 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
|
421 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
422 if options["config"]: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
423 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
|
424 if options["cwd"]: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
425 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
|
426 if options["repository"]: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
427 raise util.Abort(_( |
8911
62e3b9466700
translated a bunch of strings to danish
Sune Foldager <cryo@cyanite.org>
parents:
8655
diff
changeset
|
428 "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
|
429 "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
|
430 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
431 if options["encoding"]: |
7948
de377b1a9a84
move encoding bits from util to encoding
Matt Mackall <mpm@selenic.com>
parents:
7873
diff
changeset
|
432 encoding.encoding = options["encoding"] |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
433 if options["encodingmode"]: |
7948
de377b1a9a84
move encoding bits from util to encoding
Matt Mackall <mpm@selenic.com>
parents:
7873
diff
changeset
|
434 encoding.encodingmode = options["encodingmode"] |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
435 if options["time"]: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
436 def get_times(): |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
437 t = os.times() |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
438 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
|
439 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
|
440 return t |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
441 s = get_times() |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
442 def print_time(): |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
443 t = get_times() |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
444 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
|
445 (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
|
446 atexit.register(print_time) |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
447 |
8136
6b5522cb2ad2
ui: refactor option setting
Matt Mackall <mpm@selenic.com>
parents:
8024
diff
changeset
|
448 if options['verbose'] or options['debug'] or options['quiet']: |
6b5522cb2ad2
ui: refactor option setting
Matt Mackall <mpm@selenic.com>
parents:
8024
diff
changeset
|
449 ui.setconfig('ui', 'verbose', str(bool(options['verbose']))) |
6b5522cb2ad2
ui: refactor option setting
Matt Mackall <mpm@selenic.com>
parents:
8024
diff
changeset
|
450 ui.setconfig('ui', 'debug', str(bool(options['debug']))) |
6b5522cb2ad2
ui: refactor option setting
Matt Mackall <mpm@selenic.com>
parents:
8024
diff
changeset
|
451 ui.setconfig('ui', 'quiet', str(bool(options['quiet']))) |
6b5522cb2ad2
ui: refactor option setting
Matt Mackall <mpm@selenic.com>
parents:
8024
diff
changeset
|
452 if options['traceback']: |
6b5522cb2ad2
ui: refactor option setting
Matt Mackall <mpm@selenic.com>
parents:
8024
diff
changeset
|
453 ui.setconfig('ui', 'traceback', 'on') |
6b5522cb2ad2
ui: refactor option setting
Matt Mackall <mpm@selenic.com>
parents:
8024
diff
changeset
|
454 if options['noninteractive']: |
6b5522cb2ad2
ui: refactor option setting
Matt Mackall <mpm@selenic.com>
parents:
8024
diff
changeset
|
455 ui.setconfig('ui', 'interactive', 'off') |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
456 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
457 if options['help']: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
458 return commands.help_(ui, cmd, options['version']) |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
459 elif options['version']: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
460 return commands.version_(ui) |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
461 elif not cmd: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
462 return commands.help_(ui, 'shortlist') |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
463 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
464 repo = None |
11330
713ae78bb583
provide pre- and post- hooks with parsed command line arguments.
Chad Dombrova <chadrik@gmail.com>
parents:
11305
diff
changeset
|
465 cmdpats = args[:] |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
466 if cmd not in commands.norepo.split(): |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
467 try: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
468 repo = hg.repository(ui, path=path) |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
469 ui = repo.ui |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
470 if not repo.local(): |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
471 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
|
472 ui.setconfig("bundle", "mainreporoot", repo.root) |
7637 | 473 except error.RepoError: |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
474 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
|
475 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
|
476 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
|
477 guess = repos[0] |
aafdea37f796
Infer a --repository argument from command arguments when reasonable.
Jesse Glick <jesse.glick@sun.com>
parents:
6142
diff
changeset
|
478 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
|
479 return _dispatch(ui, ['--repository', guess] + fullargs) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
480 if not path: |
7637 | 481 raise error.RepoError(_("There is no Mercurial repository" |
482 " here (.hg not found)")) | |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
483 raise |
7388
5751631246de
dispatch: generalize signature checking for extension command wrapping
Matt Mackall <mpm@selenic.com>
parents:
7280
diff
changeset
|
484 args.insert(0, repo) |
7733
30e95eafc1d0
warn if --repository provided for norepo commands
Matt Mackall <mpm@selenic.com>
parents:
7646
diff
changeset
|
485 elif rpath: |
11600
76454cbc11e4
mark ui.warn strings for translation
Martin Geisler <mg@lazybytes.net>
parents:
11555
diff
changeset
|
486 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
|
487 |
5751631246de
dispatch: generalize signature checking for extension command wrapping
Matt Mackall <mpm@selenic.com>
parents:
7280
diff
changeset
|
488 d = lambda: util.checksignature(func)(ui, *args, **cmdoptions) |
11330
713ae78bb583
provide pre- and post- hooks with parsed command line arguments.
Chad Dombrova <chadrik@gmail.com>
parents:
11305
diff
changeset
|
489 return runcommand(lui, repo, cmd, fullargs, ui, options, d, |
713ae78bb583
provide pre- and post- hooks with parsed command line arguments.
Chad Dombrova <chadrik@gmail.com>
parents:
11305
diff
changeset
|
490 cmdpats, cmdoptions) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
491 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
492 def _runcommand(ui, options, cmd, cmdfunc): |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
493 def checkargs(): |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
494 try: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
495 return cmdfunc() |
7646 | 496 except error.SignatureError: |
11287
b901bb751999
error: change ParseError to CommandError
Matt Mackall <mpm@selenic.com>
parents:
11209
diff
changeset
|
497 raise error.CommandError(cmd, _("invalid arguments")) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
498 |
6141
90e5c82a3859
Backed out changeset b913d3aacddc (see issue971/msg5317)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
5995
diff
changeset
|
499 if options['profile']: |
8023
fd9debb3ea1b
profiling: Adding a profiling.format config variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8022
diff
changeset
|
500 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
|
501 |
8024
9a1b86cfd29e
profiling: Adding support for kcachegrind output format, using lsprofcalltree
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8023
diff
changeset
|
502 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
|
503 ui.warn(_("unrecognized profiling format '%s'" |
fd9debb3ea1b
profiling: Adding a profiling.format config variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8022
diff
changeset
|
504 " - Ignored\n") % format) |
fd9debb3ea1b
profiling: Adding a profiling.format config variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8022
diff
changeset
|
505 format = 'text' |
fd9debb3ea1b
profiling: Adding a profiling.format config variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8022
diff
changeset
|
506 |
8022
4f3fdfaa3874
profiling: Adding profiling.output config variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8021
diff
changeset
|
507 output = ui.config('profiling', 'output') |
4f3fdfaa3874
profiling: Adding profiling.output config variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8021
diff
changeset
|
508 |
4f3fdfaa3874
profiling: Adding profiling.output config variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8021
diff
changeset
|
509 if output: |
9610
d78fe60f6bda
make path expanding more consistent
Alexander Solovyov <piranha@piranha.org.ua>
parents:
9569
diff
changeset
|
510 path = ui.expandpath(output) |
8022
4f3fdfaa3874
profiling: Adding profiling.output config variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8021
diff
changeset
|
511 ostream = open(path, 'wb') |
4f3fdfaa3874
profiling: Adding profiling.output config variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8021
diff
changeset
|
512 else: |
4f3fdfaa3874
profiling: Adding profiling.output config variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8021
diff
changeset
|
513 ostream = sys.stderr |
4f3fdfaa3874
profiling: Adding profiling.output config variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8021
diff
changeset
|
514 |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
515 try: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
516 from mercurial import lsprof |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
517 except ImportError: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
518 raise util.Abort(_( |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
519 'lsprof not available - install from ' |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
520 '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
|
521 p = lsprof.Profiler() |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
522 p.enable(subcalls=True) |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
523 try: |
6141
90e5c82a3859
Backed out changeset b913d3aacddc (see issue971/msg5317)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
5995
diff
changeset
|
524 return checkargs() |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
525 finally: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
526 p.disable() |
8024
9a1b86cfd29e
profiling: Adding support for kcachegrind output format, using lsprofcalltree
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8023
diff
changeset
|
527 |
9a1b86cfd29e
profiling: Adding support for kcachegrind output format, using lsprofcalltree
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8023
diff
changeset
|
528 if format == 'kcachegrind': |
9a1b86cfd29e
profiling: Adding support for kcachegrind output format, using lsprofcalltree
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8023
diff
changeset
|
529 import lsprofcalltree |
9a1b86cfd29e
profiling: Adding support for kcachegrind output format, using lsprofcalltree
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8023
diff
changeset
|
530 calltree = lsprofcalltree.KCacheGrind(p) |
9a1b86cfd29e
profiling: Adding support for kcachegrind output format, using lsprofcalltree
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8023
diff
changeset
|
531 calltree.output(ostream) |
9a1b86cfd29e
profiling: Adding support for kcachegrind output format, using lsprofcalltree
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8023
diff
changeset
|
532 else: |
9a1b86cfd29e
profiling: Adding support for kcachegrind output format, using lsprofcalltree
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8023
diff
changeset
|
533 # format == 'text' |
9a1b86cfd29e
profiling: Adding support for kcachegrind output format, using lsprofcalltree
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8023
diff
changeset
|
534 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
|
535 stats.sort() |
9a1b86cfd29e
profiling: Adding support for kcachegrind output format, using lsprofcalltree
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8023
diff
changeset
|
536 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
|
537 |
4f3fdfaa3874
profiling: Adding profiling.output config variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8021
diff
changeset
|
538 if output: |
4f3fdfaa3874
profiling: Adding profiling.output config variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8021
diff
changeset
|
539 ostream.close() |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
540 else: |
6141
90e5c82a3859
Backed out changeset b913d3aacddc (see issue971/msg5317)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
5995
diff
changeset
|
541 return checkargs() |