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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
1 # dispatch.py - command dispatching for mercurial
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
2 #
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
3 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
4 #
8225
46293a0c7e9f updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 8206
diff changeset
5 # This software may be used and distributed according to the terms of the
10263
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 9993
diff changeset
6 # GNU General Public License version 2 or any later version.
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
7
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
8 from i18n import _
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
7197812e8d44 error: move lock errors
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
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
7197812e8d44 error: move lock errors
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
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
08cabecfa8a8 errors: move revlog errors
Matt Mackall <mpm@selenic.com>
parents: 7632
diff changeset
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
9626819b2e3d refactor version code
Matt Mackall <mpm@selenic.com>
parents: 7474
diff changeset
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
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
229
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
230 class cmdalias(object):
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
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
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
234 self.definition = definition
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
235 self.args = []
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
236 self.opts = []
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
237 self.help = ''
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
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
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
240
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
241 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
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
247 self.shadows = True
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
248 except error.UnknownCommand:
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
249 self.shadows = False
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
250
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
251 if not self.definition:
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
252 def fn(ui, *args):
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
253 ui.warn(_("no definition for alias '%s'\n") % self.name)
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
254 return 1
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
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
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
257
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
258 return
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
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
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
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
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
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
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
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
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
307 if cmd not in commands.norepo.split(' '):
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
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
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
314 except error.UnknownCommand:
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
315 def fn(ui, *args):
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
316 ui.warn(_("alias '%s' resolves to unknown command '%s'\n") \
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
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
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
323 return 1
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
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
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
326 except error.AmbiguousCommand:
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
327 def fn(ui, *args):
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
328 ui.warn(_("alias '%s' resolves to ambiguous command '%s'\n") \
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
329 % (self.name, cmd))
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
330 return 1
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
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
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
333
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
334 def __call__(self, ui, *args, **opts):
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
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
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
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
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
348
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
349 def addaliases(ui, cmdtable):
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
350 # aliases are processed after extensions have been loaded, so they
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
351 # may use extension commands. Aliases can also use other alias definitions,
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
352 # but only if they have been defined prior to the current definition.
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
353 for alias, definition in ui.configitems('alias'):
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
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
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
356 if aliasdef.norepo:
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
357 commands.norepo += ' %s' % alias
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
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
7fd0616b3d80 ui: kill updateopts
Matt Mackall <mpm@selenic.com>
parents: 8136
diff changeset
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
7fd0616b3d80 ui: kill updateopts
Matt Mackall <mpm@selenic.com>
parents: 8136
diff changeset
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
96379c93ba6f improve code readability
Andrey Somov <py4fun@gmail.com>
parents: 9411
diff changeset
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
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
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
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
559 addaliases(lui, commands.table)
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
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
e62a456b8dc5 error: move SignatureError
Matt Mackall <mpm@selenic.com>
parents: 7645
diff changeset
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()