Mercurial > hg
annotate mercurial/dispatch.py @ 14712:8a62bae94425 stable
dispatch: do not close the request repo
Closing here means we've closed the repo passed to us in the request,
which is not our responsibility.
This is essential for bundlerepo, and possibly other localrepository
subclasses who do something in their close().
author | Idan Kamara <idankk86@gmail.com> |
---|---|
date | Tue, 21 Jun 2011 17:08:21 +0300 |
parents | 8083f4d00bd1 |
children | d4b9d3b91ce7 |
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): |
14613
ea8938d3a5aa
dispatch: add I/O descriptors to the request
Idan Kamara <idankk86@gmail.com>
parents:
14601
diff
changeset
|
15 def __init__(self, args, ui=None, repo=None, fin=None, fout=None, ferr=None): |
14438
08bfec2ef031
dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents:
14286
diff
changeset
|
16 self.args = args |
14439
80c599eee3f3
dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents:
14438
diff
changeset
|
17 self.ui = ui |
14510
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
18 self.repo = repo |
14438
08bfec2ef031
dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents:
14286
diff
changeset
|
19 |
14613
ea8938d3a5aa
dispatch: add I/O descriptors to the request
Idan Kamara <idankk86@gmail.com>
parents:
14601
diff
changeset
|
20 # input/output/error streams |
ea8938d3a5aa
dispatch: add I/O descriptors to the request
Idan Kamara <idankk86@gmail.com>
parents:
14601
diff
changeset
|
21 self.fin = fin |
ea8938d3a5aa
dispatch: add I/O descriptors to the request
Idan Kamara <idankk86@gmail.com>
parents:
14601
diff
changeset
|
22 self.fout = fout |
ea8938d3a5aa
dispatch: add I/O descriptors to the request
Idan Kamara <idankk86@gmail.com>
parents:
14601
diff
changeset
|
23 self.ferr = ferr |
ea8938d3a5aa
dispatch: add I/O descriptors to the request
Idan Kamara <idankk86@gmail.com>
parents:
14601
diff
changeset
|
24 |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
25 def run(): |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
26 "run the command in sys.argv" |
14438
08bfec2ef031
dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents:
14286
diff
changeset
|
27 sys.exit(dispatch(request(sys.argv[1:]))) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
28 |
14438
08bfec2ef031
dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents:
14286
diff
changeset
|
29 def dispatch(req): |
08bfec2ef031
dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents:
14286
diff
changeset
|
30 "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
|
31 if req.ferr: |
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
32 ferr = req.ferr |
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
33 elif req.ui: |
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
34 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
|
35 else: |
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
36 ferr = sys.stderr |
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
37 |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
38 try: |
14439
80c599eee3f3
dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents:
14438
diff
changeset
|
39 if not req.ui: |
80c599eee3f3
dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents:
14438
diff
changeset
|
40 req.ui = uimod.ui() |
14438
08bfec2ef031
dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents:
14286
diff
changeset
|
41 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
|
42 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
|
43 |
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
44 # 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
|
45 if req.fin: |
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
46 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
|
47 if req.fout: |
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
48 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
|
49 if req.ferr: |
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
50 req.ui.ferr = req.ferr |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
51 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
|
52 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
|
53 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
|
54 ferr.write(_("(%s)\n") % inst.hint) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
55 return -1 |
11288
2123aad24d56
error: add new ParseError for various parsing errors
Matt Mackall <mpm@selenic.com>
parents:
11287
diff
changeset
|
56 except error.ParseError, inst: |
2123aad24d56
error: add new ParseError for various parsing errors
Matt Mackall <mpm@selenic.com>
parents:
11287
diff
changeset
|
57 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
|
58 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
|
59 (inst.args[1], inst.args[0])) |
2123aad24d56
error: add new ParseError for various parsing errors
Matt Mackall <mpm@selenic.com>
parents:
11287
diff
changeset
|
60 else: |
14615
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
61 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
|
62 return -1 |
14615
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
63 |
14439
80c599eee3f3
dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents:
14438
diff
changeset
|
64 return _runcatch(req) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
65 |
14439
80c599eee3f3
dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents:
14438
diff
changeset
|
66 def _runcatch(req): |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
67 def catchterm(*args): |
7644
182b7114d35a
error: move SignalInterrupt
Matt Mackall <mpm@selenic.com>
parents:
7643
diff
changeset
|
68 raise error.SignalInterrupt |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
69 |
14439
80c599eee3f3
dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents:
14438
diff
changeset
|
70 ui = req.ui |
10952
6c2c766afefe
dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents:
10793
diff
changeset
|
71 try: |
6c2c766afefe
dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents:
10793
diff
changeset
|
72 for name in 'SIGBREAK', 'SIGHUP', 'SIGTERM': |
6c2c766afefe
dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents:
10793
diff
changeset
|
73 num = getattr(signal, name, None) |
6c2c766afefe
dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents:
10793
diff
changeset
|
74 if num: |
6c2c766afefe
dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents:
10793
diff
changeset
|
75 signal.signal(num, catchterm) |
6c2c766afefe
dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents:
10793
diff
changeset
|
76 except ValueError: |
6c2c766afefe
dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents:
10793
diff
changeset
|
77 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
|
78 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
79 try: |
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 # 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
|
82 if '--debugger' in req.args: |
11495
6ee107782018
debugger: give a little intro before entering pdb
Mads Kiilerich <mads@kiilerich.com>
parents:
11494
diff
changeset
|
83 ui.warn(_("entering debugger - " |
6ee107782018
debugger: give a little intro before entering pdb
Mads Kiilerich <mads@kiilerich.com>
parents:
11494
diff
changeset
|
84 "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
|
85 pdb.set_trace() |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
86 try: |
14439
80c599eee3f3
dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents:
14438
diff
changeset
|
87 return _dispatch(req) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
88 finally: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
89 ui.flush() |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
90 except: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
91 # 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
|
92 if '--debugger' in req.args: |
11494
2347513f562a
debugger: show traceback before entering pdb post-mortem
Mads Kiilerich <mads@kiilerich.com>
parents:
11330
diff
changeset
|
93 traceback.print_exc() |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
94 pdb.post_mortem(sys.exc_info()[2]) |
8206
cce63ef1045b
ui: print_exc() -> traceback()
Matt Mackall <mpm@selenic.com>
parents:
8190
diff
changeset
|
95 ui.traceback() |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
96 raise |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
97 |
7645
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
98 # Global exception handling, alphabetically |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
99 # 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
|
100 except error.AmbiguousCommand, inst: |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
101 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
|
102 (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
|
103 except error.ParseError, inst: |
2123aad24d56
error: add new ParseError for various parsing errors
Matt Mackall <mpm@selenic.com>
parents:
11287
diff
changeset
|
104 if len(inst.args) > 1: |
2123aad24d56
error: add new ParseError for various parsing errors
Matt Mackall <mpm@selenic.com>
parents:
11287
diff
changeset
|
105 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
|
106 (inst.args[1], inst.args[0])) |
2123aad24d56
error: add new ParseError for various parsing errors
Matt Mackall <mpm@selenic.com>
parents:
11287
diff
changeset
|
107 else: |
2123aad24d56
error: add new ParseError for various parsing errors
Matt Mackall <mpm@selenic.com>
parents:
11287
diff
changeset
|
108 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
|
109 return -1 |
7640 | 110 except error.LockHeld, inst: |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
111 if inst.errno == errno.ETIMEDOUT: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
112 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
|
113 else: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
114 reason = _('lock held by %s') % inst.locker |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
115 ui.warn(_("abort: %s: %s\n") % (inst.desc or inst.filename, reason)) |
7640 | 116 except error.LockUnavailable, inst: |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
117 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
|
118 (inst.desc or inst.filename, inst.strerror)) |
11287
b901bb751999
error: change ParseError to CommandError
Matt Mackall <mpm@selenic.com>
parents:
11209
diff
changeset
|
119 except error.CommandError, inst: |
7645
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
120 if inst.args[0]: |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
121 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
|
122 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
|
123 else: |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
124 ui.warn(_("hg: %s\n") % inst.args[1]) |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
125 commands.help_(ui, 'shortlist') |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
126 except error.RepoError, inst: |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
127 ui.warn(_("abort: %s!\n") % inst) |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
128 except error.ResponseError, inst: |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
129 ui.warn(_("abort: %s") % inst.args[0]) |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
130 if not isinstance(inst.args[1], basestring): |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
131 ui.warn(" %r\n" % (inst.args[1],)) |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
132 elif not inst.args[1]: |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
133 ui.warn(_(" empty string\n")) |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
134 else: |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
135 ui.warn("\n%r\n" % util.ellipsis(inst.args[1])) |
7633 | 136 except error.RevlogError, inst: |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
137 ui.warn(_("abort: %s!\n") % inst) |
7644
182b7114d35a
error: move SignalInterrupt
Matt Mackall <mpm@selenic.com>
parents:
7643
diff
changeset
|
138 except error.SignalInterrupt: |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
139 ui.warn(_("killed!\n")) |
7645
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
140 except error.UnknownCommand, inst: |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
141 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
|
142 try: |
de1e7099d100
dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents:
10282
diff
changeset
|
143 # 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
|
144 # (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
|
145 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
|
146 except error.UnknownCommand: |
de1e7099d100
dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents:
10282
diff
changeset
|
147 commands.help_(ui, 'shortlist') |
7645
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
148 except util.Abort, inst: |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
149 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
|
150 if inst.hint: |
11683
757f39fa1162
dispatch: write Abort hint to stderr too
Patrick Mezard <pmezard@gmail.com>
parents:
11601
diff
changeset
|
151 ui.warn(_("(%s)\n") % inst.hint) |
7645
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
152 except ImportError, inst: |
11053
59d0d715fbfa
dispatch: don't mangle ImportError abort messages
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
10952
diff
changeset
|
153 ui.warn(_("abort: %s!\n") % inst) |
7645
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
154 m = str(inst).split()[-1] |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
155 if m in "mpatch bdiff".split(): |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
156 ui.warn(_("(did you forget to compile extensions?)\n")) |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
157 elif m in "zlib".split(): |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
158 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
|
159 except IOError, inst: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
160 if hasattr(inst, "code"): |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
161 ui.warn(_("abort: %s\n") % inst) |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
162 elif hasattr(inst, "reason"): |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
163 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
|
164 reason = inst.reason.args[1] |
14096
dea93484cf9f
dispatch: handle IndexErrors
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
14004
diff
changeset
|
165 except (AttributeError, IndexError): |
dea93484cf9f
dispatch: handle IndexErrors
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
14004
diff
changeset
|
166 # 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
|
167 reason = inst.reason |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
168 ui.warn(_("abort: error: %s\n") % reason) |
7474
b2cbced7bb50
use inst.args instead of using __getitem__ directly
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7388
diff
changeset
|
169 elif hasattr(inst, "args") and inst.args[0] == errno.EPIPE: |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
170 if ui.debugflag: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
171 ui.warn(_("broken pipe\n")) |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
172 elif getattr(inst, "strerror", None): |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
173 if getattr(inst, "filename", None): |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
174 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
|
175 else: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
176 ui.warn(_("abort: %s\n") % inst.strerror) |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
177 else: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
178 raise |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
179 except OSError, inst: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
180 if getattr(inst, "filename", None): |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
181 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
|
182 else: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
183 ui.warn(_("abort: %s\n") % inst.strerror) |
7645
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
184 except KeyboardInterrupt: |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
185 try: |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
186 ui.warn(_("interrupted!\n")) |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
187 except IOError, inst: |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
188 if inst.errno == errno.EPIPE: |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
189 if ui.debugflag: |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
190 ui.warn(_("\nbroken pipe\n")) |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
191 else: |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
192 raise |
5633
e04a65111a80
dispatch: report OOM rather than traceback
Matt Mackall <mpm@selenic.com>
parents:
5542
diff
changeset
|
193 except MemoryError: |
e04a65111a80
dispatch: report OOM rather than traceback
Matt Mackall <mpm@selenic.com>
parents:
5542
diff
changeset
|
194 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
|
195 except SystemExit, inst: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
196 # 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
|
197 # 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
|
198 return inst.code |
7645
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
199 except socket.error, inst: |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
200 ui.warn(_("abort: %s\n") % inst.args[-1]) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
201 except: |
12831
4d657b524be8
traceback: point to BugTracker on the wiki
Matt Mackall <mpm@selenic.com>
parents:
12800
diff
changeset
|
202 ui.warn(_("** unknown exception encountered," |
4d657b524be8
traceback: point to BugTracker on the wiki
Matt Mackall <mpm@selenic.com>
parents:
12800
diff
changeset
|
203 " please report by visiting\n")) |
4d657b524be8
traceback: point to BugTracker on the wiki
Matt Mackall <mpm@selenic.com>
parents:
12800
diff
changeset
|
204 ui.warn(_("** http://mercurial.selenic.com/wiki/BugTracker\n")) |
11206
ed71cb07d7b2
dispatch: include Python version in traceback
Martin Geisler <mg@aragost.com>
parents:
11053
diff
changeset
|
205 ui.warn(_("** Python %s\n") % sys.version.replace('\n', '')) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
206 ui.warn(_("** Mercurial Distributed SCM (version %s)\n") |
7632 | 207 % util.version()) |
6985
5cf3bf3c19ba
show extensions loaded on traceback
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
6217
diff
changeset
|
208 ui.warn(_("** Extensions loaded: %s\n") |
5cf3bf3c19ba
show extensions loaded on traceback
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
6217
diff
changeset
|
209 % ", ".join([x[0] for x in extensions.extensions()])) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
210 raise |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
211 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
212 return -1 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
213 |
14265
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
214 def aliasargs(fn, givenargs): |
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
215 args = getattr(fn, 'args', []) |
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
216 if args and givenargs: |
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
217 cmd = ' '.join(map(util.shellquote, args)) |
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
218 |
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
219 nums = [] |
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
220 def replacer(m): |
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
221 num = int(m.group(1)) - 1 |
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
222 nums.append(num) |
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
223 return givenargs[num] |
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
224 cmd = re.sub(r'\$(\d+|\$)', replacer, cmd) |
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
225 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
|
226 if i not in nums] |
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
227 args = shlex.split(cmd) |
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
228 return args + givenargs |
8655 | 229 |
230 class cmdalias(object): | |
231 def __init__(self, name, definition, cmdtable): | |
12039
18e1e7520b67
alias: make shadowing behavior more consistent (issue2054)
Brodie Rao <brodie@bitheap.org>
parents:
11712
diff
changeset
|
232 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
|
233 self.cmdname = '' |
8655 | 234 self.definition = definition |
235 self.args = [] | |
236 self.opts = [] | |
237 self.help = '' | |
238 self.norepo = True | |
10021
0022f5c5459e
help: don't display bogus help messages for invalid aliases
Brodie Rao <me+hg@dackz.net>
parents:
9994
diff
changeset
|
239 self.badalias = False |
8655 | 240 |
241 try: | |
12039
18e1e7520b67
alias: make shadowing behavior more consistent (issue2054)
Brodie Rao <brodie@bitheap.org>
parents:
11712
diff
changeset
|
242 aliases, entry = cmdutil.findcmd(self.name, cmdtable) |
18e1e7520b67
alias: make shadowing behavior more consistent (issue2054)
Brodie Rao <brodie@bitheap.org>
parents:
11712
diff
changeset
|
243 for alias, e in cmdtable.iteritems(): |
18e1e7520b67
alias: make shadowing behavior more consistent (issue2054)
Brodie Rao <brodie@bitheap.org>
parents:
11712
diff
changeset
|
244 if e is entry: |
18e1e7520b67
alias: make shadowing behavior more consistent (issue2054)
Brodie Rao <brodie@bitheap.org>
parents:
11712
diff
changeset
|
245 self.cmd = alias |
18e1e7520b67
alias: make shadowing behavior more consistent (issue2054)
Brodie Rao <brodie@bitheap.org>
parents:
11712
diff
changeset
|
246 break |
8655 | 247 self.shadows = True |
248 except error.UnknownCommand: | |
249 self.shadows = False | |
250 | |
251 if not self.definition: | |
252 def fn(ui, *args): | |
253 ui.warn(_("no definition for alias '%s'\n") % self.name) | |
254 return 1 | |
255 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
|
256 self.badalias = True |
8655 | 257 |
258 return | |
259 | |
11524
24965bb270b7
dispatch: add shell aliases
Steve Losh <steve@stevelosh.com>
parents:
11495
diff
changeset
|
260 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
|
261 self.shell = True |
11524
24965bb270b7
dispatch: add shell aliases
Steve Losh <steve@stevelosh.com>
parents:
11495
diff
changeset
|
262 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
|
263 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
|
264 def _checkvar(m): |
13392
777cef34a890
dispatch: support for $ escaping in shell-alias definition
Roman Sokolov <sokolov.r.v@gmail.com>
parents:
13382
diff
changeset
|
265 if m.groups()[0] == '$': |
777cef34a890
dispatch: support for $ escaping in shell-alias definition
Roman Sokolov <sokolov.r.v@gmail.com>
parents:
13382
diff
changeset
|
266 return m.group() |
777cef34a890
dispatch: support for $ escaping in shell-alias definition
Roman Sokolov <sokolov.r.v@gmail.com>
parents:
13382
diff
changeset
|
267 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
|
268 return m.group() |
f853873fc66d
aliases: provide more flexible ways to work with shell alias arguments
Steve Losh <steve@stevelosh.com>
parents:
11985
diff
changeset
|
269 else: |
14708
8083f4d00bd1
i18n: remove translation of debug messages
David Soria Parra <dsp@php.net>
parents:
14704
diff
changeset
|
270 ui.debug("No argument found for substitution " |
8083f4d00bd1
i18n: remove translation of debug messages
David Soria Parra <dsp@php.net>
parents:
14704
diff
changeset
|
271 "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
|
272 % (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
|
273 return '' |
13392
777cef34a890
dispatch: support for $ escaping in shell-alias definition
Roman Sokolov <sokolov.r.v@gmail.com>
parents:
13382
diff
changeset
|
274 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
|
275 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
|
276 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
|
277 replace['@'] = ' '.join(args) |
13392
777cef34a890
dispatch: support for $ escaping in shell-alias definition
Roman Sokolov <sokolov.r.v@gmail.com>
parents:
13382
diff
changeset
|
278 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
|
279 return util.system(cmd, environ=env, out=ui.fout) |
11524
24965bb270b7
dispatch: add shell aliases
Steve Losh <steve@stevelosh.com>
parents:
11495
diff
changeset
|
280 self.fn = fn |
24965bb270b7
dispatch: add shell aliases
Steve Losh <steve@stevelosh.com>
parents:
11495
diff
changeset
|
281 return |
24965bb270b7
dispatch: add shell aliases
Steve Losh <steve@stevelosh.com>
parents:
11495
diff
changeset
|
282 |
8655 | 283 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
|
284 self.cmdname = cmd = args.pop(0) |
10793
16df09a54113
expand paths in aliases
Alexander Solovyov <piranha@piranha.org.ua>
parents:
10564
diff
changeset
|
285 args = map(util.expandpath, args) |
8655 | 286 |
11695
ee8f36a6c766
alias: improved diagnostic when arguments include --cwd, etc.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
11681
diff
changeset
|
287 for invalidarg in ("--cwd", "-R", "--repository", "--repo"): |
ee8f36a6c766
alias: improved diagnostic when arguments include --cwd, etc.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
11681
diff
changeset
|
288 if _earlygetopt([invalidarg], args): |
ee8f36a6c766
alias: improved diagnostic when arguments include --cwd, etc.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
11681
diff
changeset
|
289 def fn(ui, *args): |
ee8f36a6c766
alias: improved diagnostic when arguments include --cwd, etc.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
11681
diff
changeset
|
290 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
|
291 "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
|
292 % (self.name, invalidarg)) |
ee8f36a6c766
alias: improved diagnostic when arguments include --cwd, etc.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
11681
diff
changeset
|
293 return 1 |
ee8f36a6c766
alias: improved diagnostic when arguments include --cwd, etc.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
11681
diff
changeset
|
294 |
ee8f36a6c766
alias: improved diagnostic when arguments include --cwd, etc.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
11681
diff
changeset
|
295 self.fn = fn |
ee8f36a6c766
alias: improved diagnostic when arguments include --cwd, etc.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
11681
diff
changeset
|
296 self.badalias = True |
ee8f36a6c766
alias: improved diagnostic when arguments include --cwd, etc.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
11681
diff
changeset
|
297 return |
ee8f36a6c766
alias: improved diagnostic when arguments include --cwd, etc.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
11681
diff
changeset
|
298 |
8655 | 299 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
|
300 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
|
301 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
|
302 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
|
303 else: |
8bce1e0d2801
alias: do not crash when aliased command has no usage help text
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9825
diff
changeset
|
304 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
|
305 |
14265
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
306 self.args = aliasargs(self.fn, args) |
8655 | 307 if cmd not in commands.norepo.split(' '): |
308 self.norepo = False | |
9876
6e8a16dd3e30
alias: improve help text for command aliases
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
9875
diff
changeset
|
309 if self.help.startswith("hg " + cmd): |
6e8a16dd3e30
alias: improve help text for command aliases
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
9875
diff
changeset
|
310 # 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
|
311 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
|
312 self.__doc__ = self.fn.__doc__ |
9876
6e8a16dd3e30
alias: improve help text for command aliases
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
9875
diff
changeset
|
313 |
8655 | 314 except error.UnknownCommand: |
315 def fn(ui, *args): | |
316 ui.warn(_("alias '%s' resolves to unknown command '%s'\n") \ | |
317 % (self.name, cmd)) | |
10364
de1e7099d100
dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents:
10282
diff
changeset
|
318 try: |
de1e7099d100
dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents:
10282
diff
changeset
|
319 # 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
|
320 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
|
321 except error.UnknownCommand: |
de1e7099d100
dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents:
10282
diff
changeset
|
322 pass |
8655 | 323 return 1 |
324 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
|
325 self.badalias = True |
8655 | 326 except error.AmbiguousCommand: |
327 def fn(ui, *args): | |
328 ui.warn(_("alias '%s' resolves to ambiguous command '%s'\n") \ | |
329 % (self.name, cmd)) | |
330 return 1 | |
331 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
|
332 self.badalias = True |
8655 | 333 |
334 def __call__(self, ui, *args, **opts): | |
335 if self.shadows: | |
14704
b24d596fcd25
Backed out changeset 1ec8bd909ac3
Martin Geisler <mg@aragost.com>
parents:
14702
diff
changeset
|
336 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
|
337 (self.name, self.cmdname)) |
8655 | 338 |
13394
30e103dacd5f
dispatch: use flag cmdalias.shell for detecting shell aliases
Roman Sokolov <sokolov.r.v@gmail.com>
parents:
13393
diff
changeset
|
339 if hasattr(self, 'shell'): |
11989
f853873fc66d
aliases: provide more flexible ways to work with shell alias arguments
Steve Losh <steve@stevelosh.com>
parents:
11985
diff
changeset
|
340 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
|
341 else: |
12093
cd895084a4cd
alias: on --debug, print expansion when it has invalid arguments
Brodie Rao <brodie@bitheap.org>
parents:
12092
diff
changeset
|
342 try: |
cd895084a4cd
alias: on --debug, print expansion when it has invalid arguments
Brodie Rao <brodie@bitheap.org>
parents:
12092
diff
changeset
|
343 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
|
344 except error.SignatureError: |
cd895084a4cd
alias: on --debug, print expansion when it has invalid arguments
Brodie Rao <brodie@bitheap.org>
parents:
12092
diff
changeset
|
345 args = ' '.join([self.cmdname] + self.args) |
14704
b24d596fcd25
Backed out changeset 1ec8bd909ac3
Martin Geisler <mg@aragost.com>
parents:
14702
diff
changeset
|
346 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
|
347 raise |
8655 | 348 |
349 def addaliases(ui, cmdtable): | |
350 # aliases are processed after extensions have been loaded, so they | |
351 # may use extension commands. Aliases can also use other alias definitions, | |
352 # but only if they have been defined prior to the current definition. | |
353 for alias, definition in ui.configitems('alias'): | |
354 aliasdef = cmdalias(alias, definition, cmdtable) | |
12039
18e1e7520b67
alias: make shadowing behavior more consistent (issue2054)
Brodie Rao <brodie@bitheap.org>
parents:
11712
diff
changeset
|
355 cmdtable[aliasdef.cmd] = (aliasdef, aliasdef.opts, aliasdef.help) |
8655 | 356 if aliasdef.norepo: |
357 commands.norepo += ' %s' % alias | |
358 | |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
359 def _parse(ui, args): |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
360 options = {} |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
361 cmdoptions = {} |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
362 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
363 try: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
364 args = fancyopts.fancyopts(args, commands.globalopts, options) |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
365 except fancyopts.getopt.GetoptError, inst: |
11287
b901bb751999
error: change ParseError to CommandError
Matt Mackall <mpm@selenic.com>
parents:
11209
diff
changeset
|
366 raise error.CommandError(None, inst) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
367 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
368 if args: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
369 cmd, args = args[0], args[1:] |
9875
d6a95c5f6ff9
dispatch: minor refactoring
Henri Wiechers <hwiechers@gmail.com>
parents:
9825
diff
changeset
|
370 aliases, entry = cmdutil.findcmd(cmd, commands.table, |
7224
12a90281d83d
Minor cleanup: Add missing space forgotten in recent change.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
7213
diff
changeset
|
371 ui.config("ui", "strict")) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
372 cmd = aliases[0] |
14265
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
373 args = aliasargs(entry[0], args) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
374 defaults = ui.config("defaults", cmd) |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
375 if defaults: |
9610
d78fe60f6bda
make path expanding more consistent
Alexander Solovyov <piranha@piranha.org.ua>
parents:
9569
diff
changeset
|
376 args = map(util.expandpath, shlex.split(defaults)) + args |
9875
d6a95c5f6ff9
dispatch: minor refactoring
Henri Wiechers <hwiechers@gmail.com>
parents:
9825
diff
changeset
|
377 c = list(entry[1]) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
378 else: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
379 cmd = None |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
380 c = [] |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
381 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
382 # combine global options into local |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
383 for o in commands.globalopts: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
384 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
|
385 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
386 try: |
7772
88887054d277
fancyopts: Parse options that occur after arguments.
Augie Fackler <durin42@gmail.com>
parents:
7733
diff
changeset
|
387 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
|
388 except fancyopts.getopt.GetoptError, inst: |
11287
b901bb751999
error: change ParseError to CommandError
Matt Mackall <mpm@selenic.com>
parents:
11209
diff
changeset
|
389 raise error.CommandError(cmd, inst) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
390 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
391 # separate global options back out |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
392 for o in commands.globalopts: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
393 n = o[1] |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
394 options[n] = cmdoptions[n] |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
395 del cmdoptions[n] |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
396 |
9875
d6a95c5f6ff9
dispatch: minor refactoring
Henri Wiechers <hwiechers@gmail.com>
parents:
9825
diff
changeset
|
397 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
|
398 |
8137 | 399 def _parseconfig(ui, config): |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
400 """parse the --config options from the command line""" |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
401 for cfg in config: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
402 try: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
403 name, value = cfg.split('=', 1) |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
404 section, name = name.split('.', 1) |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
405 if not section or not name: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
406 raise IndexError |
8137 | 407 ui.setconfig(section, name, value) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
408 except (IndexError, ValueError): |
9825
0d850f8beea6
dispatch: better error message for --config option
Bill Schroeder <bschroeder@allstontrading.com>
parents:
9679
diff
changeset
|
409 raise util.Abort(_('malformed --config option: %r ' |
0d850f8beea6
dispatch: better error message for --config option
Bill Schroeder <bschroeder@allstontrading.com>
parents:
9679
diff
changeset
|
410 '(use --config section.name=value)') % cfg) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
411 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
412 def _earlygetopt(aliases, args): |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
413 """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
|
414 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
415 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
|
416 The options and values are removed from args. |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
417 """ |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
418 try: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
419 argcount = args.index("--") |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
420 except ValueError: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
421 argcount = len(args) |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
422 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
|
423 values = [] |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
424 pos = 0 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
425 while pos < argcount: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
426 if args[pos] in aliases: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
427 if pos + 1 >= argcount: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
428 # ignore and let getopt report an error if there is no value |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
429 break |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
430 del args[pos] |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
431 values.append(args.pop(pos)) |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
432 argcount -= 2 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
433 elif args[pos][:2] in shortopts: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
434 # 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
|
435 values.append(args.pop(pos)[2:]) |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
436 argcount -= 1 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
437 else: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
438 pos += 1 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
439 return values |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
440 |
11330
713ae78bb583
provide pre- and post- hooks with parsed command line arguments.
Chad Dombrova <chadrik@gmail.com>
parents:
11305
diff
changeset
|
441 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
|
442 # run pre-hook, and abort if it fails |
11330
713ae78bb583
provide pre- and post- hooks with parsed command line arguments.
Chad Dombrova <chadrik@gmail.com>
parents:
11305
diff
changeset
|
443 ret = hook.hook(lui, repo, "pre-%s" % cmd, False, args=" ".join(fullargs), |
713ae78bb583
provide pre- and post- hooks with parsed command line arguments.
Chad Dombrova <chadrik@gmail.com>
parents:
11305
diff
changeset
|
444 pats=cmdpats, opts=cmdoptions) |
7819
14b703252f14
dispatch: extract command execution block into method
Bill Barry <after.fallout@gmail.com>
parents:
7772
diff
changeset
|
445 if ret: |
14b703252f14
dispatch: extract command execution block into method
Bill Barry <after.fallout@gmail.com>
parents:
7772
diff
changeset
|
446 return ret |
14b703252f14
dispatch: extract command execution block into method
Bill Barry <after.fallout@gmail.com>
parents:
7772
diff
changeset
|
447 ret = _runcommand(ui, options, cmd, d) |
14b703252f14
dispatch: extract command execution block into method
Bill Barry <after.fallout@gmail.com>
parents:
7772
diff
changeset
|
448 # run post-hook, passing command result |
14b703252f14
dispatch: extract command execution block into method
Bill Barry <after.fallout@gmail.com>
parents:
7772
diff
changeset
|
449 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
|
450 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
|
451 return ret |
14b703252f14
dispatch: extract command execution block into method
Bill Barry <after.fallout@gmail.com>
parents:
7772
diff
changeset
|
452 |
12536
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
453 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
|
454 """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
|
455 |
12536
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
456 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
|
457 """ |
11675
f92f8921a5cc
dispatch: give better error message when cwd doesn't exist (issue2293)
Mads Kiilerich <mads@kiilerich.com>
parents:
11600
diff
changeset
|
458 try: |
f92f8921a5cc
dispatch: give better error message when cwd doesn't exist (issue2293)
Mads Kiilerich <mads@kiilerich.com>
parents:
11600
diff
changeset
|
459 wd = os.getcwd() |
f92f8921a5cc
dispatch: give better error message when cwd doesn't exist (issue2293)
Mads Kiilerich <mads@kiilerich.com>
parents:
11600
diff
changeset
|
460 except OSError, e: |
11712
9cbc62f68328
dispatch: trailing whitespace
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11676
diff
changeset
|
461 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
|
462 e.strerror) |
f92f8921a5cc
dispatch: give better error message when cwd doesn't exist (issue2293)
Mads Kiilerich <mads@kiilerich.com>
parents:
11600
diff
changeset
|
463 path = cmdutil.findrepo(wd) or "" |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
464 if not path: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
465 lui = ui |
9436 | 466 else: |
12636
c24215aa7e69
dispatch: remove superfluous try/except when reading local ui config
Brodie Rao <brodie@bitheap.org>
parents:
12633
diff
changeset
|
467 lui = ui.copy() |
12637
42ca7aef28d3
dispatch: properly handle relative path aliases used with -R (issue2376)
Brodie Rao <brodie@bitheap.org>
parents:
12636
diff
changeset
|
468 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
|
469 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
470 if rpath: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
471 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
|
472 lui = ui.copy() |
12637
42ca7aef28d3
dispatch: properly handle relative path aliases used with -R (issue2376)
Brodie Rao <brodie@bitheap.org>
parents:
12636
diff
changeset
|
473 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
|
474 |
12536
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
475 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
|
476 |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
477 def _checkshellalias(ui, args): |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
478 cwd = os.getcwd() |
12633
301d7626e0ff
alias: back up and restore commands.norepo before checking for shell aliases
Steve Losh <steve@stevelosh.com>
parents:
12536
diff
changeset
|
479 norepo = commands.norepo |
12536
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
480 options = {} |
12748
d10369fefd01
alias: fail gracefully when invalid global options are given (issue2442)
Steve Losh <steve@stevelosh.com>
parents:
12637
diff
changeset
|
481 |
d10369fefd01
alias: fail gracefully when invalid global options are given (issue2442)
Steve Losh <steve@stevelosh.com>
parents:
12637
diff
changeset
|
482 try: |
d10369fefd01
alias: fail gracefully when invalid global options are given (issue2442)
Steve Losh <steve@stevelosh.com>
parents:
12637
diff
changeset
|
483 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
|
484 except fancyopts.getopt.GetoptError: |
d10369fefd01
alias: fail gracefully when invalid global options are given (issue2442)
Steve Losh <steve@stevelosh.com>
parents:
12637
diff
changeset
|
485 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
|
486 |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
487 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
|
488 return |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
489 |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
490 _parseconfig(ui, options['config']) |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
491 if options['cwd']: |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
492 os.chdir(options['cwd']) |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
493 |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
494 path, lui = _getlocal(ui, [options['repository']]) |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
495 |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
496 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
|
497 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
|
498 |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
499 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
|
500 try: |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
501 aliases, entry = cmdutil.findcmd(cmd, cmdtable, lui.config("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
|
502 except (error.AmbiguousCommand, error.UnknownCommand): |
12633
301d7626e0ff
alias: back up and restore commands.norepo before checking for shell aliases
Steve Losh <steve@stevelosh.com>
parents:
12536
diff
changeset
|
503 commands.norepo = norepo |
12536
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
504 os.chdir(cwd) |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
505 return |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
506 |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
507 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
|
508 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
|
509 |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
510 if cmd and hasattr(fn, 'shell'): |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
511 d = lambda: fn(ui, *args[1:]) |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
512 return lambda: runcommand(lui, None, cmd, args[:1], ui, options, d, [], {}) |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
513 |
12633
301d7626e0ff
alias: back up and restore commands.norepo before checking for shell aliases
Steve Losh <steve@stevelosh.com>
parents:
12536
diff
changeset
|
514 commands.norepo = norepo |
12536
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
515 os.chdir(cwd) |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
516 |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
517 _loaded = set() |
14439
80c599eee3f3
dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents:
14438
diff
changeset
|
518 def _dispatch(req): |
14438
08bfec2ef031
dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents:
14286
diff
changeset
|
519 args = req.args |
14439
80c599eee3f3
dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents:
14438
diff
changeset
|
520 ui = req.ui |
80c599eee3f3
dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents:
14438
diff
changeset
|
521 |
12536
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
522 shellaliasfn = _checkshellalias(ui, args) |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
523 if shellaliasfn: |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
524 return shellaliasfn() |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
525 |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
526 # 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
|
527 # (e.g. to change trust settings for reading .hg/hgrc) |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
528 _parseconfig(ui, _earlygetopt(['--config'], args)) |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
529 |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
530 # 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
|
531 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
|
532 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
|
533 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
|
534 |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
535 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
|
536 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
|
537 |
9410
1c83938b6a8e
extensions: load and configure extensions in well-defined phases
Martin Geisler <mg@lazybytes.net>
parents:
8936
diff
changeset
|
538 # 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
|
539 # 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
|
540 # 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
|
541 extensions.loadall(lui) |
9410
1c83938b6a8e
extensions: load and configure extensions in well-defined phases
Martin Geisler <mg@lazybytes.net>
parents:
8936
diff
changeset
|
542 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
|
543 # 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
|
544 ui.__class__ = lui.__class__ |
5828
863e237b58fb
dispatch: allow extensions to provide setup code
Kirill Smelkov <kirr@mns.spb.ru>
parents:
5664
diff
changeset
|
545 |
9660
e0eae93e6c67
extensions: changed to call extsetup() from extensions.loadall()
Yuya Nishihara <yuya@tcha.org>
parents:
9610
diff
changeset
|
546 # (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
|
547 |
9410
1c83938b6a8e
extensions: load and configure extensions in well-defined phases
Martin Geisler <mg@lazybytes.net>
parents:
8936
diff
changeset
|
548 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
|
549 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
|
550 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
|
551 if overrides: |
60acf1432ee0
Move cmdtable and reposetup handling out of extensions.py
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5178
diff
changeset
|
552 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
|
553 % (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
|
554 commands.table.update(cmdtable) |
8304
991ca609ccd6
dispatch: remember loaded extensions in a real set
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
555 _loaded.add(name) |
8655 | 556 |
9410
1c83938b6a8e
extensions: load and configure extensions in well-defined phases
Martin Geisler <mg@lazybytes.net>
parents:
8936
diff
changeset
|
557 # (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
|
558 |
8655 | 559 addaliases(lui, commands.table) |
560 | |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
561 # check for fallback encoding |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
562 fallback = lui.config('ui', 'fallbackencoding') |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
563 if fallback: |
7948
de377b1a9a84
move encoding bits from util to encoding
Matt Mackall <mpm@selenic.com>
parents:
7873
diff
changeset
|
564 encoding.fallbackencoding = fallback |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
565 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
566 fullargs = args |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
567 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
|
568 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
569 if options["config"]: |
12067
a4fbbe0fbc38
Lowercase error messages
Martin Geisler <mg@lazybytes.net>
parents:
12039
diff
changeset
|
570 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
|
571 if options["cwd"]: |
12067
a4fbbe0fbc38
Lowercase error messages
Martin Geisler <mg@lazybytes.net>
parents:
12039
diff
changeset
|
572 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
|
573 if options["repository"]: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
574 raise util.Abort(_( |
8911
62e3b9466700
translated a bunch of strings to danish
Sune Foldager <cryo@cyanite.org>
parents:
8655
diff
changeset
|
575 "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
|
576 "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
|
577 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
578 if options["encoding"]: |
7948
de377b1a9a84
move encoding bits from util to encoding
Matt Mackall <mpm@selenic.com>
parents:
7873
diff
changeset
|
579 encoding.encoding = options["encoding"] |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
580 if options["encodingmode"]: |
7948
de377b1a9a84
move encoding bits from util to encoding
Matt Mackall <mpm@selenic.com>
parents:
7873
diff
changeset
|
581 encoding.encodingmode = options["encodingmode"] |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
582 if options["time"]: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
583 def get_times(): |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
584 t = os.times() |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
585 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
|
586 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
|
587 return t |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
588 s = get_times() |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
589 def print_time(): |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
590 t = get_times() |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
591 ui.warn(_("Time: real %.3f secs (user %.3f+%.3f sys %.3f+%.3f)\n") % |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
592 (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
|
593 atexit.register(print_time) |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
594 |
8136
6b5522cb2ad2
ui: refactor option setting
Matt Mackall <mpm@selenic.com>
parents:
8024
diff
changeset
|
595 if options['verbose'] or options['debug'] or options['quiet']: |
14618
110d75f0abb3
dispatch: fix for-loop variable name
Idan Kamara <idankk86@gmail.com>
parents:
14615
diff
changeset
|
596 for ui_ in (ui, lui): |
110d75f0abb3
dispatch: fix for-loop variable name
Idan Kamara <idankk86@gmail.com>
parents:
14615
diff
changeset
|
597 ui_.setconfig('ui', 'verbose', str(bool(options['verbose']))) |
110d75f0abb3
dispatch: fix for-loop variable name
Idan Kamara <idankk86@gmail.com>
parents:
14615
diff
changeset
|
598 ui_.setconfig('ui', 'debug', str(bool(options['debug']))) |
110d75f0abb3
dispatch: fix for-loop variable name
Idan Kamara <idankk86@gmail.com>
parents:
14615
diff
changeset
|
599 ui_.setconfig('ui', 'quiet', str(bool(options['quiet']))) |
8136
6b5522cb2ad2
ui: refactor option setting
Matt Mackall <mpm@selenic.com>
parents:
8024
diff
changeset
|
600 if options['traceback']: |
14618
110d75f0abb3
dispatch: fix for-loop variable name
Idan Kamara <idankk86@gmail.com>
parents:
14615
diff
changeset
|
601 for ui_ in (ui, lui): |
110d75f0abb3
dispatch: fix for-loop variable name
Idan Kamara <idankk86@gmail.com>
parents:
14615
diff
changeset
|
602 ui_.setconfig('ui', 'traceback', 'on') |
8136
6b5522cb2ad2
ui: refactor option setting
Matt Mackall <mpm@selenic.com>
parents:
8024
diff
changeset
|
603 if options['noninteractive']: |
14618
110d75f0abb3
dispatch: fix for-loop variable name
Idan Kamara <idankk86@gmail.com>
parents:
14615
diff
changeset
|
604 for ui_ in (ui, lui): |
110d75f0abb3
dispatch: fix for-loop variable name
Idan Kamara <idankk86@gmail.com>
parents:
14615
diff
changeset
|
605 ui_.setconfig('ui', 'interactive', 'off') |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
606 |
13328
a939f08fae9c
url: add --insecure option to bypass verification of ssl certificates
Yuya Nishihara <yuya@tcha.org>
parents:
12932
diff
changeset
|
607 if cmdoptions.get('insecure', False): |
14618
110d75f0abb3
dispatch: fix for-loop variable name
Idan Kamara <idankk86@gmail.com>
parents:
14615
diff
changeset
|
608 for ui_ in (ui, lui): |
110d75f0abb3
dispatch: fix for-loop variable name
Idan Kamara <idankk86@gmail.com>
parents:
14615
diff
changeset
|
609 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
|
610 |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
611 if options['help']: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
612 return commands.help_(ui, cmd, options['version']) |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
613 elif options['version']: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
614 return commands.version_(ui) |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
615 elif not cmd: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
616 return commands.help_(ui, 'shortlist') |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
617 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
618 repo = None |
11330
713ae78bb583
provide pre- and post- hooks with parsed command line arguments.
Chad Dombrova <chadrik@gmail.com>
parents:
11305
diff
changeset
|
619 cmdpats = args[:] |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
620 if cmd not in commands.norepo.split(): |
14510
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
621 # use the repo from the request only if we don't have -R |
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
622 if not rpath: |
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
623 repo = req.repo |
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
624 |
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
625 if not repo: |
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
626 try: |
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
627 repo = hg.repository(ui, path=path) |
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
628 ui = repo.ui |
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
629 if not repo.local(): |
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
630 raise util.Abort(_("repository '%s' is not local") % path) |
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
631 ui.setconfig("bundle", "mainreporoot", repo.root) |
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
632 except error.RequirementError: |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
633 raise |
14510
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
634 except error.RepoError: |
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
635 if cmd not in commands.optionalrepo.split(): |
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
636 if args and not path: # try to infer -R from command args |
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
637 repos = map(cmdutil.findrepo, args) |
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
638 guess = repos[0] |
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
639 if guess and repos.count(guess) == len(repos): |
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
640 req.args = ['--repository', guess] + fullargs |
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
641 return _dispatch(req) |
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
642 if not path: |
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
643 raise error.RepoError(_("no repository found in %r" |
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
644 " (.hg not found)") % os.getcwd()) |
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
645 raise |
7388
5751631246de
dispatch: generalize signature checking for extension command wrapping
Matt Mackall <mpm@selenic.com>
parents:
7280
diff
changeset
|
646 args.insert(0, repo) |
7733
30e95eafc1d0
warn if --repository provided for norepo commands
Matt Mackall <mpm@selenic.com>
parents:
7646
diff
changeset
|
647 elif rpath: |
11600
76454cbc11e4
mark ui.warn strings for translation
Martin Geisler <mg@lazybytes.net>
parents:
11555
diff
changeset
|
648 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
|
649 |
11985
81edef14922e
log: add logging for commands
Matt Mackall <mpm@selenic.com>
parents:
11714
diff
changeset
|
650 msg = ' '.join(' ' in a and repr(a) or a for a in fullargs) |
81edef14922e
log: add logging for commands
Matt Mackall <mpm@selenic.com>
parents:
11714
diff
changeset
|
651 ui.log("command", msg + "\n") |
7388
5751631246de
dispatch: generalize signature checking for extension command wrapping
Matt Mackall <mpm@selenic.com>
parents:
7280
diff
changeset
|
652 d = lambda: util.checksignature(func)(ui, *args, **cmdoptions) |
13382
d747774ca9da
Make sure bundlerepo doesn't leak temp files (issue2491)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13328
diff
changeset
|
653 try: |
d747774ca9da
Make sure bundlerepo doesn't leak temp files (issue2491)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13328
diff
changeset
|
654 return runcommand(lui, repo, cmd, fullargs, ui, options, d, |
d747774ca9da
Make sure bundlerepo doesn't leak temp files (issue2491)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13328
diff
changeset
|
655 cmdpats, cmdoptions) |
d747774ca9da
Make sure bundlerepo doesn't leak temp files (issue2491)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13328
diff
changeset
|
656 finally: |
14712
8a62bae94425
dispatch: do not close the request repo
Idan Kamara <idankk86@gmail.com>
parents:
14708
diff
changeset
|
657 if repo != req.repo: |
13382
d747774ca9da
Make sure bundlerepo doesn't leak temp files (issue2491)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13328
diff
changeset
|
658 repo.close() |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
659 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
660 def _runcommand(ui, options, cmd, cmdfunc): |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
661 def checkargs(): |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
662 try: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
663 return cmdfunc() |
7646 | 664 except error.SignatureError: |
11287
b901bb751999
error: change ParseError to CommandError
Matt Mackall <mpm@selenic.com>
parents:
11209
diff
changeset
|
665 raise error.CommandError(cmd, _("invalid arguments")) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
666 |
6141
90e5c82a3859
Backed out changeset b913d3aacddc (see issue971/msg5317)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
5995
diff
changeset
|
667 if options['profile']: |
8023
fd9debb3ea1b
profiling: Adding a profiling.format config variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8022
diff
changeset
|
668 format = ui.config('profiling', 'format', default='text') |
fd9debb3ea1b
profiling: Adding a profiling.format config variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8022
diff
changeset
|
669 |
8024
9a1b86cfd29e
profiling: Adding support for kcachegrind output format, using lsprofcalltree
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8023
diff
changeset
|
670 if not format in ['text', 'kcachegrind']: |
8023
fd9debb3ea1b
profiling: Adding a profiling.format config variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8022
diff
changeset
|
671 ui.warn(_("unrecognized profiling format '%s'" |
fd9debb3ea1b
profiling: Adding a profiling.format config variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8022
diff
changeset
|
672 " - Ignored\n") % format) |
fd9debb3ea1b
profiling: Adding a profiling.format config variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8022
diff
changeset
|
673 format = 'text' |
fd9debb3ea1b
profiling: Adding a profiling.format config variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8022
diff
changeset
|
674 |
8022
4f3fdfaa3874
profiling: Adding profiling.output config variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8021
diff
changeset
|
675 output = ui.config('profiling', 'output') |
4f3fdfaa3874
profiling: Adding profiling.output config variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8021
diff
changeset
|
676 |
4f3fdfaa3874
profiling: Adding profiling.output config variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8021
diff
changeset
|
677 if output: |
9610
d78fe60f6bda
make path expanding more consistent
Alexander Solovyov <piranha@piranha.org.ua>
parents:
9569
diff
changeset
|
678 path = ui.expandpath(output) |
8022
4f3fdfaa3874
profiling: Adding profiling.output config variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8021
diff
changeset
|
679 ostream = open(path, 'wb') |
4f3fdfaa3874
profiling: Adding profiling.output config variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8021
diff
changeset
|
680 else: |
4f3fdfaa3874
profiling: Adding profiling.output config variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8021
diff
changeset
|
681 ostream = sys.stderr |
4f3fdfaa3874
profiling: Adding profiling.output config variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8021
diff
changeset
|
682 |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
683 try: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
684 from mercurial import lsprof |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
685 except ImportError: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
686 raise util.Abort(_( |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
687 'lsprof not available - install from ' |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
688 'http://codespeak.net/svn/user/arigo/hack/misc/lsprof/')) |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
689 p = lsprof.Profiler() |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
690 p.enable(subcalls=True) |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
691 try: |
6141
90e5c82a3859
Backed out changeset b913d3aacddc (see issue971/msg5317)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
5995
diff
changeset
|
692 return checkargs() |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
693 finally: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
694 p.disable() |
8024
9a1b86cfd29e
profiling: Adding support for kcachegrind output format, using lsprofcalltree
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8023
diff
changeset
|
695 |
9a1b86cfd29e
profiling: Adding support for kcachegrind output format, using lsprofcalltree
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8023
diff
changeset
|
696 if format == 'kcachegrind': |
9a1b86cfd29e
profiling: Adding support for kcachegrind output format, using lsprofcalltree
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8023
diff
changeset
|
697 import lsprofcalltree |
9a1b86cfd29e
profiling: Adding support for kcachegrind output format, using lsprofcalltree
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8023
diff
changeset
|
698 calltree = lsprofcalltree.KCacheGrind(p) |
9a1b86cfd29e
profiling: Adding support for kcachegrind output format, using lsprofcalltree
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8023
diff
changeset
|
699 calltree.output(ostream) |
9a1b86cfd29e
profiling: Adding support for kcachegrind output format, using lsprofcalltree
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8023
diff
changeset
|
700 else: |
9a1b86cfd29e
profiling: Adding support for kcachegrind output format, using lsprofcalltree
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8023
diff
changeset
|
701 # format == 'text' |
9a1b86cfd29e
profiling: Adding support for kcachegrind output format, using lsprofcalltree
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8023
diff
changeset
|
702 stats = lsprof.Stats(p.getstats()) |
9a1b86cfd29e
profiling: Adding support for kcachegrind output format, using lsprofcalltree
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8023
diff
changeset
|
703 stats.sort() |
9a1b86cfd29e
profiling: Adding support for kcachegrind output format, using lsprofcalltree
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8023
diff
changeset
|
704 stats.pprint(top=10, file=ostream, climit=5) |
8022
4f3fdfaa3874
profiling: Adding profiling.output config variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8021
diff
changeset
|
705 |
4f3fdfaa3874
profiling: Adding profiling.output config variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8021
diff
changeset
|
706 if output: |
4f3fdfaa3874
profiling: Adding profiling.output config variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8021
diff
changeset
|
707 ostream.close() |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
708 else: |
6141
90e5c82a3859
Backed out changeset b913d3aacddc (see issue971/msg5317)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
5995
diff
changeset
|
709 return checkargs() |