annotate mercurial/dispatch.py @ 23562:59e703aecaf6

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