Mercurial > hg
annotate mercurial/dispatch.py @ 19126:5c5152af0d15
log-style: add a log style that is default+phase (issue3436)
There is a new style called phases style.
Usage::
hg log --style phases
Why do we need this new style - in what way is it different from or similar to
existing styles?
The new style is default + phases information. With the new phases feature the
users exhibited their desire for a new style that could help them.
Why do this need a new style - couldn't it be folded into an existing style?
The default style and the new one are about the same, the difference is the
phases tag. The users find both styles useful, this means that the both styles
must exist.
author | Iulian Stana <julian.stana@gmail.com> |
---|---|
date | Thu, 18 Apr 2013 22:56:57 +0300 |
parents | fc081623f4bd |
children | 41e39a0299cb |
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 _ |
11989
f853873fc66d
aliases: provide more flexible ways to work with shell alias arguments
Steve Losh <steve@stevelosh.com>
parents:
11985
diff
changeset
|
9 import os, sys, atexit, signal, pdb, socket, errno, shlex, time, traceback, re |
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 |
14438
08bfec2ef031
dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents:
14286
diff
changeset
|
14 class request(object): |
16683 | 15 def __init__(self, args, ui=None, repo=None, fin=None, fout=None, |
16 ferr=None): | |
14438
08bfec2ef031
dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents:
14286
diff
changeset
|
17 self.args = args |
14439
80c599eee3f3
dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents:
14438
diff
changeset
|
18 self.ui = ui |
14510
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
19 self.repo = repo |
14438
08bfec2ef031
dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents:
14286
diff
changeset
|
20 |
14613
ea8938d3a5aa
dispatch: add I/O descriptors to the request
Idan Kamara <idankk86@gmail.com>
parents:
14601
diff
changeset
|
21 # input/output/error streams |
ea8938d3a5aa
dispatch: add I/O descriptors to the request
Idan Kamara <idankk86@gmail.com>
parents:
14601
diff
changeset
|
22 self.fin = fin |
ea8938d3a5aa
dispatch: add I/O descriptors to the request
Idan Kamara <idankk86@gmail.com>
parents:
14601
diff
changeset
|
23 self.fout = fout |
ea8938d3a5aa
dispatch: add I/O descriptors to the request
Idan Kamara <idankk86@gmail.com>
parents:
14601
diff
changeset
|
24 self.ferr = ferr |
ea8938d3a5aa
dispatch: add I/O descriptors to the request
Idan Kamara <idankk86@gmail.com>
parents:
14601
diff
changeset
|
25 |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
26 def run(): |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
27 "run the command in sys.argv" |
15439
01611e7c36ff
dispatch: exit with 8-bit exit code
Mads Kiilerich <mads@kiilerich.com>
parents:
15233
diff
changeset
|
28 sys.exit((dispatch(request(sys.argv[1:])) or 0) & 255) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
29 |
14438
08bfec2ef031
dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents:
14286
diff
changeset
|
30 def dispatch(req): |
08bfec2ef031
dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents:
14286
diff
changeset
|
31 "run the command specified in req.args" |
14615
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
32 if req.ferr: |
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
33 ferr = req.ferr |
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
34 elif req.ui: |
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
35 ferr = req.ui.ferr |
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
36 else: |
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
37 ferr = sys.stderr |
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
38 |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
39 try: |
14439
80c599eee3f3
dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents:
14438
diff
changeset
|
40 if not req.ui: |
80c599eee3f3
dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents:
14438
diff
changeset
|
41 req.ui = uimod.ui() |
14438
08bfec2ef031
dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents:
14286
diff
changeset
|
42 if '--traceback' in req.args: |
14439
80c599eee3f3
dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents:
14438
diff
changeset
|
43 req.ui.setconfig('ui', 'traceback', 'on') |
14615
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
44 |
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
45 # set ui streams from the request |
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
46 if req.fin: |
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
47 req.ui.fin = req.fin |
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
48 if req.fout: |
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
49 req.ui.fout = req.fout |
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
50 if req.ferr: |
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
51 req.ui.ferr = req.ferr |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
52 except util.Abort, inst: |
14615
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
53 ferr.write(_("abort: %s\n") % inst) |
11574
6381fa7bfa53
Abort: add a hint argument, printed in the next line inside parenthesis
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
11556
diff
changeset
|
54 if inst.hint: |
14615
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
55 ferr.write(_("(%s)\n") % inst.hint) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
56 return -1 |
11288
2123aad24d56
error: add new ParseError for various parsing errors
Matt Mackall <mpm@selenic.com>
parents:
11287
diff
changeset
|
57 except error.ParseError, inst: |
2123aad24d56
error: add new ParseError for various parsing errors
Matt Mackall <mpm@selenic.com>
parents:
11287
diff
changeset
|
58 if len(inst.args) > 1: |
14615
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
59 ferr.write(_("hg: parse error at %s: %s\n") % |
11288
2123aad24d56
error: add new ParseError for various parsing errors
Matt Mackall <mpm@selenic.com>
parents:
11287
diff
changeset
|
60 (inst.args[1], inst.args[0])) |
2123aad24d56
error: add new ParseError for various parsing errors
Matt Mackall <mpm@selenic.com>
parents:
11287
diff
changeset
|
61 else: |
14615
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
62 ferr.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
|
63 return -1 |
14615
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
64 |
14439
80c599eee3f3
dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents:
14438
diff
changeset
|
65 return _runcatch(req) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
66 |
14439
80c599eee3f3
dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents:
14438
diff
changeset
|
67 def _runcatch(req): |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
68 def catchterm(*args): |
7644
182b7114d35a
error: move SignalInterrupt
Matt Mackall <mpm@selenic.com>
parents:
7643
diff
changeset
|
69 raise error.SignalInterrupt |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
70 |
14439
80c599eee3f3
dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents:
14438
diff
changeset
|
71 ui = req.ui |
10952
6c2c766afefe
dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents:
10793
diff
changeset
|
72 try: |
6c2c766afefe
dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents:
10793
diff
changeset
|
73 for name in 'SIGBREAK', 'SIGHUP', 'SIGTERM': |
6c2c766afefe
dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents:
10793
diff
changeset
|
74 num = getattr(signal, name, None) |
6c2c766afefe
dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents:
10793
diff
changeset
|
75 if num: |
6c2c766afefe
dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents:
10793
diff
changeset
|
76 signal.signal(num, catchterm) |
6c2c766afefe
dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents:
10793
diff
changeset
|
77 except ValueError: |
6c2c766afefe
dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents:
10793
diff
changeset
|
78 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
|
79 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
80 try: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
81 try: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
82 # enter the debugger before command execution |
14438
08bfec2ef031
dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents:
14286
diff
changeset
|
83 if '--debugger' in req.args: |
11495
6ee107782018
debugger: give a little intro before entering pdb
Mads Kiilerich <mads@kiilerich.com>
parents:
11494
diff
changeset
|
84 ui.warn(_("entering debugger - " |
6ee107782018
debugger: give a little intro before entering pdb
Mads Kiilerich <mads@kiilerich.com>
parents:
11494
diff
changeset
|
85 "type c to continue starting hg or h for help\n")) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
86 pdb.set_trace() |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
87 try: |
14439
80c599eee3f3
dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents:
14438
diff
changeset
|
88 return _dispatch(req) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
89 finally: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
90 ui.flush() |
16705
c2d9ef43ff6c
check-code: ignore naked excepts with a "re-raise" comment
Brodie Rao <brodie@sf.io>
parents:
16686
diff
changeset
|
91 except: # re-raises |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
92 # enter the debugger when we hit an exception |
14438
08bfec2ef031
dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents:
14286
diff
changeset
|
93 if '--debugger' in req.args: |
11494
2347513f562a
debugger: show traceback before entering pdb post-mortem
Mads Kiilerich <mads@kiilerich.com>
parents:
11330
diff
changeset
|
94 traceback.print_exc() |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
95 pdb.post_mortem(sys.exc_info()[2]) |
8206
cce63ef1045b
ui: print_exc() -> traceback()
Matt Mackall <mpm@selenic.com>
parents:
8190
diff
changeset
|
96 ui.traceback() |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
97 raise |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
98 |
7645
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
99 # Global exception handling, alphabetically |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
100 # 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
|
101 except error.AmbiguousCommand, inst: |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
102 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
|
103 (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
|
104 except error.ParseError, inst: |
2123aad24d56
error: add new ParseError for various parsing errors
Matt Mackall <mpm@selenic.com>
parents:
11287
diff
changeset
|
105 if len(inst.args) > 1: |
2123aad24d56
error: add new ParseError for various parsing errors
Matt Mackall <mpm@selenic.com>
parents:
11287
diff
changeset
|
106 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
|
107 (inst.args[1], inst.args[0])) |
2123aad24d56
error: add new ParseError for various parsing errors
Matt Mackall <mpm@selenic.com>
parents:
11287
diff
changeset
|
108 else: |
2123aad24d56
error: add new ParseError for various parsing errors
Matt Mackall <mpm@selenic.com>
parents:
11287
diff
changeset
|
109 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
|
110 return -1 |
7640 | 111 except error.LockHeld, inst: |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
112 if inst.errno == errno.ETIMEDOUT: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
113 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
|
114 else: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
115 reason = _('lock held by %s') % inst.locker |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
116 ui.warn(_("abort: %s: %s\n") % (inst.desc or inst.filename, reason)) |
7640 | 117 except error.LockUnavailable, inst: |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
118 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
|
119 (inst.desc or inst.filename, inst.strerror)) |
11287
b901bb751999
error: change ParseError to CommandError
Matt Mackall <mpm@selenic.com>
parents:
11209
diff
changeset
|
120 except error.CommandError, inst: |
7645
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
121 if inst.args[0]: |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
122 ui.warn(_("hg %s: %s\n") % (inst.args[0], inst.args[1])) |
14286
005a540e9aee
help: add -c/--command flag to only show command help (issue2799)
Martin Geisler <mg@aragost.com>
parents:
14265
diff
changeset
|
123 commands.help_(ui, inst.args[0], full=False, command=True) |
7645
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
124 else: |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
125 ui.warn(_("hg: %s\n") % inst.args[1]) |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
126 commands.help_(ui, 'shortlist') |
15017
f4522df38c65
wireproto: add out-of-band error class to allow remote repo to report errors
Andrew Pritchard <andrewp@fogcreek.com>
parents:
14999
diff
changeset
|
127 except error.OutOfBandError, inst: |
15497
9bea3aed6ee1
add missing localization markup
Mads Kiilerich <mads@kiilerich.com>
parents:
15233
diff
changeset
|
128 ui.warn(_("abort: remote error:\n")) |
15017
f4522df38c65
wireproto: add out-of-band error class to allow remote repo to report errors
Andrew Pritchard <andrewp@fogcreek.com>
parents:
14999
diff
changeset
|
129 ui.warn(''.join(inst.args)) |
7645
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
130 except error.RepoError, inst: |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
131 ui.warn(_("abort: %s!\n") % inst) |
14761
1a9256cdf10f
error: Add a hint argument to RepoError
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
14754
diff
changeset
|
132 if inst.hint: |
1a9256cdf10f
error: Add a hint argument to RepoError
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
14754
diff
changeset
|
133 ui.warn(_("(%s)\n") % inst.hint) |
7645
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
134 except error.ResponseError, inst: |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
135 ui.warn(_("abort: %s") % inst.args[0]) |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
136 if not isinstance(inst.args[1], basestring): |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
137 ui.warn(" %r\n" % (inst.args[1],)) |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
138 elif not inst.args[1]: |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
139 ui.warn(_(" empty string\n")) |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
140 else: |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
141 ui.warn("\n%r\n" % util.ellipsis(inst.args[1])) |
7633 | 142 except error.RevlogError, inst: |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
143 ui.warn(_("abort: %s!\n") % inst) |
7644
182b7114d35a
error: move SignalInterrupt
Matt Mackall <mpm@selenic.com>
parents:
7643
diff
changeset
|
144 except error.SignalInterrupt: |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
145 ui.warn(_("killed!\n")) |
7645
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
146 except error.UnknownCommand, inst: |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
147 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
|
148 try: |
de1e7099d100
dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents:
10282
diff
changeset
|
149 # 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
|
150 # (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
|
151 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
|
152 except error.UnknownCommand: |
de1e7099d100
dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents:
10282
diff
changeset
|
153 commands.help_(ui, 'shortlist') |
18932
7b4b9e8ea12e
dispatch: catch InterventionRequired and print the message with no prefix
Augie Fackler <raf@durin42.com>
parents:
18758
diff
changeset
|
154 except error.InterventionRequired, inst: |
7b4b9e8ea12e
dispatch: catch InterventionRequired and print the message with no prefix
Augie Fackler <raf@durin42.com>
parents:
18758
diff
changeset
|
155 ui.warn("%s\n" % inst) |
18935
e5d9441ec281
dispatch: exit with status 1 for an InterventionRequired exception (bc)
Augie Fackler <raf@durin42.com>
parents:
18932
diff
changeset
|
156 return 1 |
7645
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
157 except util.Abort, inst: |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
158 ui.warn(_("abort: %s\n") % inst) |
11574
6381fa7bfa53
Abort: add a hint argument, printed in the next line inside parenthesis
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
11556
diff
changeset
|
159 if inst.hint: |
11683
757f39fa1162
dispatch: write Abort hint to stderr too
Patrick Mezard <pmezard@gmail.com>
parents:
11601
diff
changeset
|
160 ui.warn(_("(%s)\n") % inst.hint) |
7645
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
161 except ImportError, inst: |
11053
59d0d715fbfa
dispatch: don't mangle ImportError abort messages
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
10952
diff
changeset
|
162 ui.warn(_("abort: %s!\n") % inst) |
7645
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
163 m = str(inst).split()[-1] |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
164 if m in "mpatch bdiff".split(): |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
165 ui.warn(_("(did you forget to compile extensions?)\n")) |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
166 elif m in "zlib".split(): |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
167 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
|
168 except IOError, inst: |
14950
144e97421f6b
dispatch: use safehasattr instead of hasattr
Augie Fackler <durin42@gmail.com>
parents:
14918
diff
changeset
|
169 if util.safehasattr(inst, "code"): |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
170 ui.warn(_("abort: %s\n") % inst) |
14950
144e97421f6b
dispatch: use safehasattr instead of hasattr
Augie Fackler <durin42@gmail.com>
parents:
14918
diff
changeset
|
171 elif util.safehasattr(inst, "reason"): |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
172 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
|
173 reason = inst.reason.args[1] |
14096
dea93484cf9f
dispatch: handle IndexErrors
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
14004
diff
changeset
|
174 except (AttributeError, IndexError): |
17299
e51d4aedace9
check-code: indent 4 spaces in py files
Mads Kiilerich <mads@kiilerich.com>
parents:
17228
diff
changeset
|
175 # it might be anything, for example a string |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
176 reason = inst.reason |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
177 ui.warn(_("abort: error: %s\n") % reason) |
14950
144e97421f6b
dispatch: use safehasattr instead of hasattr
Augie Fackler <durin42@gmail.com>
parents:
14918
diff
changeset
|
178 elif util.safehasattr(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
|
179 if ui.debugflag: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
180 ui.warn(_("broken pipe\n")) |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
181 elif getattr(inst, "strerror", None): |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
182 if getattr(inst, "filename", None): |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
183 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
|
184 else: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
185 ui.warn(_("abort: %s\n") % inst.strerror) |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
186 else: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
187 raise |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
188 except OSError, inst: |
18227
720308f741cb
dispatch: show empty filename in OSError aborts
Mads Kiilerich <mads@kiilerich.com>
parents:
18224
diff
changeset
|
189 if getattr(inst, "filename", None) is not None: |
720308f741cb
dispatch: show empty filename in OSError aborts
Mads Kiilerich <mads@kiilerich.com>
parents:
18224
diff
changeset
|
190 ui.warn(_("abort: %s: '%s'\n") % (inst.strerror, inst.filename)) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
191 else: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
192 ui.warn(_("abort: %s\n") % inst.strerror) |
7645
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
193 except KeyboardInterrupt: |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
194 try: |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
195 ui.warn(_("interrupted!\n")) |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
196 except IOError, inst: |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
197 if inst.errno == errno.EPIPE: |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
198 if ui.debugflag: |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
199 ui.warn(_("\nbroken pipe\n")) |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
200 else: |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
201 raise |
5633
e04a65111a80
dispatch: report OOM rather than traceback
Matt Mackall <mpm@selenic.com>
parents:
5542
diff
changeset
|
202 except MemoryError: |
e04a65111a80
dispatch: report OOM rather than traceback
Matt Mackall <mpm@selenic.com>
parents:
5542
diff
changeset
|
203 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
|
204 except SystemExit, inst: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
205 # 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
|
206 # 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
|
207 return inst.code |
7645
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
208 except socket.error, inst: |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
209 ui.warn(_("abort: %s\n") % inst.args[-1]) |
16705
c2d9ef43ff6c
check-code: ignore naked excepts with a "re-raise" comment
Brodie Rao <brodie@sf.io>
parents:
16686
diff
changeset
|
210 except: # re-raises |
16744
1c9f58a6c8f1
dispatch: try and identify third-party extensions as sources of tracebacks
Augie Fackler <raf@durin42.com>
parents:
16705
diff
changeset
|
211 myver = util.version() |
1c9f58a6c8f1
dispatch: try and identify third-party extensions as sources of tracebacks
Augie Fackler <raf@durin42.com>
parents:
16705
diff
changeset
|
212 # For compatibility checking, we discard the portion of the hg |
1c9f58a6c8f1
dispatch: try and identify third-party extensions as sources of tracebacks
Augie Fackler <raf@durin42.com>
parents:
16705
diff
changeset
|
213 # version after the + on the assumption that if a "normal |
1c9f58a6c8f1
dispatch: try and identify third-party extensions as sources of tracebacks
Augie Fackler <raf@durin42.com>
parents:
16705
diff
changeset
|
214 # user" is running a build with a + in it the packager |
1c9f58a6c8f1
dispatch: try and identify third-party extensions as sources of tracebacks
Augie Fackler <raf@durin42.com>
parents:
16705
diff
changeset
|
215 # probably built from fairly close to a tag and anyone with a |
1c9f58a6c8f1
dispatch: try and identify third-party extensions as sources of tracebacks
Augie Fackler <raf@durin42.com>
parents:
16705
diff
changeset
|
216 # 'make local' copy of hg (where the version number can be out |
1c9f58a6c8f1
dispatch: try and identify third-party extensions as sources of tracebacks
Augie Fackler <raf@durin42.com>
parents:
16705
diff
changeset
|
217 # of date) will be clueful enough to notice the implausible |
1c9f58a6c8f1
dispatch: try and identify third-party extensions as sources of tracebacks
Augie Fackler <raf@durin42.com>
parents:
16705
diff
changeset
|
218 # version number and try updating. |
1c9f58a6c8f1
dispatch: try and identify third-party extensions as sources of tracebacks
Augie Fackler <raf@durin42.com>
parents:
16705
diff
changeset
|
219 compare = myver.split('+')[0] |
1c9f58a6c8f1
dispatch: try and identify third-party extensions as sources of tracebacks
Augie Fackler <raf@durin42.com>
parents:
16705
diff
changeset
|
220 ct = tuplever(compare) |
1c9f58a6c8f1
dispatch: try and identify third-party extensions as sources of tracebacks
Augie Fackler <raf@durin42.com>
parents:
16705
diff
changeset
|
221 worst = None, ct, '' |
1c9f58a6c8f1
dispatch: try and identify third-party extensions as sources of tracebacks
Augie Fackler <raf@durin42.com>
parents:
16705
diff
changeset
|
222 for name, mod in extensions.extensions(): |
18224
0f9013112eba
dispatch: handle empty `testedwith` value in extension
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17773
diff
changeset
|
223 testedwith = getattr(mod, 'testedwith', '') |
16744
1c9f58a6c8f1
dispatch: try and identify third-party extensions as sources of tracebacks
Augie Fackler <raf@durin42.com>
parents:
16705
diff
changeset
|
224 report = getattr(mod, 'buglink', _('the extension author.')) |
18224
0f9013112eba
dispatch: handle empty `testedwith` value in extension
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17773
diff
changeset
|
225 if not testedwith.strip(): |
16744
1c9f58a6c8f1
dispatch: try and identify third-party extensions as sources of tracebacks
Augie Fackler <raf@durin42.com>
parents:
16705
diff
changeset
|
226 # We found an untested extension. It's likely the culprit. |
18224
0f9013112eba
dispatch: handle empty `testedwith` value in extension
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17773
diff
changeset
|
227 worst = name, 'unknown', report |
16744
1c9f58a6c8f1
dispatch: try and identify third-party extensions as sources of tracebacks
Augie Fackler <raf@durin42.com>
parents:
16705
diff
changeset
|
228 break |
1c9f58a6c8f1
dispatch: try and identify third-party extensions as sources of tracebacks
Augie Fackler <raf@durin42.com>
parents:
16705
diff
changeset
|
229 if compare not in testedwith.split() and testedwith != 'internal': |
1c9f58a6c8f1
dispatch: try and identify third-party extensions as sources of tracebacks
Augie Fackler <raf@durin42.com>
parents:
16705
diff
changeset
|
230 tested = [tuplever(v) for v in testedwith.split()] |
17228
d1b49b02bc16
dispatch: fix traceback when extension was tested with newer versions only
Thomas Arendsen Hein <thomas@intevation.de>
parents:
16933
diff
changeset
|
231 lower = [t for t in tested if t < ct] |
d1b49b02bc16
dispatch: fix traceback when extension was tested with newer versions only
Thomas Arendsen Hein <thomas@intevation.de>
parents:
16933
diff
changeset
|
232 nearest = max(lower or tested) |
d1b49b02bc16
dispatch: fix traceback when extension was tested with newer versions only
Thomas Arendsen Hein <thomas@intevation.de>
parents:
16933
diff
changeset
|
233 if worst[0] is None or nearest < worst[1]: |
16744
1c9f58a6c8f1
dispatch: try and identify third-party extensions as sources of tracebacks
Augie Fackler <raf@durin42.com>
parents:
16705
diff
changeset
|
234 worst = name, nearest, report |
1c9f58a6c8f1
dispatch: try and identify third-party extensions as sources of tracebacks
Augie Fackler <raf@durin42.com>
parents:
16705
diff
changeset
|
235 if worst[0] is not None: |
1c9f58a6c8f1
dispatch: try and identify third-party extensions as sources of tracebacks
Augie Fackler <raf@durin42.com>
parents:
16705
diff
changeset
|
236 name, testedwith, report = worst |
1c9f58a6c8f1
dispatch: try and identify third-party extensions as sources of tracebacks
Augie Fackler <raf@durin42.com>
parents:
16705
diff
changeset
|
237 if not isinstance(testedwith, str): |
1c9f58a6c8f1
dispatch: try and identify third-party extensions as sources of tracebacks
Augie Fackler <raf@durin42.com>
parents:
16705
diff
changeset
|
238 testedwith = '.'.join([str(c) for c in testedwith]) |
1c9f58a6c8f1
dispatch: try and identify third-party extensions as sources of tracebacks
Augie Fackler <raf@durin42.com>
parents:
16705
diff
changeset
|
239 warning = (_('** Unknown exception encountered with ' |
1c9f58a6c8f1
dispatch: try and identify third-party extensions as sources of tracebacks
Augie Fackler <raf@durin42.com>
parents:
16705
diff
changeset
|
240 'possibly-broken third-party extension %s\n' |
1c9f58a6c8f1
dispatch: try and identify third-party extensions as sources of tracebacks
Augie Fackler <raf@durin42.com>
parents:
16705
diff
changeset
|
241 '** which supports versions %s of Mercurial.\n' |
1c9f58a6c8f1
dispatch: try and identify third-party extensions as sources of tracebacks
Augie Fackler <raf@durin42.com>
parents:
16705
diff
changeset
|
242 '** Please disable %s and try your action again.\n' |
1c9f58a6c8f1
dispatch: try and identify third-party extensions as sources of tracebacks
Augie Fackler <raf@durin42.com>
parents:
16705
diff
changeset
|
243 '** If that fixes the bug please report it to %s\n') |
1c9f58a6c8f1
dispatch: try and identify third-party extensions as sources of tracebacks
Augie Fackler <raf@durin42.com>
parents:
16705
diff
changeset
|
244 % (name, testedwith, name, report)) |
1c9f58a6c8f1
dispatch: try and identify third-party extensions as sources of tracebacks
Augie Fackler <raf@durin42.com>
parents:
16705
diff
changeset
|
245 else: |
1c9f58a6c8f1
dispatch: try and identify third-party extensions as sources of tracebacks
Augie Fackler <raf@durin42.com>
parents:
16705
diff
changeset
|
246 warning = (_("** unknown exception encountered, " |
1c9f58a6c8f1
dispatch: try and identify third-party extensions as sources of tracebacks
Augie Fackler <raf@durin42.com>
parents:
16705
diff
changeset
|
247 "please report by visiting\n") + |
1c9f58a6c8f1
dispatch: try and identify third-party extensions as sources of tracebacks
Augie Fackler <raf@durin42.com>
parents:
16705
diff
changeset
|
248 _("** http://mercurial.selenic.com/wiki/BugTracker\n")) |
1c9f58a6c8f1
dispatch: try and identify third-party extensions as sources of tracebacks
Augie Fackler <raf@durin42.com>
parents:
16705
diff
changeset
|
249 warning += ((_("** Python %s\n") % sys.version.replace('\n', '')) + |
1c9f58a6c8f1
dispatch: try and identify third-party extensions as sources of tracebacks
Augie Fackler <raf@durin42.com>
parents:
16705
diff
changeset
|
250 (_("** Mercurial Distributed SCM (version %s)\n") % myver) + |
1c9f58a6c8f1
dispatch: try and identify third-party extensions as sources of tracebacks
Augie Fackler <raf@durin42.com>
parents:
16705
diff
changeset
|
251 (_("** Extensions loaded: %s\n") % |
1c9f58a6c8f1
dispatch: try and identify third-party extensions as sources of tracebacks
Augie Fackler <raf@durin42.com>
parents:
16705
diff
changeset
|
252 ", ".join([x[0] for x in extensions.extensions()]))) |
18670
ddc7268da176
blackbox: log the commands that are run
Durham Goode <durham@fb.com>
parents:
18548
diff
changeset
|
253 ui.log("commandexception", "%s\n%s\n", warning, traceback.format_exc()) |
16744
1c9f58a6c8f1
dispatch: try and identify third-party extensions as sources of tracebacks
Augie Fackler <raf@durin42.com>
parents:
16705
diff
changeset
|
254 ui.warn(warning) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
255 raise |
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 return -1 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
258 |
16744
1c9f58a6c8f1
dispatch: try and identify third-party extensions as sources of tracebacks
Augie Fackler <raf@durin42.com>
parents:
16705
diff
changeset
|
259 def tuplever(v): |
16839
0a0cf3f26938
dispatch: tolerate non-standard version strings in tuplever() (issue3470)
Adrian Buehlmann <adrian@cadifra.com>
parents:
16744
diff
changeset
|
260 try: |
0a0cf3f26938
dispatch: tolerate non-standard version strings in tuplever() (issue3470)
Adrian Buehlmann <adrian@cadifra.com>
parents:
16744
diff
changeset
|
261 return tuple([int(i) for i in v.split('.')]) |
0a0cf3f26938
dispatch: tolerate non-standard version strings in tuplever() (issue3470)
Adrian Buehlmann <adrian@cadifra.com>
parents:
16744
diff
changeset
|
262 except ValueError: |
0a0cf3f26938
dispatch: tolerate non-standard version strings in tuplever() (issue3470)
Adrian Buehlmann <adrian@cadifra.com>
parents:
16744
diff
changeset
|
263 return tuple() |
16744
1c9f58a6c8f1
dispatch: try and identify third-party extensions as sources of tracebacks
Augie Fackler <raf@durin42.com>
parents:
16705
diff
changeset
|
264 |
14265
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
265 def aliasargs(fn, givenargs): |
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
266 args = getattr(fn, 'args', []) |
16294
795d591b6ef5
alias: abort on missing positional args (issue3331)
Matt Mackall <mpm@selenic.com>
parents:
16277
diff
changeset
|
267 if args: |
14265
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
268 cmd = ' '.join(map(util.shellquote, args)) |
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
269 |
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
270 nums = [] |
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
271 def replacer(m): |
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
272 num = int(m.group(1)) - 1 |
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
273 nums.append(num) |
16277
1c2aaf05f7d7
aliases: use empty string for missing position parameters (issue3331)
Matt Mackall <mpm@selenic.com>
parents:
15781
diff
changeset
|
274 if num < len(givenargs): |
1c2aaf05f7d7
aliases: use empty string for missing position parameters (issue3331)
Matt Mackall <mpm@selenic.com>
parents:
15781
diff
changeset
|
275 return givenargs[num] |
16294
795d591b6ef5
alias: abort on missing positional args (issue3331)
Matt Mackall <mpm@selenic.com>
parents:
16277
diff
changeset
|
276 raise util.Abort(_('too few arguments for command alias')) |
14265
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
277 cmd = re.sub(r'\$(\d+|\$)', replacer, cmd) |
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
278 givenargs = [x for i, x in enumerate(givenargs) |
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
279 if i not in nums] |
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
280 args = shlex.split(cmd) |
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
281 return args + givenargs |
8655 | 282 |
283 class cmdalias(object): | |
284 def __init__(self, name, definition, cmdtable): | |
12039
18e1e7520b67
alias: make shadowing behavior more consistent (issue2054)
Brodie Rao <brodie@bitheap.org>
parents:
11712
diff
changeset
|
285 self.name = self.cmd = name |
12092
4982fa38e544
alias: print what command is being shadowed in debug message
Brodie Rao <brodie@bitheap.org>
parents:
12070
diff
changeset
|
286 self.cmdname = '' |
8655 | 287 self.definition = definition |
288 self.args = [] | |
289 self.opts = [] | |
290 self.help = '' | |
291 self.norepo = True | |
16609
d36a384bec87
alias: inherit command optionalrepo flag (issue3298)
Patrick Mezard <patrick@mezard.eu>
parents:
16591
diff
changeset
|
292 self.optionalrepo = False |
10021
0022f5c5459e
help: don't display bogus help messages for invalid aliases
Brodie Rao <me+hg@dackz.net>
parents:
9994
diff
changeset
|
293 self.badalias = False |
8655 | 294 |
295 try: | |
12039
18e1e7520b67
alias: make shadowing behavior more consistent (issue2054)
Brodie Rao <brodie@bitheap.org>
parents:
11712
diff
changeset
|
296 aliases, entry = cmdutil.findcmd(self.name, cmdtable) |
18e1e7520b67
alias: make shadowing behavior more consistent (issue2054)
Brodie Rao <brodie@bitheap.org>
parents:
11712
diff
changeset
|
297 for alias, e in cmdtable.iteritems(): |
18e1e7520b67
alias: make shadowing behavior more consistent (issue2054)
Brodie Rao <brodie@bitheap.org>
parents:
11712
diff
changeset
|
298 if e is entry: |
18e1e7520b67
alias: make shadowing behavior more consistent (issue2054)
Brodie Rao <brodie@bitheap.org>
parents:
11712
diff
changeset
|
299 self.cmd = alias |
18e1e7520b67
alias: make shadowing behavior more consistent (issue2054)
Brodie Rao <brodie@bitheap.org>
parents:
11712
diff
changeset
|
300 break |
8655 | 301 self.shadows = True |
302 except error.UnknownCommand: | |
303 self.shadows = False | |
304 | |
305 if not self.definition: | |
306 def fn(ui, *args): | |
307 ui.warn(_("no definition for alias '%s'\n") % self.name) | |
308 return 1 | |
309 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
|
310 self.badalias = True |
8655 | 311 return |
312 | |
11524
24965bb270b7
dispatch: add shell aliases
Steve Losh <steve@stevelosh.com>
parents:
11495
diff
changeset
|
313 if self.definition.startswith('!'): |
12536
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
314 self.shell = True |
11524
24965bb270b7
dispatch: add shell aliases
Steve Losh <steve@stevelosh.com>
parents:
11495
diff
changeset
|
315 def fn(ui, *args): |
11989
f853873fc66d
aliases: provide more flexible ways to work with shell alias arguments
Steve Losh <steve@stevelosh.com>
parents:
11985
diff
changeset
|
316 env = {'HG_ARGS': ' '.join((self.name,) + args)} |
f853873fc66d
aliases: provide more flexible ways to work with shell alias arguments
Steve Losh <steve@stevelosh.com>
parents:
11985
diff
changeset
|
317 def _checkvar(m): |
13392
777cef34a890
dispatch: support for $ escaping in shell-alias definition
Roman Sokolov <sokolov.r.v@gmail.com>
parents:
13382
diff
changeset
|
318 if m.groups()[0] == '$': |
777cef34a890
dispatch: support for $ escaping in shell-alias definition
Roman Sokolov <sokolov.r.v@gmail.com>
parents:
13382
diff
changeset
|
319 return m.group() |
777cef34a890
dispatch: support for $ escaping in shell-alias definition
Roman Sokolov <sokolov.r.v@gmail.com>
parents:
13382
diff
changeset
|
320 elif int(m.groups()[0]) <= len(args): |
11989
f853873fc66d
aliases: provide more flexible ways to work with shell alias arguments
Steve Losh <steve@stevelosh.com>
parents:
11985
diff
changeset
|
321 return m.group() |
f853873fc66d
aliases: provide more flexible ways to work with shell alias arguments
Steve Losh <steve@stevelosh.com>
parents:
11985
diff
changeset
|
322 else: |
14708
8083f4d00bd1
i18n: remove translation of debug messages
David Soria Parra <dsp@php.net>
parents:
14704
diff
changeset
|
323 ui.debug("No argument found for substitution " |
8083f4d00bd1
i18n: remove translation of debug messages
David Soria Parra <dsp@php.net>
parents:
14704
diff
changeset
|
324 "of %i variable in alias '%s' definition." |
13393
d38d500deb08
dispatch: debug message for missing arguments in shell alias
Roman Sokolov <sokolov.r.v@gmail.com>
parents:
13392
diff
changeset
|
325 % (int(m.groups()[0]), self.name)) |
11989
f853873fc66d
aliases: provide more flexible ways to work with shell alias arguments
Steve Losh <steve@stevelosh.com>
parents:
11985
diff
changeset
|
326 return '' |
13392
777cef34a890
dispatch: support for $ escaping in shell-alias definition
Roman Sokolov <sokolov.r.v@gmail.com>
parents:
13382
diff
changeset
|
327 cmd = re.sub(r'\$(\d+|\$)', _checkvar, self.definition[1:]) |
11989
f853873fc66d
aliases: provide more flexible ways to work with shell alias arguments
Steve Losh <steve@stevelosh.com>
parents:
11985
diff
changeset
|
328 replace = dict((str(i + 1), arg) for i, arg in enumerate(args)) |
f853873fc66d
aliases: provide more flexible ways to work with shell alias arguments
Steve Losh <steve@stevelosh.com>
parents:
11985
diff
changeset
|
329 replace['0'] = self.name |
f853873fc66d
aliases: provide more flexible ways to work with shell alias arguments
Steve Losh <steve@stevelosh.com>
parents:
11985
diff
changeset
|
330 replace['@'] = ' '.join(args) |
13392
777cef34a890
dispatch: support for $ escaping in shell-alias definition
Roman Sokolov <sokolov.r.v@gmail.com>
parents:
13382
diff
changeset
|
331 cmd = util.interpolate(r'\$', replace, cmd, escape_prefix=True) |
14640
406b6d7bdcb9
dispatch: write shell alias output to ui out descriptor
Idan Kamara <idankk86@gmail.com>
parents:
14618
diff
changeset
|
332 return util.system(cmd, environ=env, out=ui.fout) |
11524
24965bb270b7
dispatch: add shell aliases
Steve Losh <steve@stevelosh.com>
parents:
11495
diff
changeset
|
333 self.fn = fn |
24965bb270b7
dispatch: add shell aliases
Steve Losh <steve@stevelosh.com>
parents:
11495
diff
changeset
|
334 return |
24965bb270b7
dispatch: add shell aliases
Steve Losh <steve@stevelosh.com>
parents:
11495
diff
changeset
|
335 |
8655 | 336 args = shlex.split(self.definition) |
12092
4982fa38e544
alias: print what command is being shadowed in debug message
Brodie Rao <brodie@bitheap.org>
parents:
12070
diff
changeset
|
337 self.cmdname = cmd = args.pop(0) |
10793
16df09a54113
expand paths in aliases
Alexander Solovyov <piranha@piranha.org.ua>
parents:
10564
diff
changeset
|
338 args = map(util.expandpath, args) |
8655 | 339 |
18693
633cd0c46e6a
dispatch: also a separate warning message on aliases with --config
Simon Heimberg <simohe@besonet.ch>
parents:
18691
diff
changeset
|
340 for invalidarg in ("--cwd", "-R", "--repository", "--repo", "--config"): |
11695
ee8f36a6c766
alias: improved diagnostic when arguments include --cwd, etc.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
11681
diff
changeset
|
341 if _earlygetopt([invalidarg], args): |
ee8f36a6c766
alias: improved diagnostic when arguments include --cwd, etc.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
11681
diff
changeset
|
342 def fn(ui, *args): |
ee8f36a6c766
alias: improved diagnostic when arguments include --cwd, etc.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
11681
diff
changeset
|
343 ui.warn(_("error in definition for alias '%s': %s may only " |
ee8f36a6c766
alias: improved diagnostic when arguments include --cwd, etc.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
11681
diff
changeset
|
344 "be given on the command line\n") |
ee8f36a6c766
alias: improved diagnostic when arguments include --cwd, etc.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
11681
diff
changeset
|
345 % (self.name, invalidarg)) |
ee8f36a6c766
alias: improved diagnostic when arguments include --cwd, etc.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
11681
diff
changeset
|
346 return 1 |
ee8f36a6c766
alias: improved diagnostic when arguments include --cwd, etc.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
11681
diff
changeset
|
347 |
ee8f36a6c766
alias: improved diagnostic when arguments include --cwd, etc.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
11681
diff
changeset
|
348 self.fn = fn |
ee8f36a6c766
alias: improved diagnostic when arguments include --cwd, etc.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
11681
diff
changeset
|
349 self.badalias = True |
ee8f36a6c766
alias: improved diagnostic when arguments include --cwd, etc.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
11681
diff
changeset
|
350 return |
ee8f36a6c766
alias: improved diagnostic when arguments include --cwd, etc.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
11681
diff
changeset
|
351 |
8655 | 352 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
|
353 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
|
354 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
|
355 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
|
356 else: |
8bce1e0d2801
alias: do not crash when aliased command has no usage help text
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9825
diff
changeset
|
357 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
|
358 |
14265
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
359 self.args = aliasargs(self.fn, args) |
8655 | 360 if cmd not in commands.norepo.split(' '): |
361 self.norepo = False | |
16609
d36a384bec87
alias: inherit command optionalrepo flag (issue3298)
Patrick Mezard <patrick@mezard.eu>
parents:
16591
diff
changeset
|
362 if cmd in commands.optionalrepo.split(' '): |
d36a384bec87
alias: inherit command optionalrepo flag (issue3298)
Patrick Mezard <patrick@mezard.eu>
parents:
16591
diff
changeset
|
363 self.optionalrepo = True |
9876
6e8a16dd3e30
alias: improve help text for command aliases
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
9875
diff
changeset
|
364 if self.help.startswith("hg " + cmd): |
6e8a16dd3e30
alias: improve help text for command aliases
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
9875
diff
changeset
|
365 # 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
|
366 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
|
367 self.__doc__ = self.fn.__doc__ |
9876
6e8a16dd3e30
alias: improve help text for command aliases
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
9875
diff
changeset
|
368 |
8655 | 369 except error.UnknownCommand: |
370 def fn(ui, *args): | |
371 ui.warn(_("alias '%s' resolves to unknown command '%s'\n") \ | |
372 % (self.name, cmd)) | |
10364
de1e7099d100
dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents:
10282
diff
changeset
|
373 try: |
de1e7099d100
dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents:
10282
diff
changeset
|
374 # 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
|
375 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
|
376 except error.UnknownCommand: |
de1e7099d100
dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents:
10282
diff
changeset
|
377 pass |
8655 | 378 return 1 |
379 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
|
380 self.badalias = True |
8655 | 381 except error.AmbiguousCommand: |
382 def fn(ui, *args): | |
383 ui.warn(_("alias '%s' resolves to ambiguous command '%s'\n") \ | |
384 % (self.name, cmd)) | |
385 return 1 | |
386 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
|
387 self.badalias = True |
8655 | 388 |
389 def __call__(self, ui, *args, **opts): | |
390 if self.shadows: | |
14704
b24d596fcd25
Backed out changeset 1ec8bd909ac3
Martin Geisler <mg@aragost.com>
parents:
14702
diff
changeset
|
391 ui.debug("alias '%s' shadows command '%s'\n" % |
12092
4982fa38e544
alias: print what command is being shadowed in debug message
Brodie Rao <brodie@bitheap.org>
parents:
12070
diff
changeset
|
392 (self.name, self.cmdname)) |
8655 | 393 |
14950
144e97421f6b
dispatch: use safehasattr instead of hasattr
Augie Fackler <durin42@gmail.com>
parents:
14918
diff
changeset
|
394 if util.safehasattr(self, 'shell'): |
11989
f853873fc66d
aliases: provide more flexible ways to work with shell alias arguments
Steve Losh <steve@stevelosh.com>
parents:
11985
diff
changeset
|
395 return self.fn(ui, *args, **opts) |
f853873fc66d
aliases: provide more flexible ways to work with shell alias arguments
Steve Losh <steve@stevelosh.com>
parents:
11985
diff
changeset
|
396 else: |
12093
cd895084a4cd
alias: on --debug, print expansion when it has invalid arguments
Brodie Rao <brodie@bitheap.org>
parents:
12092
diff
changeset
|
397 try: |
cd895084a4cd
alias: on --debug, print expansion when it has invalid arguments
Brodie Rao <brodie@bitheap.org>
parents:
12092
diff
changeset
|
398 util.checksignature(self.fn)(ui, *args, **opts) |
cd895084a4cd
alias: on --debug, print expansion when it has invalid arguments
Brodie Rao <brodie@bitheap.org>
parents:
12092
diff
changeset
|
399 except error.SignatureError: |
cd895084a4cd
alias: on --debug, print expansion when it has invalid arguments
Brodie Rao <brodie@bitheap.org>
parents:
12092
diff
changeset
|
400 args = ' '.join([self.cmdname] + self.args) |
14704
b24d596fcd25
Backed out changeset 1ec8bd909ac3
Martin Geisler <mg@aragost.com>
parents:
14702
diff
changeset
|
401 ui.debug("alias '%s' expands to '%s'\n" % (self.name, args)) |
12093
cd895084a4cd
alias: on --debug, print expansion when it has invalid arguments
Brodie Rao <brodie@bitheap.org>
parents:
12092
diff
changeset
|
402 raise |
8655 | 403 |
404 def addaliases(ui, cmdtable): | |
405 # aliases are processed after extensions have been loaded, so they | |
406 # may use extension commands. Aliases can also use other alias definitions, | |
407 # but only if they have been defined prior to the current definition. | |
408 for alias, definition in ui.configitems('alias'): | |
409 aliasdef = cmdalias(alias, definition, cmdtable) | |
15019
f4b7be3f8430
dispatch: don't rewrap aliases that have the same definition
Idan Kamara <idankk86@gmail.com>
parents:
14992
diff
changeset
|
410 |
f4b7be3f8430
dispatch: don't rewrap aliases that have the same definition
Idan Kamara <idankk86@gmail.com>
parents:
14992
diff
changeset
|
411 try: |
f4b7be3f8430
dispatch: don't rewrap aliases that have the same definition
Idan Kamara <idankk86@gmail.com>
parents:
14992
diff
changeset
|
412 olddef = cmdtable[aliasdef.cmd][0] |
f4b7be3f8430
dispatch: don't rewrap aliases that have the same definition
Idan Kamara <idankk86@gmail.com>
parents:
14992
diff
changeset
|
413 if olddef.definition == aliasdef.definition: |
f4b7be3f8430
dispatch: don't rewrap aliases that have the same definition
Idan Kamara <idankk86@gmail.com>
parents:
14992
diff
changeset
|
414 continue |
f4b7be3f8430
dispatch: don't rewrap aliases that have the same definition
Idan Kamara <idankk86@gmail.com>
parents:
14992
diff
changeset
|
415 except (KeyError, AttributeError): |
f4b7be3f8430
dispatch: don't rewrap aliases that have the same definition
Idan Kamara <idankk86@gmail.com>
parents:
14992
diff
changeset
|
416 # definition might not exist or it might not be a cmdalias |
f4b7be3f8430
dispatch: don't rewrap aliases that have the same definition
Idan Kamara <idankk86@gmail.com>
parents:
14992
diff
changeset
|
417 pass |
f4b7be3f8430
dispatch: don't rewrap aliases that have the same definition
Idan Kamara <idankk86@gmail.com>
parents:
14992
diff
changeset
|
418 |
15233
81c97964d123
alias: don't shadow commands that we only partially matched (issue2993) (BC)
Augie Fackler <durin42@gmail.com>
parents:
15027
diff
changeset
|
419 cmdtable[aliasdef.name] = (aliasdef, aliasdef.opts, aliasdef.help) |
8655 | 420 if aliasdef.norepo: |
421 commands.norepo += ' %s' % alias | |
16609
d36a384bec87
alias: inherit command optionalrepo flag (issue3298)
Patrick Mezard <patrick@mezard.eu>
parents:
16591
diff
changeset
|
422 if aliasdef.optionalrepo: |
d36a384bec87
alias: inherit command optionalrepo flag (issue3298)
Patrick Mezard <patrick@mezard.eu>
parents:
16591
diff
changeset
|
423 commands.optionalrepo += ' %s' % alias |
8655 | 424 |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
425 def _parse(ui, args): |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
426 options = {} |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
427 cmdoptions = {} |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
428 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
429 try: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
430 args = fancyopts.fancyopts(args, commands.globalopts, options) |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
431 except fancyopts.getopt.GetoptError, inst: |
11287
b901bb751999
error: change ParseError to CommandError
Matt Mackall <mpm@selenic.com>
parents:
11209
diff
changeset
|
432 raise error.CommandError(None, inst) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
433 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
434 if args: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
435 cmd, args = args[0], args[1:] |
9875
d6a95c5f6ff9
dispatch: minor refactoring
Henri Wiechers <hwiechers@gmail.com>
parents:
9825
diff
changeset
|
436 aliases, entry = cmdutil.findcmd(cmd, commands.table, |
16591
46e9ed223d2c
commands: parse ui.strict config item as bool
Yuya Nishihara <yuya@tcha.org>
parents:
16392
diff
changeset
|
437 ui.configbool("ui", "strict")) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
438 cmd = aliases[0] |
14265
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
439 args = aliasargs(entry[0], args) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
440 defaults = ui.config("defaults", cmd) |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
441 if defaults: |
9610
d78fe60f6bda
make path expanding more consistent
Alexander Solovyov <piranha@piranha.org.ua>
parents:
9569
diff
changeset
|
442 args = map(util.expandpath, shlex.split(defaults)) + args |
9875
d6a95c5f6ff9
dispatch: minor refactoring
Henri Wiechers <hwiechers@gmail.com>
parents:
9825
diff
changeset
|
443 c = list(entry[1]) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
444 else: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
445 cmd = None |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
446 c = [] |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
447 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
448 # combine global options into local |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
449 for o in commands.globalopts: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
450 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
|
451 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
452 try: |
7772
88887054d277
fancyopts: Parse options that occur after arguments.
Augie Fackler <durin42@gmail.com>
parents:
7733
diff
changeset
|
453 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
|
454 except fancyopts.getopt.GetoptError, inst: |
11287
b901bb751999
error: change ParseError to CommandError
Matt Mackall <mpm@selenic.com>
parents:
11209
diff
changeset
|
455 raise error.CommandError(cmd, inst) |
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 # separate global options back out |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
458 for o in commands.globalopts: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
459 n = o[1] |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
460 options[n] = cmdoptions[n] |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
461 del cmdoptions[n] |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
462 |
9875
d6a95c5f6ff9
dispatch: minor refactoring
Henri Wiechers <hwiechers@gmail.com>
parents:
9825
diff
changeset
|
463 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
|
464 |
8137 | 465 def _parseconfig(ui, config): |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
466 """parse the --config options from the command line""" |
14753
10dcb3e7cb55
dispatch: return read config options
Idan Kamara <idankk86@gmail.com>
parents:
14752
diff
changeset
|
467 configs = [] |
10dcb3e7cb55
dispatch: return read config options
Idan Kamara <idankk86@gmail.com>
parents:
14752
diff
changeset
|
468 |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
469 for cfg in config: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
470 try: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
471 name, value = cfg.split('=', 1) |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
472 section, name = name.split('.', 1) |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
473 if not section or not name: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
474 raise IndexError |
8137 | 475 ui.setconfig(section, name, value) |
14753
10dcb3e7cb55
dispatch: return read config options
Idan Kamara <idankk86@gmail.com>
parents:
14752
diff
changeset
|
476 configs.append((section, name, value)) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
477 except (IndexError, ValueError): |
9825
0d850f8beea6
dispatch: better error message for --config option
Bill Schroeder <bschroeder@allstontrading.com>
parents:
9679
diff
changeset
|
478 raise util.Abort(_('malformed --config option: %r ' |
0d850f8beea6
dispatch: better error message for --config option
Bill Schroeder <bschroeder@allstontrading.com>
parents:
9679
diff
changeset
|
479 '(use --config section.name=value)') % cfg) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
480 |
14753
10dcb3e7cb55
dispatch: return read config options
Idan Kamara <idankk86@gmail.com>
parents:
14752
diff
changeset
|
481 return configs |
10dcb3e7cb55
dispatch: return read config options
Idan Kamara <idankk86@gmail.com>
parents:
14752
diff
changeset
|
482 |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
483 def _earlygetopt(aliases, args): |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
484 """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
|
485 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
486 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
|
487 The options and values are removed from args. |
19098
f01ae031f84c
dispatch: add doctests for _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19011
diff
changeset
|
488 |
f01ae031f84c
dispatch: add doctests for _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19011
diff
changeset
|
489 >>> args = ['x', '--cwd', 'foo', 'y'] |
f01ae031f84c
dispatch: add doctests for _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19011
diff
changeset
|
490 >>> _earlygetopt(['--cwd'], args), args |
f01ae031f84c
dispatch: add doctests for _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19011
diff
changeset
|
491 (['foo'], ['x', 'y']) |
f01ae031f84c
dispatch: add doctests for _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19011
diff
changeset
|
492 |
19099
fc081623f4bd
dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19098
diff
changeset
|
493 >>> args = ['x', '--cwd=bar', 'y'] |
fc081623f4bd
dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19098
diff
changeset
|
494 >>> _earlygetopt(['--cwd'], args), args |
fc081623f4bd
dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19098
diff
changeset
|
495 (['bar'], ['x', 'y']) |
fc081623f4bd
dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19098
diff
changeset
|
496 |
19098
f01ae031f84c
dispatch: add doctests for _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19011
diff
changeset
|
497 >>> args = ['x', '-R', 'foo', 'y'] |
f01ae031f84c
dispatch: add doctests for _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19011
diff
changeset
|
498 >>> _earlygetopt(['-R'], args), args |
f01ae031f84c
dispatch: add doctests for _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19011
diff
changeset
|
499 (['foo'], ['x', 'y']) |
f01ae031f84c
dispatch: add doctests for _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19011
diff
changeset
|
500 |
f01ae031f84c
dispatch: add doctests for _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19011
diff
changeset
|
501 >>> args = ['x', '-Rbar', 'y'] |
f01ae031f84c
dispatch: add doctests for _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19011
diff
changeset
|
502 >>> _earlygetopt(['-R'], args), args |
f01ae031f84c
dispatch: add doctests for _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19011
diff
changeset
|
503 (['bar'], ['x', 'y']) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
504 """ |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
505 try: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
506 argcount = args.index("--") |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
507 except ValueError: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
508 argcount = len(args) |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
509 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
|
510 values = [] |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
511 pos = 0 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
512 while pos < argcount: |
19099
fc081623f4bd
dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19098
diff
changeset
|
513 fullarg = arg = args[pos] |
fc081623f4bd
dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19098
diff
changeset
|
514 equals = arg.find('=') |
fc081623f4bd
dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19098
diff
changeset
|
515 if equals > -1: |
fc081623f4bd
dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19098
diff
changeset
|
516 arg = arg[:equals] |
fc081623f4bd
dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19098
diff
changeset
|
517 if arg in aliases: |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
518 del args[pos] |
19099
fc081623f4bd
dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19098
diff
changeset
|
519 if equals > -1: |
fc081623f4bd
dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19098
diff
changeset
|
520 values.append(fullarg[equals + 1:]) |
fc081623f4bd
dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19098
diff
changeset
|
521 argcount -= 1 |
fc081623f4bd
dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19098
diff
changeset
|
522 else: |
fc081623f4bd
dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19098
diff
changeset
|
523 if pos + 1 >= argcount: |
fc081623f4bd
dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19098
diff
changeset
|
524 # ignore and let getopt report an error if there is no value |
fc081623f4bd
dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19098
diff
changeset
|
525 break |
fc081623f4bd
dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19098
diff
changeset
|
526 values.append(args.pop(pos)) |
fc081623f4bd
dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19098
diff
changeset
|
527 argcount -= 2 |
fc081623f4bd
dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19098
diff
changeset
|
528 elif arg[:2] in shortopts: |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
529 # 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
|
530 values.append(args.pop(pos)[2:]) |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
531 argcount -= 1 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
532 else: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
533 pos += 1 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
534 return values |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
535 |
11330
713ae78bb583
provide pre- and post- hooks with parsed command line arguments.
Chad Dombrova <chadrik@gmail.com>
parents:
11305
diff
changeset
|
536 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
|
537 # run pre-hook, and abort if it fails |
19011
12acbea17625
dispatch: print 'abort:' when a pre-command hook fails (BC)
Siddharth Agarwal <sid0@fb.com>
parents:
18935
diff
changeset
|
538 hook.hook(lui, repo, "pre-%s" % cmd, True, args=" ".join(fullargs), |
12acbea17625
dispatch: print 'abort:' when a pre-command hook fails (BC)
Siddharth Agarwal <sid0@fb.com>
parents:
18935
diff
changeset
|
539 pats=cmdpats, opts=cmdoptions) |
7819
14b703252f14
dispatch: extract command execution block into method
Bill Barry <after.fallout@gmail.com>
parents:
7772
diff
changeset
|
540 ret = _runcommand(ui, options, cmd, d) |
14b703252f14
dispatch: extract command execution block into method
Bill Barry <after.fallout@gmail.com>
parents:
7772
diff
changeset
|
541 # run post-hook, passing command result |
14b703252f14
dispatch: extract command execution block into method
Bill Barry <after.fallout@gmail.com>
parents:
7772
diff
changeset
|
542 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
|
543 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
|
544 return ret |
14b703252f14
dispatch: extract command execution block into method
Bill Barry <after.fallout@gmail.com>
parents:
7772
diff
changeset
|
545 |
12536
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
546 def _getlocal(ui, rpath): |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
547 """Return (path, local ui object) for the given target path. |
12770
614f0d8724ab
check-code: find trailing whitespace
Martin Geisler <mg@lazybytes.net>
parents:
12748
diff
changeset
|
548 |
12536
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
549 Takes paths in [cwd]/.hg/hgrc into account." |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
550 """ |
11675
f92f8921a5cc
dispatch: give better error message when cwd doesn't exist (issue2293)
Mads Kiilerich <mads@kiilerich.com>
parents:
11600
diff
changeset
|
551 try: |
f92f8921a5cc
dispatch: give better error message when cwd doesn't exist (issue2293)
Mads Kiilerich <mads@kiilerich.com>
parents:
11600
diff
changeset
|
552 wd = os.getcwd() |
f92f8921a5cc
dispatch: give better error message when cwd doesn't exist (issue2293)
Mads Kiilerich <mads@kiilerich.com>
parents:
11600
diff
changeset
|
553 except OSError, e: |
11712
9cbc62f68328
dispatch: trailing whitespace
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11676
diff
changeset
|
554 raise util.Abort(_("error getting current working directory: %s") % |
11675
f92f8921a5cc
dispatch: give better error message when cwd doesn't exist (issue2293)
Mads Kiilerich <mads@kiilerich.com>
parents:
11600
diff
changeset
|
555 e.strerror) |
f92f8921a5cc
dispatch: give better error message when cwd doesn't exist (issue2293)
Mads Kiilerich <mads@kiilerich.com>
parents:
11600
diff
changeset
|
556 path = cmdutil.findrepo(wd) or "" |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
557 if not path: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
558 lui = ui |
9436 | 559 else: |
12636
c24215aa7e69
dispatch: remove superfluous try/except when reading local ui config
Brodie Rao <brodie@bitheap.org>
parents:
12633
diff
changeset
|
560 lui = ui.copy() |
12637
42ca7aef28d3
dispatch: properly handle relative path aliases used with -R (issue2376)
Brodie Rao <brodie@bitheap.org>
parents:
12636
diff
changeset
|
561 lui.readconfig(os.path.join(path, ".hg", "hgrc"), path) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
562 |
14860
67add0f24f83
dispatch: fix checking of rpath in _getlocal
Matt Mackall <mpm@selenic.com>
parents:
14761
diff
changeset
|
563 if rpath and rpath[-1]: |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
564 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
|
565 lui = ui.copy() |
12637
42ca7aef28d3
dispatch: properly handle relative path aliases used with -R (issue2376)
Brodie Rao <brodie@bitheap.org>
parents:
12636
diff
changeset
|
566 lui.readconfig(os.path.join(path, ".hg", "hgrc"), path) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
567 |
12536
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
568 return path, lui |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
569 |
14888
946f4381c1cb
alias: pass local ui to shell alias
Matt Mackall <mpm@selenic.com>
parents:
14887
diff
changeset
|
570 def _checkshellalias(lui, ui, args): |
12536
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
571 options = {} |
12748
d10369fefd01
alias: fail gracefully when invalid global options are given (issue2442)
Steve Losh <steve@stevelosh.com>
parents:
12637
diff
changeset
|
572 |
d10369fefd01
alias: fail gracefully when invalid global options are given (issue2442)
Steve Losh <steve@stevelosh.com>
parents:
12637
diff
changeset
|
573 try: |
d10369fefd01
alias: fail gracefully when invalid global options are given (issue2442)
Steve Losh <steve@stevelosh.com>
parents:
12637
diff
changeset
|
574 args = fancyopts.fancyopts(args, commands.globalopts, options) |
d10369fefd01
alias: fail gracefully when invalid global options are given (issue2442)
Steve Losh <steve@stevelosh.com>
parents:
12637
diff
changeset
|
575 except fancyopts.getopt.GetoptError: |
d10369fefd01
alias: fail gracefully when invalid global options are given (issue2442)
Steve Losh <steve@stevelosh.com>
parents:
12637
diff
changeset
|
576 return |
12536
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
577 |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
578 if not args: |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
579 return |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
580 |
16609
d36a384bec87
alias: inherit command optionalrepo flag (issue3298)
Patrick Mezard <patrick@mezard.eu>
parents:
16591
diff
changeset
|
581 norepo = commands.norepo |
d36a384bec87
alias: inherit command optionalrepo flag (issue3298)
Patrick Mezard <patrick@mezard.eu>
parents:
16591
diff
changeset
|
582 optionalrepo = commands.optionalrepo |
d36a384bec87
alias: inherit command optionalrepo flag (issue3298)
Patrick Mezard <patrick@mezard.eu>
parents:
16591
diff
changeset
|
583 def restorecommands(): |
d36a384bec87
alias: inherit command optionalrepo flag (issue3298)
Patrick Mezard <patrick@mezard.eu>
parents:
16591
diff
changeset
|
584 commands.norepo = norepo |
d36a384bec87
alias: inherit command optionalrepo flag (issue3298)
Patrick Mezard <patrick@mezard.eu>
parents:
16591
diff
changeset
|
585 commands.optionalrepo = optionalrepo |
d36a384bec87
alias: inherit command optionalrepo flag (issue3298)
Patrick Mezard <patrick@mezard.eu>
parents:
16591
diff
changeset
|
586 |
12536
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
587 cmdtable = commands.table.copy() |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
588 addaliases(lui, cmdtable) |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
589 |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
590 cmd = args[0] |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
591 try: |
16591
46e9ed223d2c
commands: parse ui.strict config item as bool
Yuya Nishihara <yuya@tcha.org>
parents:
16392
diff
changeset
|
592 aliases, entry = cmdutil.findcmd(cmd, cmdtable, |
46e9ed223d2c
commands: parse ui.strict config item as bool
Yuya Nishihara <yuya@tcha.org>
parents:
16392
diff
changeset
|
593 lui.configbool("ui", "strict")) |
12932
ab93029ab622
alias: fall back to normal error handling for ambigious commands (fixes issue2475)
Steve Losh <steve@stevelosh.com>
parents:
12831
diff
changeset
|
594 except (error.AmbiguousCommand, error.UnknownCommand): |
16609
d36a384bec87
alias: inherit command optionalrepo flag (issue3298)
Patrick Mezard <patrick@mezard.eu>
parents:
16591
diff
changeset
|
595 restorecommands() |
12536
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
596 return |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
597 |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
598 cmd = aliases[0] |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
599 fn = entry[0] |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
600 |
14950
144e97421f6b
dispatch: use safehasattr instead of hasattr
Augie Fackler <durin42@gmail.com>
parents:
14918
diff
changeset
|
601 if cmd and util.safehasattr(fn, 'shell'): |
12536
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
602 d = lambda: fn(ui, *args[1:]) |
16683 | 603 return lambda: runcommand(lui, None, cmd, args[:1], ui, options, d, |
604 [], {}) | |
12536
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
605 |
16609
d36a384bec87
alias: inherit command optionalrepo flag (issue3298)
Patrick Mezard <patrick@mezard.eu>
parents:
16591
diff
changeset
|
606 restorecommands() |
12536
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
607 |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
608 _loaded = set() |
14439
80c599eee3f3
dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents:
14438
diff
changeset
|
609 def _dispatch(req): |
14438
08bfec2ef031
dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents:
14286
diff
changeset
|
610 args = req.args |
14439
80c599eee3f3
dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents:
14438
diff
changeset
|
611 ui = req.ui |
80c599eee3f3
dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents:
14438
diff
changeset
|
612 |
12536
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
613 # read --config before doing anything else |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
614 # (e.g. to change trust settings for reading .hg/hgrc) |
14754
189a7562d72e
dispatch: set config options on the request repo.ui
Idan Kamara <idankk86@gmail.com>
parents:
14753
diff
changeset
|
615 cfgs = _parseconfig(ui, _earlygetopt(['--config'], args)) |
12536
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
616 |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
617 # check for cwd |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
618 cwd = _earlygetopt(['--cwd'], args) |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
619 if cwd: |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
620 os.chdir(cwd[-1]) |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
621 |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
622 rpath = _earlygetopt(["-R", "--repository", "--repo"], args) |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
623 path, lui = _getlocal(ui, rpath) |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
624 |
14886
9a3831d64ae2
dispatch: move shell alias handling after early arg handling
Matt Mackall <mpm@selenic.com>
parents:
14866
diff
changeset
|
625 # Now that we're operating in the right directory/repository with |
9a3831d64ae2
dispatch: move shell alias handling after early arg handling
Matt Mackall <mpm@selenic.com>
parents:
14866
diff
changeset
|
626 # the right config settings, check for shell aliases |
14888
946f4381c1cb
alias: pass local ui to shell alias
Matt Mackall <mpm@selenic.com>
parents:
14887
diff
changeset
|
627 shellaliasfn = _checkshellalias(lui, ui, args) |
14886
9a3831d64ae2
dispatch: move shell alias handling after early arg handling
Matt Mackall <mpm@selenic.com>
parents:
14866
diff
changeset
|
628 if shellaliasfn: |
9a3831d64ae2
dispatch: move shell alias handling after early arg handling
Matt Mackall <mpm@selenic.com>
parents:
14866
diff
changeset
|
629 return shellaliasfn() |
9a3831d64ae2
dispatch: move shell alias handling after early arg handling
Matt Mackall <mpm@selenic.com>
parents:
14866
diff
changeset
|
630 |
9410
1c83938b6a8e
extensions: load and configure extensions in well-defined phases
Martin Geisler <mg@lazybytes.net>
parents:
8936
diff
changeset
|
631 # 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
|
632 # 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
|
633 # 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
|
634 extensions.loadall(lui) |
9410
1c83938b6a8e
extensions: load and configure extensions in well-defined phases
Martin Geisler <mg@lazybytes.net>
parents:
8936
diff
changeset
|
635 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
|
636 # 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
|
637 ui.__class__ = lui.__class__ |
5828
863e237b58fb
dispatch: allow extensions to provide setup code
Kirill Smelkov <kirr@mns.spb.ru>
parents:
5664
diff
changeset
|
638 |
9660
e0eae93e6c67
extensions: changed to call extsetup() from extensions.loadall()
Yuya Nishihara <yuya@tcha.org>
parents:
9610
diff
changeset
|
639 # (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
|
640 |
9410
1c83938b6a8e
extensions: load and configure extensions in well-defined phases
Martin Geisler <mg@lazybytes.net>
parents:
8936
diff
changeset
|
641 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
|
642 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
|
643 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
|
644 if overrides: |
60acf1432ee0
Move cmdtable and reposetup handling out of extensions.py
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5178
diff
changeset
|
645 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
|
646 % (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
|
647 commands.table.update(cmdtable) |
8304
991ca609ccd6
dispatch: remember loaded extensions in a real set
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
648 _loaded.add(name) |
8655 | 649 |
9410
1c83938b6a8e
extensions: load and configure extensions in well-defined phases
Martin Geisler <mg@lazybytes.net>
parents:
8936
diff
changeset
|
650 # (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
|
651 |
8655 | 652 addaliases(lui, commands.table) |
653 | |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
654 # check for fallback encoding |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
655 fallback = lui.config('ui', 'fallbackencoding') |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
656 if fallback: |
7948
de377b1a9a84
move encoding bits from util to encoding
Matt Mackall <mpm@selenic.com>
parents:
7873
diff
changeset
|
657 encoding.fallbackencoding = fallback |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
658 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
659 fullargs = args |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
660 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
|
661 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
662 if options["config"]: |
12067
a4fbbe0fbc38
Lowercase error messages
Martin Geisler <mg@lazybytes.net>
parents:
12039
diff
changeset
|
663 raise util.Abort(_("option --config may not be abbreviated!")) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
664 if options["cwd"]: |
12067
a4fbbe0fbc38
Lowercase error messages
Martin Geisler <mg@lazybytes.net>
parents:
12039
diff
changeset
|
665 raise util.Abort(_("option --cwd may not be abbreviated!")) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
666 if options["repository"]: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
667 raise util.Abort(_( |
15781
cc2da4a5ed9a
dispatch: lowercase abort message
Martin Geisler <mg@aragost.com>
parents:
15632
diff
changeset
|
668 "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
|
669 "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
|
670 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
671 if options["encoding"]: |
7948
de377b1a9a84
move encoding bits from util to encoding
Matt Mackall <mpm@selenic.com>
parents:
7873
diff
changeset
|
672 encoding.encoding = options["encoding"] |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
673 if options["encodingmode"]: |
7948
de377b1a9a84
move encoding bits from util to encoding
Matt Mackall <mpm@selenic.com>
parents:
7873
diff
changeset
|
674 encoding.encodingmode = options["encodingmode"] |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
675 if options["time"]: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
676 def get_times(): |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
677 t = os.times() |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
678 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
|
679 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
|
680 return t |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
681 s = get_times() |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
682 def print_time(): |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
683 t = get_times() |
16933
30143c3dd102
dispatch: lowercase --time message
Martin Geisler <mg@aragost.com>
parents:
16839
diff
changeset
|
684 ui.warn(_("time: real %.3f secs (user %.3f+%.3f sys %.3f+%.3f)\n") % |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
685 (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
|
686 atexit.register(print_time) |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
687 |
14752
99ace3cb7352
dispatch: set global options on the request repo.ui
Idan Kamara <idankk86@gmail.com>
parents:
14748
diff
changeset
|
688 uis = set([ui, lui]) |
99ace3cb7352
dispatch: set global options on the request repo.ui
Idan Kamara <idankk86@gmail.com>
parents:
14748
diff
changeset
|
689 |
99ace3cb7352
dispatch: set global options on the request repo.ui
Idan Kamara <idankk86@gmail.com>
parents:
14748
diff
changeset
|
690 if req.repo: |
99ace3cb7352
dispatch: set global options on the request repo.ui
Idan Kamara <idankk86@gmail.com>
parents:
14748
diff
changeset
|
691 uis.add(req.repo.ui) |
99ace3cb7352
dispatch: set global options on the request repo.ui
Idan Kamara <idankk86@gmail.com>
parents:
14748
diff
changeset
|
692 |
14754
189a7562d72e
dispatch: set config options on the request repo.ui
Idan Kamara <idankk86@gmail.com>
parents:
14753
diff
changeset
|
693 # copy configs that were passed on the cmdline (--config) to the repo ui |
189a7562d72e
dispatch: set config options on the request repo.ui
Idan Kamara <idankk86@gmail.com>
parents:
14753
diff
changeset
|
694 for cfg in cfgs: |
189a7562d72e
dispatch: set config options on the request repo.ui
Idan Kamara <idankk86@gmail.com>
parents:
14753
diff
changeset
|
695 req.repo.ui.setconfig(*cfg) |
189a7562d72e
dispatch: set config options on the request repo.ui
Idan Kamara <idankk86@gmail.com>
parents:
14753
diff
changeset
|
696 |
14992
188936b334b1
dispatch: make sure global options on the command line take precedence
Idan Kamara <idankk86@gmail.com>
parents:
14914
diff
changeset
|
697 if options['verbose'] or options['debug'] or options['quiet']: |
188936b334b1
dispatch: make sure global options on the command line take precedence
Idan Kamara <idankk86@gmail.com>
parents:
14914
diff
changeset
|
698 for opt in ('verbose', 'debug', 'quiet'): |
188936b334b1
dispatch: make sure global options on the command line take precedence
Idan Kamara <idankk86@gmail.com>
parents:
14914
diff
changeset
|
699 val = str(bool(options[opt])) |
14752
99ace3cb7352
dispatch: set global options on the request repo.ui
Idan Kamara <idankk86@gmail.com>
parents:
14748
diff
changeset
|
700 for ui_ in uis: |
14992
188936b334b1
dispatch: make sure global options on the command line take precedence
Idan Kamara <idankk86@gmail.com>
parents:
14914
diff
changeset
|
701 ui_.setconfig('ui', opt, val) |
188936b334b1
dispatch: make sure global options on the command line take precedence
Idan Kamara <idankk86@gmail.com>
parents:
14914
diff
changeset
|
702 |
188936b334b1
dispatch: make sure global options on the command line take precedence
Idan Kamara <idankk86@gmail.com>
parents:
14914
diff
changeset
|
703 if options['traceback']: |
188936b334b1
dispatch: make sure global options on the command line take precedence
Idan Kamara <idankk86@gmail.com>
parents:
14914
diff
changeset
|
704 for ui_ in uis: |
188936b334b1
dispatch: make sure global options on the command line take precedence
Idan Kamara <idankk86@gmail.com>
parents:
14914
diff
changeset
|
705 ui_.setconfig('ui', 'traceback', 'on') |
14748
1b8c70c9f47c
dispatch: make sure unspecified global ui options don't override old values
Idan Kamara <idankk86@gmail.com>
parents:
14744
diff
changeset
|
706 |
8136
6b5522cb2ad2
ui: refactor option setting
Matt Mackall <mpm@selenic.com>
parents:
8024
diff
changeset
|
707 if options['noninteractive']: |
14752
99ace3cb7352
dispatch: set global options on the request repo.ui
Idan Kamara <idankk86@gmail.com>
parents:
14748
diff
changeset
|
708 for ui_ in uis: |
14618
110d75f0abb3
dispatch: fix for-loop variable name
Idan Kamara <idankk86@gmail.com>
parents:
14615
diff
changeset
|
709 ui_.setconfig('ui', 'interactive', 'off') |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
710 |
13328
a939f08fae9c
url: add --insecure option to bypass verification of ssl certificates
Yuya Nishihara <yuya@tcha.org>
parents:
12932
diff
changeset
|
711 if cmdoptions.get('insecure', False): |
14752
99ace3cb7352
dispatch: set global options on the request repo.ui
Idan Kamara <idankk86@gmail.com>
parents:
14748
diff
changeset
|
712 for ui_ in uis: |
14618
110d75f0abb3
dispatch: fix for-loop variable name
Idan Kamara <idankk86@gmail.com>
parents:
14615
diff
changeset
|
713 ui_.setconfig('web', 'cacerts', '') |
13328
a939f08fae9c
url: add --insecure option to bypass verification of ssl certificates
Yuya Nishihara <yuya@tcha.org>
parents:
12932
diff
changeset
|
714 |
15020 | 715 if options['version']: |
716 return commands.version_(ui) | |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
717 if options['help']: |
15020 | 718 return commands.help_(ui, cmd) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
719 elif not cmd: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
720 return commands.help_(ui, 'shortlist') |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
721 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
722 repo = None |
11330
713ae78bb583
provide pre- and post- hooks with parsed command line arguments.
Chad Dombrova <chadrik@gmail.com>
parents:
11305
diff
changeset
|
723 cmdpats = args[:] |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
724 if cmd not in commands.norepo.split(): |
14510
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
725 # use the repo from the request only if we don't have -R |
14863
1c148e935244
dispatch: don't use request repo if we have --cwd
Idan Kamara <idankk86@gmail.com>
parents:
14761
diff
changeset
|
726 if not rpath and not cwd: |
14510
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
727 repo = req.repo |
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
728 |
14744
23325c5ef6a7
dispatch: set descriptors on the request repo.ui
Idan Kamara <idankk86@gmail.com>
parents:
14743
diff
changeset
|
729 if repo: |
23325c5ef6a7
dispatch: set descriptors on the request repo.ui
Idan Kamara <idankk86@gmail.com>
parents:
14743
diff
changeset
|
730 # set the descriptors of the repo ui to those of ui |
23325c5ef6a7
dispatch: set descriptors on the request repo.ui
Idan Kamara <idankk86@gmail.com>
parents:
14743
diff
changeset
|
731 repo.ui.fin = ui.fin |
23325c5ef6a7
dispatch: set descriptors on the request repo.ui
Idan Kamara <idankk86@gmail.com>
parents:
14743
diff
changeset
|
732 repo.ui.fout = ui.fout |
23325c5ef6a7
dispatch: set descriptors on the request repo.ui
Idan Kamara <idankk86@gmail.com>
parents:
14743
diff
changeset
|
733 repo.ui.ferr = ui.ferr |
23325c5ef6a7
dispatch: set descriptors on the request repo.ui
Idan Kamara <idankk86@gmail.com>
parents:
14743
diff
changeset
|
734 else: |
14510
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
735 try: |
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
736 repo = hg.repository(ui, path=path) |
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
737 if not repo.local(): |
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
738 raise util.Abort(_("repository '%s' is not local") % path) |
18303
4d1671b39168
clfilter: enforce hidden filtering on all repository accesses
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18267
diff
changeset
|
739 if options['hidden']: |
18267
5bb610f87d1d
clfilter: enforce hidden changeset globally
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18227
diff
changeset
|
740 repo = repo.unfiltered() |
14743
84a680daa4b2
dispatch: pass the correct ui to runcommand
Idan Kamara <idankk86@gmail.com>
parents:
14727
diff
changeset
|
741 repo.ui.setconfig("bundle", "mainreporoot", repo.root) |
14510
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
742 except error.RequirementError: |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
743 raise |
14510
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
744 except error.RepoError: |
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
745 if cmd not in commands.optionalrepo.split(): |
17773
434e5bd615fc
commands: don't infer repo for commands like update (issue2748)
Siddharth Agarwal <sid0@fb.com>
parents:
17299
diff
changeset
|
746 if (cmd in commands.inferrepo.split() and |
434e5bd615fc
commands: don't infer repo for commands like update (issue2748)
Siddharth Agarwal <sid0@fb.com>
parents:
17299
diff
changeset
|
747 args and not path): # try to infer -R from command args |
14510
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
748 repos = map(cmdutil.findrepo, args) |
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
749 guess = repos[0] |
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
750 if guess and repos.count(guess) == len(repos): |
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
751 req.args = ['--repository', guess] + fullargs |
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
752 return _dispatch(req) |
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
753 if not path: |
14914
41c3a71c318d
dispatch: avoid double backslashes in error message
David Golub <davidg@fogcreek.com>
parents:
14863
diff
changeset
|
754 raise error.RepoError(_("no repository found in '%s'" |
16683 | 755 " (.hg not found)") |
756 % os.getcwd()) | |
14510
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
757 raise |
14743
84a680daa4b2
dispatch: pass the correct ui to runcommand
Idan Kamara <idankk86@gmail.com>
parents:
14727
diff
changeset
|
758 if repo: |
84a680daa4b2
dispatch: pass the correct ui to runcommand
Idan Kamara <idankk86@gmail.com>
parents:
14727
diff
changeset
|
759 ui = repo.ui |
7388
5751631246de
dispatch: generalize signature checking for extension command wrapping
Matt Mackall <mpm@selenic.com>
parents:
7280
diff
changeset
|
760 args.insert(0, repo) |
7733
30e95eafc1d0
warn if --repository provided for norepo commands
Matt Mackall <mpm@selenic.com>
parents:
7646
diff
changeset
|
761 elif rpath: |
11600
76454cbc11e4
mark ui.warn strings for translation
Martin Geisler <mg@lazybytes.net>
parents:
11555
diff
changeset
|
762 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
|
763 |
11985
81edef14922e
log: add logging for commands
Matt Mackall <mpm@selenic.com>
parents:
11714
diff
changeset
|
764 msg = ' '.join(' ' in a and repr(a) or a for a in fullargs) |
18758
6aca4d1c744e
blackbox: fix exception when logging commands with format characters
Durham Goode <durham@fb.com>
parents:
18693
diff
changeset
|
765 ui.log("command", '%s\n', msg) |
7388
5751631246de
dispatch: generalize signature checking for extension command wrapping
Matt Mackall <mpm@selenic.com>
parents:
7280
diff
changeset
|
766 d = lambda: util.checksignature(func)(ui, *args, **cmdoptions) |
18670
ddc7268da176
blackbox: log the commands that are run
Durham Goode <durham@fb.com>
parents:
18548
diff
changeset
|
767 starttime = time.time() |
ddc7268da176
blackbox: log the commands that are run
Durham Goode <durham@fb.com>
parents:
18548
diff
changeset
|
768 ret = None |
13382
d747774ca9da
Make sure bundlerepo doesn't leak temp files (issue2491)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13328
diff
changeset
|
769 try: |
18670
ddc7268da176
blackbox: log the commands that are run
Durham Goode <durham@fb.com>
parents:
18548
diff
changeset
|
770 ret = runcommand(lui, repo, cmd, fullargs, ui, options, d, |
ddc7268da176
blackbox: log the commands that are run
Durham Goode <durham@fb.com>
parents:
18548
diff
changeset
|
771 cmdpats, cmdoptions) |
ddc7268da176
blackbox: log the commands that are run
Durham Goode <durham@fb.com>
parents:
18548
diff
changeset
|
772 return ret |
13382
d747774ca9da
Make sure bundlerepo doesn't leak temp files (issue2491)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13328
diff
changeset
|
773 finally: |
18670
ddc7268da176
blackbox: log the commands that are run
Durham Goode <durham@fb.com>
parents:
18548
diff
changeset
|
774 duration = time.time() - starttime |
18691
4f485bd68f1d
blackbox: do not translate the log messages
Durham Goode <durham@fb.com>
parents:
18670
diff
changeset
|
775 ui.log("commandfinish", "%s exited %s after %0.2f seconds\n", |
18670
ddc7268da176
blackbox: log the commands that are run
Durham Goode <durham@fb.com>
parents:
18548
diff
changeset
|
776 cmd, ret, duration) |
14727
d4b9d3b91ce7
dispatch: check for None before closing repo
Idan Kamara <idankk86@gmail.com>
parents:
14712
diff
changeset
|
777 if repo and repo != req.repo: |
13382
d747774ca9da
Make sure bundlerepo doesn't leak temp files (issue2491)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13328
diff
changeset
|
778 repo.close() |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
779 |
16392
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
780 def lsprofile(ui, func, fp): |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
781 format = ui.config('profiling', 'format', default='text') |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
782 field = ui.config('profiling', 'sort', default='inlinetime') |
18548
e71c2ff93167
profiling: introduce limit configuration option
Mads Kiilerich <madski@unity3d.com>
parents:
18303
diff
changeset
|
783 limit = ui.configint('profiling', 'limit', default=30) |
16392
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
784 climit = ui.configint('profiling', 'nested', default=5) |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
785 |
16686
67964cda8701
cleanup: "not x in y" -> "x not in y"
Brodie Rao <brodie@sf.io>
parents:
16683
diff
changeset
|
786 if format not in ['text', 'kcachegrind']: |
16392
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
787 ui.warn(_("unrecognized profiling format '%s'" |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
788 " - Ignored\n") % format) |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
789 format = 'text' |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
790 |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
791 try: |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
792 from mercurial import lsprof |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
793 except ImportError: |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
794 raise util.Abort(_( |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
795 'lsprof not available - install from ' |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
796 'http://codespeak.net/svn/user/arigo/hack/misc/lsprof/')) |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
797 p = lsprof.Profiler() |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
798 p.enable(subcalls=True) |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
799 try: |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
800 return func() |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
801 finally: |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
802 p.disable() |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
803 |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
804 if format == 'kcachegrind': |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
805 import lsprofcalltree |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
806 calltree = lsprofcalltree.KCacheGrind(p) |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
807 calltree.output(fp) |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
808 else: |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
809 # format == 'text' |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
810 stats = lsprof.Stats(p.getstats()) |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
811 stats.sort(field) |
18548
e71c2ff93167
profiling: introduce limit configuration option
Mads Kiilerich <madski@unity3d.com>
parents:
18303
diff
changeset
|
812 stats.pprint(limit=limit, file=fp, climit=climit) |
16392
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
813 |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
814 def statprofile(ui, func, fp): |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
815 try: |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
816 import statprof |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
817 except ImportError: |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
818 raise util.Abort(_( |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
819 'statprof not available - install using "easy_install statprof"')) |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
820 |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
821 freq = ui.configint('profiling', 'freq', default=1000) |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
822 if freq > 0: |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
823 statprof.reset(freq) |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
824 else: |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
825 ui.warn(_("invalid sampling frequency '%s' - ignoring\n") % freq) |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
826 |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
827 statprof.start() |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
828 try: |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
829 return func() |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
830 finally: |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
831 statprof.stop() |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
832 statprof.display(fp) |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
833 |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
834 def _runcommand(ui, options, cmd, cmdfunc): |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
835 def checkargs(): |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
836 try: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
837 return cmdfunc() |
7646 | 838 except error.SignatureError: |
11287
b901bb751999
error: change ParseError to CommandError
Matt Mackall <mpm@selenic.com>
parents:
11209
diff
changeset
|
839 raise error.CommandError(cmd, _("invalid arguments")) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
840 |
6141
90e5c82a3859
Backed out changeset b913d3aacddc (see issue971/msg5317)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
5995
diff
changeset
|
841 if options['profile']: |
16392
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
842 profiler = os.getenv('HGPROF') |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
843 if profiler is None: |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
844 profiler = ui.config('profiling', 'type', default='ls') |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
845 if profiler not in ('ls', 'stat'): |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
846 ui.warn(_("unrecognized profiler '%s' - ignored\n") % profiler) |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
847 profiler = 'ls' |
8023
fd9debb3ea1b
profiling: Adding a profiling.format config variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8022
diff
changeset
|
848 |
8022
4f3fdfaa3874
profiling: Adding profiling.output config variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8021
diff
changeset
|
849 output = ui.config('profiling', 'output') |
4f3fdfaa3874
profiling: Adding profiling.output config variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8021
diff
changeset
|
850 |
4f3fdfaa3874
profiling: Adding profiling.output config variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8021
diff
changeset
|
851 if output: |
9610
d78fe60f6bda
make path expanding more consistent
Alexander Solovyov <piranha@piranha.org.ua>
parents:
9569
diff
changeset
|
852 path = ui.expandpath(output) |
16392
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
853 fp = open(path, 'wb') |
8022
4f3fdfaa3874
profiling: Adding profiling.output config variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8021
diff
changeset
|
854 else: |
16392
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
855 fp = sys.stderr |
8022
4f3fdfaa3874
profiling: Adding profiling.output config variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8021
diff
changeset
|
856 |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
857 try: |
16392
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
858 if profiler == 'ls': |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
859 return lsprofile(ui, checkargs, fp) |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
860 else: |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
861 return statprofile(ui, checkargs, fp) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
862 finally: |
8022
4f3fdfaa3874
profiling: Adding profiling.output config variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8021
diff
changeset
|
863 if output: |
16392
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
864 fp.close() |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
865 else: |
6141
90e5c82a3859
Backed out changeset b913d3aacddc (see issue971/msg5317)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
5995
diff
changeset
|
866 return checkargs() |