annotate mercurial/dispatch.py @ 30559:d83ca854fa21

ui: factor out ui.load() to create a ui without loading configs (API) This allows us to write doctests depending on a ui object, but not on global configs. ui.load() is a class method so we can do wsgiui.load(). All ui() calls but for doctests are replaced with ui.load(). Some of them could be changed to not load configs later.
author Yuya Nishihara <yuya@tcha.org>
date Sat, 22 Oct 2016 14:35:10 +0900
parents 4338f87dbf6f
children 541949a10a68
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
27615
4030d3b79953 dispatch: use print function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27516
diff changeset
8 from __future__ import absolute_import, print_function
25932
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
9
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
10 import atexit
24221
4e240d6ab898 dispatch: offer near-edit-distance suggestions for {file,rev}set functions
Augie Fackler <augie@google.com>
parents: 24163
diff changeset
11 import difflib
25932
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
12 import errno
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
13 import os
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
14 import pdb
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
15 import re
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
16 import shlex
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
17 import signal
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
18 import sys
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
19 import time
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
20 import traceback
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
21
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
22
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
23 from .i18n import _
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
24
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
25 from . import (
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
26 cmdutil,
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
27 commands,
30401
869d660b8669 debugcommands: introduce standalone module for debug commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30006
diff changeset
28 debugcommands,
25932
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
29 demandimport,
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
30 encoding,
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
31 error,
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
32 extensions,
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
33 fancyopts,
28447
4eb5496c2bd4 registrar: add filesetpredicate to mark a function as fileset predicate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28394
diff changeset
34 fileset,
25932
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
35 hg,
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
36 hook,
29781
2654a0aac80d profiling: move profiling code from dispatch.py (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29761
diff changeset
37 profiling,
30468
7f2b18c34c02 py3: use pycompat.sysargv in dispatch.run()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30401
diff changeset
38 pycompat,
28394
dcb4209bd30d revset: replace extpredicate by revsetpredicate of registrar
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28391
diff changeset
39 revset,
30520
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30519
diff changeset
40 scmutil,
28692
6b3b958daf03 registrar: add templatefilter to mark a function as template filter (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28623
diff changeset
41 templatefilters,
28538
009f58f1ea75 registrar: add templatekeyword to mark a function as template keyword (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28534
diff changeset
42 templatekw,
28695
cc103bd0dbf9 registrar: add templatefunc to mark a function as template function (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28692
diff changeset
43 templater,
25932
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
44 ui as uimod,
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
45 util,
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
46 )
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
47
14438
08bfec2ef031 dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents: 14286
diff changeset
48 class request(object):
16683
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 16609
diff changeset
49 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
50 ferr=None):
14438
08bfec2ef031 dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents: 14286
diff changeset
51 self.args = args
14439
80c599eee3f3 dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents: 14438
diff changeset
52 self.ui = ui
14510
eccbb9980ada dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents: 14439
diff changeset
53 self.repo = repo
14438
08bfec2ef031 dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents: 14286
diff changeset
54
14613
ea8938d3a5aa dispatch: add I/O descriptors to the request
Idan Kamara <idankk86@gmail.com>
parents: 14601
diff changeset
55 # input/output/error streams
ea8938d3a5aa dispatch: add I/O descriptors to the request
Idan Kamara <idankk86@gmail.com>
parents: 14601
diff changeset
56 self.fin = fin
ea8938d3a5aa dispatch: add I/O descriptors to the request
Idan Kamara <idankk86@gmail.com>
parents: 14601
diff changeset
57 self.fout = fout
ea8938d3a5aa dispatch: add I/O descriptors to the request
Idan Kamara <idankk86@gmail.com>
parents: 14601
diff changeset
58 self.ferr = ferr
ea8938d3a5aa dispatch: add I/O descriptors to the request
Idan Kamara <idankk86@gmail.com>
parents: 14601
diff changeset
59
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
60 def run():
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
61 "run the command in sys.argv"
30468
7f2b18c34c02 py3: use pycompat.sysargv in dispatch.run()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30401
diff changeset
62 sys.exit((dispatch(request(pycompat.sysargv[1:])) or 0) & 255)
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
63
24221
4e240d6ab898 dispatch: offer near-edit-distance suggestions for {file,rev}set functions
Augie Fackler <augie@google.com>
parents: 24163
diff changeset
64 def _getsimilar(symbols, value):
4e240d6ab898 dispatch: offer near-edit-distance suggestions for {file,rev}set functions
Augie Fackler <augie@google.com>
parents: 24163
diff changeset
65 sim = lambda x: difflib.SequenceMatcher(None, value, x).ratio()
4e240d6ab898 dispatch: offer near-edit-distance suggestions for {file,rev}set functions
Augie Fackler <augie@google.com>
parents: 24163
diff changeset
66 # The cutoff for similarity here is pretty arbitrary. It should
4e240d6ab898 dispatch: offer near-edit-distance suggestions for {file,rev}set functions
Augie Fackler <augie@google.com>
parents: 24163
diff changeset
67 # probably be investigated and tweaked.
4e240d6ab898 dispatch: offer near-edit-distance suggestions for {file,rev}set functions
Augie Fackler <augie@google.com>
parents: 24163
diff changeset
68 return [s for s in symbols if sim(s) > 0.6]
4e240d6ab898 dispatch: offer near-edit-distance suggestions for {file,rev}set functions
Augie Fackler <augie@google.com>
parents: 24163
diff changeset
69
27623
b3376fba4ab9 dispatch: report similar names consistently
Bryan O'Sullivan <bos@serpentine.com>
parents: 27615
diff changeset
70 def _reportsimilar(write, similar):
b3376fba4ab9 dispatch: report similar names consistently
Bryan O'Sullivan <bos@serpentine.com>
parents: 27615
diff changeset
71 if len(similar) == 1:
b3376fba4ab9 dispatch: report similar names consistently
Bryan O'Sullivan <bos@serpentine.com>
parents: 27615
diff changeset
72 write(_("(did you mean %s?)\n") % similar[0])
b3376fba4ab9 dispatch: report similar names consistently
Bryan O'Sullivan <bos@serpentine.com>
parents: 27615
diff changeset
73 elif similar:
b3376fba4ab9 dispatch: report similar names consistently
Bryan O'Sullivan <bos@serpentine.com>
parents: 27615
diff changeset
74 ss = ", ".join(sorted(similar))
b3376fba4ab9 dispatch: report similar names consistently
Bryan O'Sullivan <bos@serpentine.com>
parents: 27615
diff changeset
75 write(_("(did you mean one of %s?)\n") % ss)
b3376fba4ab9 dispatch: report similar names consistently
Bryan O'Sullivan <bos@serpentine.com>
parents: 27615
diff changeset
76
24039
2ee35b6ee4fb dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents: 23871
diff changeset
77 def _formatparse(write, inst):
24221
4e240d6ab898 dispatch: offer near-edit-distance suggestions for {file,rev}set functions
Augie Fackler <augie@google.com>
parents: 24163
diff changeset
78 similar = []
4e240d6ab898 dispatch: offer near-edit-distance suggestions for {file,rev}set functions
Augie Fackler <augie@google.com>
parents: 24163
diff changeset
79 if isinstance(inst, error.UnknownIdentifier):
4e240d6ab898 dispatch: offer near-edit-distance suggestions for {file,rev}set functions
Augie Fackler <augie@google.com>
parents: 24163
diff changeset
80 # make sure to check fileset first, as revset can invoke fileset
4e240d6ab898 dispatch: offer near-edit-distance suggestions for {file,rev}set functions
Augie Fackler <augie@google.com>
parents: 24163
diff changeset
81 similar = _getsimilar(inst.symbols, inst.function)
24039
2ee35b6ee4fb dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents: 23871
diff changeset
82 if len(inst.args) > 1:
2ee35b6ee4fb dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents: 23871
diff changeset
83 write(_("hg: parse error at %s: %s\n") %
2ee35b6ee4fb dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents: 23871
diff changeset
84 (inst.args[1], inst.args[0]))
2ee35b6ee4fb dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents: 23871
diff changeset
85 if (inst.args[0][0] == ' '):
2ee35b6ee4fb dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents: 23871
diff changeset
86 write(_("unexpected leading whitespace\n"))
2ee35b6ee4fb dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents: 23871
diff changeset
87 else:
2ee35b6ee4fb dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents: 23871
diff changeset
88 write(_("hg: parse error: %s\n") % inst.args[0])
27623
b3376fba4ab9 dispatch: report similar names consistently
Bryan O'Sullivan <bos@serpentine.com>
parents: 27615
diff changeset
89 _reportsimilar(write, similar)
28515
491eabd0df79 dispatch: extract common logic for handling ParseError
Jun Wu <quark@fb.com>
parents: 28447
diff changeset
90 if inst.hint:
491eabd0df79 dispatch: extract common logic for handling ParseError
Jun Wu <quark@fb.com>
parents: 28447
diff changeset
91 write(_("(%s)\n") % inst.hint)
24039
2ee35b6ee4fb dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents: 23871
diff changeset
92
14438
08bfec2ef031 dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents: 14286
diff changeset
93 def dispatch(req):
08bfec2ef031 dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents: 14286
diff changeset
94 "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
95 if req.ferr:
9fba795dd030 dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents: 14613
diff changeset
96 ferr = req.ferr
9fba795dd030 dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents: 14613
diff changeset
97 elif req.ui:
9fba795dd030 dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents: 14613
diff changeset
98 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
99 else:
30473
39d13b8c101d py3: bulk replace sys.stdin/out/err by util's
Yuya Nishihara <yuya@tcha.org>
parents: 30468
diff changeset
100 ferr = util.stderr
14615
9fba795dd030 dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents: 14613
diff changeset
101
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
102 try:
14439
80c599eee3f3 dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents: 14438
diff changeset
103 if not req.ui:
30559
d83ca854fa21 ui: factor out ui.load() to create a ui without loading configs (API)
Yuya Nishihara <yuya@tcha.org>
parents: 30520
diff changeset
104 req.ui = uimod.ui.load()
14438
08bfec2ef031 dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents: 14286
diff changeset
105 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
106 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
107
9fba795dd030 dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents: 14613
diff changeset
108 # 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
109 if req.fin:
9fba795dd030 dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents: 14613
diff changeset
110 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
111 if req.fout:
9fba795dd030 dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents: 14613
diff changeset
112 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
113 if req.ferr:
9fba795dd030 dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents: 14613
diff changeset
114 req.ui.ferr = req.ferr
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26421
diff changeset
115 except error.Abort as inst:
14615
9fba795dd030 dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents: 14613
diff changeset
116 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
117 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
118 ferr.write(_("(%s)\n") % inst.hint)
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
119 return -1
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25329
diff changeset
120 except error.ParseError as inst:
24039
2ee35b6ee4fb dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents: 23871
diff changeset
121 _formatparse(ferr.write, inst)
9470
ba75830d17a9 dispatch: catch ConfigError while constructing ui
Martin Geisler <mg@lazybytes.net>
parents: 8936
diff changeset
122 return -1
14615
9fba795dd030 dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents: 14613
diff changeset
123
19229
41e39a0299cb blackbox: fix recording exit codes (issue3938)
Durham Goode <durham@fb.com>
parents: 19099
diff changeset
124 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
125 starttime = time.time()
41e39a0299cb blackbox: fix recording exit codes (issue3938)
Durham Goode <durham@fb.com>
parents: 19099
diff changeset
126 ret = None
41e39a0299cb blackbox: fix recording exit codes (issue3938)
Durham Goode <durham@fb.com>
parents: 19099
diff changeset
127 try:
41e39a0299cb blackbox: fix recording exit codes (issue3938)
Durham Goode <durham@fb.com>
parents: 19099
diff changeset
128 ret = _runcatch(req)
28520
84cc72c5771e dispatch: catch KeyboardInterrupt more broadly
Yuya Nishihara <yuya@tcha.org>
parents: 28515
diff changeset
129 except KeyboardInterrupt:
84cc72c5771e dispatch: catch KeyboardInterrupt more broadly
Yuya Nishihara <yuya@tcha.org>
parents: 28515
diff changeset
130 try:
84cc72c5771e dispatch: catch KeyboardInterrupt more broadly
Yuya Nishihara <yuya@tcha.org>
parents: 28515
diff changeset
131 req.ui.warn(_("interrupted!\n"))
84cc72c5771e dispatch: catch KeyboardInterrupt more broadly
Yuya Nishihara <yuya@tcha.org>
parents: 28515
diff changeset
132 except IOError as inst:
84cc72c5771e dispatch: catch KeyboardInterrupt more broadly
Yuya Nishihara <yuya@tcha.org>
parents: 28515
diff changeset
133 if inst.errno != errno.EPIPE:
84cc72c5771e dispatch: catch KeyboardInterrupt more broadly
Yuya Nishihara <yuya@tcha.org>
parents: 28515
diff changeset
134 raise
84cc72c5771e dispatch: catch KeyboardInterrupt more broadly
Yuya Nishihara <yuya@tcha.org>
parents: 28515
diff changeset
135 ret = -1
19229
41e39a0299cb blackbox: fix recording exit codes (issue3938)
Durham Goode <durham@fb.com>
parents: 19099
diff changeset
136 finally:
41e39a0299cb blackbox: fix recording exit codes (issue3938)
Durham Goode <durham@fb.com>
parents: 19099
diff changeset
137 duration = time.time() - starttime
28534
293adbaa14a7 dispatch: flush ui before returning from dispatch
Jun Wu <quark@fb.com>
parents: 28520
diff changeset
138 req.ui.flush()
19229
41e39a0299cb blackbox: fix recording exit codes (issue3938)
Durham Goode <durham@fb.com>
parents: 19099
diff changeset
139 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
140 msg, ret or 0, duration)
28520
84cc72c5771e dispatch: catch KeyboardInterrupt more broadly
Yuya Nishihara <yuya@tcha.org>
parents: 28515
diff changeset
141 return ret
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
142
14439
80c599eee3f3 dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents: 14438
diff changeset
143 def _runcatch(req):
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
144 def catchterm(*args):
7644
182b7114d35a error: move SignalInterrupt
Matt Mackall <mpm@selenic.com>
parents: 7643
diff changeset
145 raise error.SignalInterrupt
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
146
14439
80c599eee3f3 dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents: 14438
diff changeset
147 ui = req.ui
10952
6c2c766afefe dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents: 10793
diff changeset
148 try:
6c2c766afefe dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents: 10793
diff changeset
149 for name in 'SIGBREAK', 'SIGHUP', 'SIGTERM':
6c2c766afefe dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents: 10793
diff changeset
150 num = getattr(signal, name, None)
6c2c766afefe dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents: 10793
diff changeset
151 if num:
6c2c766afefe dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents: 10793
diff changeset
152 signal.signal(num, catchterm)
6c2c766afefe dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents: 10793
diff changeset
153 except ValueError:
6c2c766afefe dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents: 10793
diff changeset
154 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
155
29761
39149b6036e6 dispatch: split global error handling out so it can be reused
Jun Wu <quark@fb.com>
parents: 29132
diff changeset
156 def _runcatchfunc():
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
157 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
158 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
159 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
160 '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
161 }
472fa3b782b1 dispatch: add ability to specify a custom pdb module as a debugger
Sean Farley <sean.michael.farley@gmail.com>
parents: 19639
diff changeset
162 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
163 '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
164 }
19639
09573ad59f7b dispatch: move command line --config argument parsing to _runcatch()
Sean Farley <sean.michael.farley@gmail.com>
parents: 19229
diff changeset
165
09573ad59f7b dispatch: move command line --config argument parsing to _runcatch()
Sean Farley <sean.michael.farley@gmail.com>
parents: 19229
diff changeset
166 # 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
167 # (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
168 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
169
09573ad59f7b dispatch: move command line --config argument parsing to _runcatch()
Sean Farley <sean.michael.farley@gmail.com>
parents: 19229
diff changeset
170 if req.repo:
09573ad59f7b dispatch: move command line --config argument parsing to _runcatch()
Sean Farley <sean.michael.farley@gmail.com>
parents: 19229
diff changeset
171 # 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
172 # the repo ui
20796
131f7fe06e9e check-code: check for argument passing py2.6ism
Matt Mackall <mpm@selenic.com>
parents: 20788
diff changeset
173 for sec, name, val in cfgs:
131f7fe06e9e check-code: check for argument passing py2.6ism
Matt Mackall <mpm@selenic.com>
parents: 20788
diff changeset
174 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
175
25833
8243e999f22b debugger: mark developer-only option
Matt Mackall <mpm@selenic.com>
parents: 25660
diff changeset
176 # developer config: ui.debugger
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
177 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
178 debugmod = pdb
20122
8f4a226c840c dispatch: turn off custom debugger for HGPLAIN mode
Sean Farley <sean.michael.farley@gmail.com>
parents: 19640
diff changeset
179 if not debugger or ui.plain():
25833
8243e999f22b debugger: mark developer-only option
Matt Mackall <mpm@selenic.com>
parents: 25660
diff changeset
180 # 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
181 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
182 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
183 # 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
184 # 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
185 # debugging has been requested
25329
101e84121c13 dispatch: disable demandimport for the --debugger option
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 25277
diff changeset
186 with demandimport.deactivated():
101e84121c13 dispatch: disable demandimport for the --debugger option
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 25277
diff changeset
187 try:
101e84121c13 dispatch: disable demandimport for the --debugger option
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 25277
diff changeset
188 debugmod = __import__(debugger)
101e84121c13 dispatch: disable demandimport for the --debugger option
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 25277
diff changeset
189 except ImportError:
101e84121c13 dispatch: disable demandimport for the --debugger option
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 25277
diff changeset
190 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
191
472fa3b782b1 dispatch: add ability to specify a custom pdb module as a debugger
Sean Farley <sean.michael.farley@gmail.com>
parents: 19639
diff changeset
192 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
193 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
194
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
195 # 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
196 if '--debugger' in req.args:
11495
6ee107782018 debugger: give a little intro before entering pdb
Mads Kiilerich <mads@kiilerich.com>
parents: 11494
diff changeset
197 ui.warn(_("entering debugger - "
6ee107782018 debugger: give a little intro before entering pdb
Mads Kiilerich <mads@kiilerich.com>
parents: 11494
diff changeset
198 "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
199
472fa3b782b1 dispatch: add ability to specify a custom pdb module as a debugger
Sean Farley <sean.michael.farley@gmail.com>
parents: 19639
diff changeset
200 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
201 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
202 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
203 "but its module was not found\n") % debugger)
26236
2e42517129ca dispatch: use the right context manager to deactivate demandimport
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 26216
diff changeset
204 with demandimport.deactivated():
26216
e86d12404d69 dispatch: disable demandimport when invoking the debugger
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 26191
diff changeset
205 debugtrace[debugger]()
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
206 try:
14439
80c599eee3f3 dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents: 14438
diff changeset
207 return _dispatch(req)
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
208 finally:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
209 ui.flush()
16705
c2d9ef43ff6c check-code: ignore naked excepts with a "re-raise" comment
Brodie Rao <brodie@sf.io>
parents: 16686
diff changeset
210 except: # re-raises
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
211 # 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
212 if '--debugger' in req.args:
11494
2347513f562a debugger: show traceback before entering pdb post-mortem
Mads Kiilerich <mads@kiilerich.com>
parents: 11330
diff changeset
213 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
214 debugmortem[debugger](sys.exc_info()[2])
8206
cce63ef1045b ui: print_exc() -> traceback()
Matt Mackall <mpm@selenic.com>
parents: 8190
diff changeset
215 ui.traceback()
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
216 raise
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
217
29761
39149b6036e6 dispatch: split global error handling out so it can be reused
Jun Wu <quark@fb.com>
parents: 29132
diff changeset
218 return callcatch(ui, _runcatchfunc)
39149b6036e6 dispatch: split global error handling out so it can be reused
Jun Wu <quark@fb.com>
parents: 29132
diff changeset
219
39149b6036e6 dispatch: split global error handling out so it can be reused
Jun Wu <quark@fb.com>
parents: 29132
diff changeset
220 def callcatch(ui, func):
30520
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30519
diff changeset
221 """like scmutil.callcatch but handles more high-level exceptions about
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30519
diff changeset
222 config parsing and commands. besides, use handlecommandexception to handle
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30519
diff changeset
223 uncaught exceptions.
29761
39149b6036e6 dispatch: split global error handling out so it can be reused
Jun Wu <quark@fb.com>
parents: 29132
diff changeset
224 """
39149b6036e6 dispatch: split global error handling out so it can be reused
Jun Wu <quark@fb.com>
parents: 29132
diff changeset
225 try:
30520
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30519
diff changeset
226 return scmutil.callcatch(ui, func)
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25329
diff changeset
227 except error.AmbiguousCommand as inst:
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
228 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
229 (inst.args[0], " ".join(inst.args[1])))
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25329
diff changeset
230 except error.CommandError as inst:
7645
020a896a5292 dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents: 7644
diff changeset
231 if inst.args[0]:
020a896a5292 dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents: 7644
diff changeset
232 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
233 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
234 else:
020a896a5292 dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents: 7644
diff changeset
235 ui.warn(_("hg: %s\n") % inst.args[1])
020a896a5292 dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents: 7644
diff changeset
236 commands.help_(ui, 'shortlist')
30520
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30519
diff changeset
237 except error.ParseError as inst:
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30519
diff changeset
238 _formatparse(ui.warn, inst)
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30519
diff changeset
239 return -1
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25329
diff changeset
240 except error.UnknownCommand as inst:
7645
020a896a5292 dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents: 7644
diff changeset
241 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
242 try:
de1e7099d100 dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents: 10282
diff changeset
243 # 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
244 # (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
245 commands.help_(ui, inst.args[0], unknowncmd=True)
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26421
diff changeset
246 except (error.UnknownCommand, error.Abort):
24222
02d7b5cd373b dispatch: offer suggestions of similar-named commands
Augie Fackler <augie@google.com>
parents: 24221
diff changeset
247 suggested = False
02d7b5cd373b dispatch: offer suggestions of similar-named commands
Augie Fackler <augie@google.com>
parents: 24221
diff changeset
248 if len(inst.args) == 2:
02d7b5cd373b dispatch: offer suggestions of similar-named commands
Augie Fackler <augie@google.com>
parents: 24221
diff changeset
249 sim = _getsimilar(inst.args[1], inst.args[0])
02d7b5cd373b dispatch: offer suggestions of similar-named commands
Augie Fackler <augie@google.com>
parents: 24221
diff changeset
250 if sim:
27623
b3376fba4ab9 dispatch: report similar names consistently
Bryan O'Sullivan <bos@serpentine.com>
parents: 27615
diff changeset
251 _reportsimilar(ui.warn, sim)
24222
02d7b5cd373b dispatch: offer suggestions of similar-named commands
Augie Fackler <augie@google.com>
parents: 24221
diff changeset
252 suggested = True
02d7b5cd373b dispatch: offer suggestions of similar-named commands
Augie Fackler <augie@google.com>
parents: 24221
diff changeset
253 if not suggested:
02d7b5cd373b dispatch: offer suggestions of similar-named commands
Augie Fackler <augie@google.com>
parents: 24221
diff changeset
254 commands.help_(ui, 'shortlist')
30520
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30519
diff changeset
255 except IOError:
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30519
diff changeset
256 raise
7645
020a896a5292 dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents: 7644
diff changeset
257 except KeyboardInterrupt:
28520
84cc72c5771e dispatch: catch KeyboardInterrupt more broadly
Yuya Nishihara <yuya@tcha.org>
parents: 28515
diff changeset
258 raise
30520
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30519
diff changeset
259 except: # probably re-raises
28784
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
260 if not handlecommandexception(ui):
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
261 raise
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
262
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
263 return -1
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
264
14265
e4ab5ae193f2 add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents: 14096
diff changeset
265 def aliasargs(fn, givenargs):
e4ab5ae193f2 add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents: 14096
diff changeset
266 args = getattr(fn, 'args', [])
16294
795d591b6ef5 alias: abort on missing positional args (issue3331)
Matt Mackall <mpm@selenic.com>
parents: 16277
diff changeset
267 if args:
14265
e4ab5ae193f2 add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents: 14096
diff changeset
268 cmd = ' '.join(map(util.shellquote, args))
e4ab5ae193f2 add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents: 14096
diff changeset
269
e4ab5ae193f2 add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents: 14096
diff changeset
270 nums = []
e4ab5ae193f2 add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents: 14096
diff changeset
271 def replacer(m):
e4ab5ae193f2 add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents: 14096
diff changeset
272 num = int(m.group(1)) - 1
e4ab5ae193f2 add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents: 14096
diff changeset
273 nums.append(num)
16277
1c2aaf05f7d7 aliases: use empty string for missing position parameters (issue3331)
Matt Mackall <mpm@selenic.com>
parents: 15781
diff changeset
274 if num < len(givenargs):
1c2aaf05f7d7 aliases: use empty string for missing position parameters (issue3331)
Matt Mackall <mpm@selenic.com>
parents: 15781
diff changeset
275 return givenargs[num]
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26421
diff changeset
276 raise error.Abort(_('too few arguments for command alias'))
14265
e4ab5ae193f2 add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents: 14096
diff changeset
277 cmd = re.sub(r'\$(\d+|\$)', replacer, cmd)
e4ab5ae193f2 add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents: 14096
diff changeset
278 givenargs = [x for i, x in enumerate(givenargs)
e4ab5ae193f2 add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents: 14096
diff changeset
279 if i not in nums]
e4ab5ae193f2 add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents: 14096
diff changeset
280 args = shlex.split(cmd)
e4ab5ae193f2 add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents: 14096
diff changeset
281 return args + givenargs
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
282
22158
bc2132dfc0a4 alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents: 21961
diff changeset
283 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
284 '''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
285
bc2132dfc0a4 alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents: 21961
diff changeset
286 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
287 '''
bc2132dfc0a4 alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents: 21961
diff changeset
288 # 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
289 # 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
290 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
291 replacemap['$0'] = name
bc2132dfc0a4 alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents: 21961
diff changeset
292 replacemap['$$'] = '$'
bc2132dfc0a4 alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents: 21961
diff changeset
293 replacemap['$@'] = ' '.join(args)
bc2132dfc0a4 alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents: 21961
diff changeset
294 # 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
295 # 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
296 # 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
297 # 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
298 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
299 # escape '\$' for regex
bc2132dfc0a4 alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents: 21961
diff changeset
300 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
301 r = re.compile(regex)
bc2132dfc0a4 alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents: 21961
diff changeset
302 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
303
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
304 class cmdalias(object):
28828
3640c1702c43 help: report source of aliases
timeless <timeless@mozdev.org>
parents: 28821
diff changeset
305 def __init__(self, name, definition, cmdtable, source):
12039
18e1e7520b67 alias: make shadowing behavior more consistent (issue2054)
Brodie Rao <brodie@bitheap.org>
parents: 11712
diff changeset
306 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
307 self.cmdname = ''
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
308 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
309 self.fn = None
29087
ad1bdea43965 dispatch: defer environment variable resolution in alias commands (BC)
Jun Wu <quark@fb.com>
parents: 28861
diff changeset
310 self.givenargs = []
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
311 self.opts = []
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
312 self.help = ''
22160
645457f73aa6 alias: keep error message in "badalias" so that help can see it
Yuya Nishihara <yuya@tcha.org>
parents: 22158
diff changeset
313 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
314 self.unknowncmd = False
28828
3640c1702c43 help: report source of aliases
timeless <timeless@mozdev.org>
parents: 28821
diff changeset
315 self.source = source
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
316
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
317 try:
12039
18e1e7520b67 alias: make shadowing behavior more consistent (issue2054)
Brodie Rao <brodie@bitheap.org>
parents: 11712
diff changeset
318 aliases, entry = cmdutil.findcmd(self.name, cmdtable)
18e1e7520b67 alias: make shadowing behavior more consistent (issue2054)
Brodie Rao <brodie@bitheap.org>
parents: 11712
diff changeset
319 for alias, e in cmdtable.iteritems():
18e1e7520b67 alias: make shadowing behavior more consistent (issue2054)
Brodie Rao <brodie@bitheap.org>
parents: 11712
diff changeset
320 if e is entry:
18e1e7520b67 alias: make shadowing behavior more consistent (issue2054)
Brodie Rao <brodie@bitheap.org>
parents: 11712
diff changeset
321 self.cmd = alias
18e1e7520b67 alias: make shadowing behavior more consistent (issue2054)
Brodie Rao <brodie@bitheap.org>
parents: 11712
diff changeset
322 break
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
323 self.shadows = True
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
324 except error.UnknownCommand:
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
325 self.shadows = False
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
326
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
327 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
328 self.badalias = _("no definition for alias '%s'") % self.name
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
329 return
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
330
11524
24965bb270b7 dispatch: add shell aliases
Steve Losh <steve@stevelosh.com>
parents: 11495
diff changeset
331 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
332 self.shell = True
11524
24965bb270b7 dispatch: add shell aliases
Steve Losh <steve@stevelosh.com>
parents: 11495
diff changeset
333 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
334 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
335 def _checkvar(m):
13392
777cef34a890 dispatch: support for $ escaping in shell-alias definition
Roman Sokolov <sokolov.r.v@gmail.com>
parents: 13382
diff changeset
336 if m.groups()[0] == '$':
777cef34a890 dispatch: support for $ escaping in shell-alias definition
Roman Sokolov <sokolov.r.v@gmail.com>
parents: 13382
diff changeset
337 return m.group()
777cef34a890 dispatch: support for $ escaping in shell-alias definition
Roman Sokolov <sokolov.r.v@gmail.com>
parents: 13382
diff changeset
338 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
339 return m.group()
f853873fc66d aliases: provide more flexible ways to work with shell alias arguments
Steve Losh <steve@stevelosh.com>
parents: 11985
diff changeset
340 else:
14708
8083f4d00bd1 i18n: remove translation of debug messages
David Soria Parra <dsp@php.net>
parents: 14704
diff changeset
341 ui.debug("No argument found for substitution "
8083f4d00bd1 i18n: remove translation of debug messages
David Soria Parra <dsp@php.net>
parents: 14704
diff changeset
342 "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
343 % (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
344 return ''
13392
777cef34a890 dispatch: support for $ escaping in shell-alias definition
Roman Sokolov <sokolov.r.v@gmail.com>
parents: 13382
diff changeset
345 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
346 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
347 return ui.system(cmd, environ=env)
11524
24965bb270b7 dispatch: add shell aliases
Steve Losh <steve@stevelosh.com>
parents: 11495
diff changeset
348 self.fn = fn
24965bb270b7 dispatch: add shell aliases
Steve Losh <steve@stevelosh.com>
parents: 11495
diff changeset
349 return
24965bb270b7 dispatch: add shell aliases
Steve Losh <steve@stevelosh.com>
parents: 11495
diff changeset
350
21569
c5afb07c33d3 alias: handle shlex error in command aliases
Yuya Nishihara <yuya@tcha.org>
parents: 21556
diff changeset
351 try:
c5afb07c33d3 alias: handle shlex error in command aliases
Yuya Nishihara <yuya@tcha.org>
parents: 21556
diff changeset
352 args = shlex.split(self.definition)
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25329
diff changeset
353 except ValueError as inst:
22160
645457f73aa6 alias: keep error message in "badalias" so that help can see it
Yuya Nishihara <yuya@tcha.org>
parents: 22158
diff changeset
354 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
355 % (self.name, inst))
21569
c5afb07c33d3 alias: handle shlex error in command aliases
Yuya Nishihara <yuya@tcha.org>
parents: 21556
diff changeset
356 return
12092
4982fa38e544 alias: print what command is being shadowed in debug message
Brodie Rao <brodie@bitheap.org>
parents: 12070
diff changeset
357 self.cmdname = cmd = args.pop(0)
29087
ad1bdea43965 dispatch: defer environment variable resolution in alias commands (BC)
Jun Wu <quark@fb.com>
parents: 28861
diff changeset
358 self.givenargs = args
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
359
18693
633cd0c46e6a dispatch: also a separate warning message on aliases with --config
Simon Heimberg <simohe@besonet.ch>
parents: 18691
diff changeset
360 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
361 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
362 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
363 "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
364 % (self.name, invalidarg))
11695
ee8f36a6c766 alias: improved diagnostic when arguments include --cwd, etc.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11681
diff changeset
365 return
ee8f36a6c766 alias: improved diagnostic when arguments include --cwd, etc.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11681
diff changeset
366
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
367 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
368 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
369 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
370 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
371 else:
8bce1e0d2801 alias: do not crash when aliased command has no usage help text
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 9825
diff changeset
372 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
373
9876
6e8a16dd3e30 alias: improve help text for command aliases
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 9875
diff changeset
374 if self.help.startswith("hg " + cmd):
6e8a16dd3e30 alias: improve help text for command aliases
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 9875
diff changeset
375 # 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
376 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
377 self.__doc__ = self.fn.__doc__
9876
6e8a16dd3e30 alias: improve help text for command aliases
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 9875
diff changeset
378
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
379 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
380 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
381 % (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
382 self.unknowncmd = True
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
383 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
384 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
385 % (self.name, cmd))
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
386
29087
ad1bdea43965 dispatch: defer environment variable resolution in alias commands (BC)
Jun Wu <quark@fb.com>
parents: 28861
diff changeset
387 @property
ad1bdea43965 dispatch: defer environment variable resolution in alias commands (BC)
Jun Wu <quark@fb.com>
parents: 28861
diff changeset
388 def args(self):
ad1bdea43965 dispatch: defer environment variable resolution in alias commands (BC)
Jun Wu <quark@fb.com>
parents: 28861
diff changeset
389 args = map(util.expandpath, self.givenargs)
ad1bdea43965 dispatch: defer environment variable resolution in alias commands (BC)
Jun Wu <quark@fb.com>
parents: 28861
diff changeset
390 return aliasargs(self.fn, args)
ad1bdea43965 dispatch: defer environment variable resolution in alias commands (BC)
Jun Wu <quark@fb.com>
parents: 28861
diff changeset
391
28621
d856e85a8a7a dispatch: make cmdalias forward command attributes to function
Yuya Nishihara <yuya@tcha.org>
parents: 28538
diff changeset
392 def __getattr__(self, name):
d856e85a8a7a dispatch: make cmdalias forward command attributes to function
Yuya Nishihara <yuya@tcha.org>
parents: 28538
diff changeset
393 adefaults = {'norepo': True, 'optionalrepo': False, 'inferrepo': False}
d856e85a8a7a dispatch: make cmdalias forward command attributes to function
Yuya Nishihara <yuya@tcha.org>
parents: 28538
diff changeset
394 if name not in adefaults:
d856e85a8a7a dispatch: make cmdalias forward command attributes to function
Yuya Nishihara <yuya@tcha.org>
parents: 28538
diff changeset
395 raise AttributeError(name)
d856e85a8a7a dispatch: make cmdalias forward command attributes to function
Yuya Nishihara <yuya@tcha.org>
parents: 28538
diff changeset
396 if self.badalias or util.safehasattr(self, 'shell'):
d856e85a8a7a dispatch: make cmdalias forward command attributes to function
Yuya Nishihara <yuya@tcha.org>
parents: 28538
diff changeset
397 return adefaults[name]
d856e85a8a7a dispatch: make cmdalias forward command attributes to function
Yuya Nishihara <yuya@tcha.org>
parents: 28538
diff changeset
398 return getattr(self.fn, name)
d856e85a8a7a dispatch: make cmdalias forward command attributes to function
Yuya Nishihara <yuya@tcha.org>
parents: 28538
diff changeset
399
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
400 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
401 if self.badalias:
22164
efd65e51bc0b alias: exit from bad definition by Abort
Yuya Nishihara <yuya@tcha.org>
parents: 22163
diff changeset
402 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
403 if self.unknowncmd:
10364
de1e7099d100 dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents: 10282
diff changeset
404 try:
de1e7099d100 dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents: 10282
diff changeset
405 # 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
406 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
407 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
408 except error.UnknownCommand:
de1e7099d100 dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents: 10282
diff changeset
409 pass
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26421
diff changeset
410 raise error.Abort(self.badalias, hint=hint)
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
411 if self.shadows:
14704
b24d596fcd25 Backed out changeset 1ec8bd909ac3
Martin Geisler <mg@aragost.com>
parents: 14702
diff changeset
412 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
413 (self.name, self.cmdname))
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
414
29846
318e2b600b80 blackbox: also log alias expansions
Augie Fackler <augie@google.com>
parents: 29841
diff changeset
415 ui.log('commandalias', "alias '%s' expands to '%s'\n",
318e2b600b80 blackbox: also log alias expansions
Augie Fackler <augie@google.com>
parents: 29841
diff changeset
416 self.name, self.definition)
14950
144e97421f6b dispatch: use safehasattr instead of hasattr
Augie Fackler <durin42@gmail.com>
parents: 14918
diff changeset
417 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
418 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
419 else:
12093
cd895084a4cd alias: on --debug, print expansion when it has invalid arguments
Brodie Rao <brodie@bitheap.org>
parents: 12092
diff changeset
420 try:
21556
5e13507a3b4e alias: fix loss of non-zero return code in command aliases
Yuya Nishihara <yuya@tcha.org>
parents: 20829
diff changeset
421 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
422 except error.SignatureError:
cd895084a4cd alias: on --debug, print expansion when it has invalid arguments
Brodie Rao <brodie@bitheap.org>
parents: 12092
diff changeset
423 args = ' '.join([self.cmdname] + self.args)
14704
b24d596fcd25 Backed out changeset 1ec8bd909ac3
Martin Geisler <mg@aragost.com>
parents: 14702
diff changeset
424 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
425 raise
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
426
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
427 def addaliases(ui, cmdtable):
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
428 # aliases are processed after extensions have been loaded, so they
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
429 # 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
430 # 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
431 for alias, definition in ui.configitems('alias'):
28828
3640c1702c43 help: report source of aliases
timeless <timeless@mozdev.org>
parents: 28821
diff changeset
432 source = ui.configsource('alias', alias)
3640c1702c43 help: report source of aliases
timeless <timeless@mozdev.org>
parents: 28821
diff changeset
433 aliasdef = cmdalias(alias, definition, cmdtable, source)
15019
f4b7be3f8430 dispatch: don't rewrap aliases that have the same definition
Idan Kamara <idankk86@gmail.com>
parents: 14992
diff changeset
434
f4b7be3f8430 dispatch: don't rewrap aliases that have the same definition
Idan Kamara <idankk86@gmail.com>
parents: 14992
diff changeset
435 try:
f4b7be3f8430 dispatch: don't rewrap aliases that have the same definition
Idan Kamara <idankk86@gmail.com>
parents: 14992
diff changeset
436 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
437 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
438 continue
f4b7be3f8430 dispatch: don't rewrap aliases that have the same definition
Idan Kamara <idankk86@gmail.com>
parents: 14992
diff changeset
439 except (KeyError, AttributeError):
f4b7be3f8430 dispatch: don't rewrap aliases that have the same definition
Idan Kamara <idankk86@gmail.com>
parents: 14992
diff changeset
440 # 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
441 pass
f4b7be3f8430 dispatch: don't rewrap aliases that have the same definition
Idan Kamara <idankk86@gmail.com>
parents: 14992
diff changeset
442
15233
81c97964d123 alias: don't shadow commands that we only partially matched (issue2993) (BC)
Augie Fackler <durin42@gmail.com>
parents: 15027
diff changeset
443 cmdtable[aliasdef.name] = (aliasdef, aliasdef.opts, aliasdef.help)
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
444
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
445 def _parse(ui, args):
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
446 options = {}
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
447 cmdoptions = {}
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
448
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
449 try:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
450 args = fancyopts.fancyopts(args, commands.globalopts, options)
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25329
diff changeset
451 except fancyopts.getopt.GetoptError as inst:
11287
b901bb751999 error: change ParseError to CommandError
Matt Mackall <mpm@selenic.com>
parents: 11209
diff changeset
452 raise error.CommandError(None, inst)
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
453
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
454 if args:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
455 cmd, args = args[0], args[1:]
9875
d6a95c5f6ff9 dispatch: minor refactoring
Henri Wiechers <hwiechers@gmail.com>
parents: 9825
diff changeset
456 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
457 ui.configbool("ui", "strict"))
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
458 cmd = aliases[0]
14265
e4ab5ae193f2 add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents: 14096
diff changeset
459 args = aliasargs(entry[0], args)
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
460 defaults = ui.config("defaults", cmd)
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
461 if defaults:
9610
d78fe60f6bda make path expanding more consistent
Alexander Solovyov <piranha@piranha.org.ua>
parents: 9569
diff changeset
462 args = map(util.expandpath, shlex.split(defaults)) + args
9875
d6a95c5f6ff9 dispatch: minor refactoring
Henri Wiechers <hwiechers@gmail.com>
parents: 9825
diff changeset
463 c = list(entry[1])
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
464 else:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
465 cmd = None
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
466 c = []
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
467
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
468 # combine global options into local
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
469 for o in commands.globalopts:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
470 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
471
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
472 try:
29822
61a4cdc98307 dispatch: explicitly pass fancyopts optional arg as a keyword
Augie Fackler <augie@google.com>
parents: 29784
diff changeset
473 args = fancyopts.fancyopts(args, c, cmdoptions, gnu=True)
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25329
diff changeset
474 except fancyopts.getopt.GetoptError as inst:
11287
b901bb751999 error: change ParseError to CommandError
Matt Mackall <mpm@selenic.com>
parents: 11209
diff changeset
475 raise error.CommandError(cmd, inst)
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
476
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
477 # separate global options back out
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
478 for o in commands.globalopts:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
479 n = o[1]
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
480 options[n] = cmdoptions[n]
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
481 del cmdoptions[n]
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
482
9875
d6a95c5f6ff9 dispatch: minor refactoring
Henri Wiechers <hwiechers@gmail.com>
parents: 9825
diff changeset
483 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
484
8137
7fd0616b3d80 ui: kill updateopts
Matt Mackall <mpm@selenic.com>
parents: 8136
diff changeset
485 def _parseconfig(ui, config):
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
486 """parse the --config options from the command line"""
14753
10dcb3e7cb55 dispatch: return read config options
Idan Kamara <idankk86@gmail.com>
parents: 14752
diff changeset
487 configs = []
10dcb3e7cb55 dispatch: return read config options
Idan Kamara <idankk86@gmail.com>
parents: 14752
diff changeset
488
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
489 for cfg in config:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
490 try:
28081
a6344df5108e dispatch: strip command line options like config file options
Tony Tung <ttung@fb.com>
parents: 27679
diff changeset
491 name, value = [cfgelem.strip()
a6344df5108e dispatch: strip command line options like config file options
Tony Tung <ttung@fb.com>
parents: 27679
diff changeset
492 for cfgelem in cfg.split('=', 1)]
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
493 section, name = name.split('.', 1)
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
494 if not section or not name:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
495 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
496 ui.setconfig(section, name, value, '--config')
14753
10dcb3e7cb55 dispatch: return read config options
Idan Kamara <idankk86@gmail.com>
parents: 14752
diff changeset
497 configs.append((section, name, value))
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
498 except (IndexError, ValueError):
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26421
diff changeset
499 raise error.Abort(_('malformed --config option: %r '
9825
0d850f8beea6 dispatch: better error message for --config option
Bill Schroeder <bschroeder@allstontrading.com>
parents: 9679
diff changeset
500 '(use --config section.name=value)') % cfg)
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
501
14753
10dcb3e7cb55 dispatch: return read config options
Idan Kamara <idankk86@gmail.com>
parents: 14752
diff changeset
502 return configs
10dcb3e7cb55 dispatch: return read config options
Idan Kamara <idankk86@gmail.com>
parents: 14752
diff changeset
503
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
504 def _earlygetopt(aliases, args):
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
505 """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
506
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
507 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
508 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
509
f01ae031f84c dispatch: add doctests for _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents: 19011
diff changeset
510 >>> args = ['x', '--cwd', 'foo', 'y']
f01ae031f84c dispatch: add doctests for _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents: 19011
diff changeset
511 >>> _earlygetopt(['--cwd'], args), args
f01ae031f84c dispatch: add doctests for _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents: 19011
diff changeset
512 (['foo'], ['x', 'y'])
f01ae031f84c dispatch: add doctests for _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents: 19011
diff changeset
513
19099
fc081623f4bd dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents: 19098
diff changeset
514 >>> args = ['x', '--cwd=bar', 'y']
fc081623f4bd dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents: 19098
diff changeset
515 >>> _earlygetopt(['--cwd'], args), args
fc081623f4bd dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents: 19098
diff changeset
516 (['bar'], ['x', 'y'])
fc081623f4bd dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents: 19098
diff changeset
517
19098
f01ae031f84c dispatch: add doctests for _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents: 19011
diff changeset
518 >>> args = ['x', '-R', 'foo', 'y']
f01ae031f84c dispatch: add doctests for _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents: 19011
diff changeset
519 >>> _earlygetopt(['-R'], args), args
f01ae031f84c dispatch: add doctests for _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents: 19011
diff changeset
520 (['foo'], ['x', 'y'])
f01ae031f84c dispatch: add doctests for _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents: 19011
diff changeset
521
f01ae031f84c dispatch: add doctests for _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents: 19011
diff changeset
522 >>> args = ['x', '-Rbar', 'y']
f01ae031f84c dispatch: add doctests for _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents: 19011
diff changeset
523 >>> _earlygetopt(['-R'], args), args
f01ae031f84c dispatch: add doctests for _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents: 19011
diff changeset
524 (['bar'], ['x', 'y'])
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
525 """
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
526 try:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
527 argcount = args.index("--")
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
528 except ValueError:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
529 argcount = len(args)
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
530 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
531 values = []
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
532 pos = 0
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
533 while pos < argcount:
19099
fc081623f4bd dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents: 19098
diff changeset
534 fullarg = arg = args[pos]
fc081623f4bd dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents: 19098
diff changeset
535 equals = arg.find('=')
fc081623f4bd dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents: 19098
diff changeset
536 if equals > -1:
fc081623f4bd dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents: 19098
diff changeset
537 arg = arg[:equals]
fc081623f4bd dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents: 19098
diff changeset
538 if arg in aliases:
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
539 del args[pos]
19099
fc081623f4bd dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents: 19098
diff changeset
540 if equals > -1:
fc081623f4bd dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents: 19098
diff changeset
541 values.append(fullarg[equals + 1:])
fc081623f4bd dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents: 19098
diff changeset
542 argcount -= 1
fc081623f4bd dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents: 19098
diff changeset
543 else:
fc081623f4bd dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents: 19098
diff changeset
544 if pos + 1 >= argcount:
fc081623f4bd dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents: 19098
diff changeset
545 # 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
546 break
fc081623f4bd dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents: 19098
diff changeset
547 values.append(args.pop(pos))
fc081623f4bd dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents: 19098
diff changeset
548 argcount -= 2
fc081623f4bd dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents: 19098
diff changeset
549 elif arg[:2] in shortopts:
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
550 # 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
551 values.append(args.pop(pos)[2:])
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
552 argcount -= 1
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
553 else:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
554 pos += 1
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
555 return values
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
556
11330
713ae78bb583 provide pre- and post- hooks with parsed command line arguments.
Chad Dombrova <chadrik@gmail.com>
parents: 11305
diff changeset
557 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
558 # 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
559 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
560 pats=cmdpats, opts=cmdoptions)
29129
e6dfb0e4eeef dispatch: add fail-* family of hooks
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 29114
diff changeset
561 try:
e6dfb0e4eeef dispatch: add fail-* family of hooks
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 29114
diff changeset
562 ret = _runcommand(ui, options, cmd, d)
e6dfb0e4eeef dispatch: add fail-* family of hooks
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 29114
diff changeset
563 # run post-hook, passing command result
e6dfb0e4eeef dispatch: add fail-* family of hooks
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 29114
diff changeset
564 hook.hook(lui, repo, "post-%s" % cmd, False, args=" ".join(fullargs),
e6dfb0e4eeef dispatch: add fail-* family of hooks
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 29114
diff changeset
565 result=ret, pats=cmdpats, opts=cmdoptions)
e6dfb0e4eeef dispatch: add fail-* family of hooks
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 29114
diff changeset
566 except Exception:
e6dfb0e4eeef dispatch: add fail-* family of hooks
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 29114
diff changeset
567 # run failure hook and re-raise
e6dfb0e4eeef dispatch: add fail-* family of hooks
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 29114
diff changeset
568 hook.hook(lui, repo, "fail-%s" % cmd, False, args=" ".join(fullargs),
e6dfb0e4eeef dispatch: add fail-* family of hooks
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 29114
diff changeset
569 pats=cmdpats, opts=cmdoptions)
e6dfb0e4eeef dispatch: add fail-* family of hooks
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 29114
diff changeset
570 raise
7819
14b703252f14 dispatch: extract command execution block into method
Bill Barry <after.fallout@gmail.com>
parents: 7772
diff changeset
571 return ret
14b703252f14 dispatch: extract command execution block into method
Bill Barry <after.fallout@gmail.com>
parents: 7772
diff changeset
572
28263
59509c6724c7 dispatch: add wd parameter to _getlocal
Jun Wu <quark@fb.com>
parents: 28081
diff changeset
573 def _getlocal(ui, rpath, wd=None):
12536
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
574 """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
575
12536
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
576 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
577 """
28263
59509c6724c7 dispatch: add wd parameter to _getlocal
Jun Wu <quark@fb.com>
parents: 28081
diff changeset
578 if wd is None:
59509c6724c7 dispatch: add wd parameter to _getlocal
Jun Wu <quark@fb.com>
parents: 28081
diff changeset
579 try:
30500
fc0cfe6c87d7 py3: add os.getcwdb() to have bytes path
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30485
diff changeset
580 wd = pycompat.getcwd()
28263
59509c6724c7 dispatch: add wd parameter to _getlocal
Jun Wu <quark@fb.com>
parents: 28081
diff changeset
581 except OSError as e:
59509c6724c7 dispatch: add wd parameter to _getlocal
Jun Wu <quark@fb.com>
parents: 28081
diff changeset
582 raise error.Abort(_("error getting current working directory: %s") %
59509c6724c7 dispatch: add wd parameter to _getlocal
Jun Wu <quark@fb.com>
parents: 28081
diff changeset
583 e.strerror)
11675
f92f8921a5cc dispatch: give better error message when cwd doesn't exist (issue2293)
Mads Kiilerich <mads@kiilerich.com>
parents: 11600
diff changeset
584 path = cmdutil.findrepo(wd) or ""
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
585 if not path:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
586 lui = ui
9436
96379c93ba6f improve code readability
Andrey Somov <py4fun@gmail.com>
parents: 9411
diff changeset
587 else:
12636
c24215aa7e69 dispatch: remove superfluous try/except when reading local ui config
Brodie Rao <brodie@bitheap.org>
parents: 12633
diff changeset
588 lui = ui.copy()
12637
42ca7aef28d3 dispatch: properly handle relative path aliases used with -R (issue2376)
Brodie Rao <brodie@bitheap.org>
parents: 12636
diff changeset
589 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
590
14860
67add0f24f83 dispatch: fix checking of rpath in _getlocal
Matt Mackall <mpm@selenic.com>
parents: 14761
diff changeset
591 if rpath and rpath[-1]:
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
592 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
593 lui = ui.copy()
12637
42ca7aef28d3 dispatch: properly handle relative path aliases used with -R (issue2376)
Brodie Rao <brodie@bitheap.org>
parents: 12636
diff changeset
594 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
595
12536
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
596 return 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
597
29132
12769703d4ba dispatch: always load extensions before running shell aliases (issue5230)
Jun Wu <quark@fb.com>
parents: 29129
diff changeset
598 def _checkshellalias(lui, ui, args):
12769703d4ba dispatch: always load extensions before running shell aliases (issue5230)
Jun Wu <quark@fb.com>
parents: 29129
diff changeset
599 """Return the function to run the shell alias, if it is required"""
12536
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
600 options = {}
12748
d10369fefd01 alias: fail gracefully when invalid global options are given (issue2442)
Steve Losh <steve@stevelosh.com>
parents: 12637
diff changeset
601
d10369fefd01 alias: fail gracefully when invalid global options are given (issue2442)
Steve Losh <steve@stevelosh.com>
parents: 12637
diff changeset
602 try:
d10369fefd01 alias: fail gracefully when invalid global options are given (issue2442)
Steve Losh <steve@stevelosh.com>
parents: 12637
diff changeset
603 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
604 except fancyopts.getopt.GetoptError:
d10369fefd01 alias: fail gracefully when invalid global options are given (issue2442)
Steve Losh <steve@stevelosh.com>
parents: 12637
diff changeset
605 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
606
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
607 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
608 return
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
609
29132
12769703d4ba dispatch: always load extensions before running shell aliases (issue5230)
Jun Wu <quark@fb.com>
parents: 29129
diff changeset
610 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
611
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
612 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
613 try:
29132
12769703d4ba dispatch: always load extensions before running shell aliases (issue5230)
Jun Wu <quark@fb.com>
parents: 29129
diff changeset
614 strict = ui.configbool("ui", "strict")
22377
f98abe3146b2 dispatch: check shell alias again after loading extensions (issue4355)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 22376
diff changeset
615 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
616 except (error.AmbiguousCommand, error.UnknownCommand):
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 return
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
618
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
619 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
620 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
621
14950
144e97421f6b dispatch: use safehasattr instead of hasattr
Augie Fackler <durin42@gmail.com>
parents: 14918
diff changeset
622 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
623 d = lambda: fn(ui, *args[1:])
16683
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 16609
diff changeset
624 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
625 [], {})
12536
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
626
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
627 _loaded = set()
28391
73905484ef70 dispatch: make loading extra information from extension extensible
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28313
diff changeset
628
73905484ef70 dispatch: make loading extra information from extension extensible
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28313
diff changeset
629 # list of (objname, loadermod, loadername) tuple:
73905484ef70 dispatch: make loading extra information from extension extensible
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28313
diff changeset
630 # - objname is the name of an object in extension module, from which
73905484ef70 dispatch: make loading extra information from extension extensible
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28313
diff changeset
631 # extra information is loaded
73905484ef70 dispatch: make loading extra information from extension extensible
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28313
diff changeset
632 # - loadermod is the module where loader is placed
73905484ef70 dispatch: make loading extra information from extension extensible
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28313
diff changeset
633 # - loadername is the name of the function, which takes (ui, extensionname,
73905484ef70 dispatch: make loading extra information from extension extensible
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28313
diff changeset
634 # extraobj) arguments
73905484ef70 dispatch: make loading extra information from extension extensible
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28313
diff changeset
635 extraloaders = [
73905484ef70 dispatch: make loading extra information from extension extensible
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28313
diff changeset
636 ('cmdtable', commands, 'loadcmdtable'),
28447
4eb5496c2bd4 registrar: add filesetpredicate to mark a function as fileset predicate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28394
diff changeset
637 ('filesetpredicate', fileset, 'loadpredicate'),
28394
dcb4209bd30d revset: replace extpredicate by revsetpredicate of registrar
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28391
diff changeset
638 ('revsetpredicate', revset, 'loadpredicate'),
28692
6b3b958daf03 registrar: add templatefilter to mark a function as template filter (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28623
diff changeset
639 ('templatefilter', templatefilters, 'loadfilter'),
28695
cc103bd0dbf9 registrar: add templatefunc to mark a function as template function (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28692
diff changeset
640 ('templatefunc', templater, 'loadfunction'),
28538
009f58f1ea75 registrar: add templatekeyword to mark a function as template keyword (API)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28534
diff changeset
641 ('templatekeyword', templatekw, 'loadkeyword'),
28391
73905484ef70 dispatch: make loading extra information from extension extensible
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28313
diff changeset
642 ]
73905484ef70 dispatch: make loading extra information from extension extensible
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28313
diff changeset
643
14439
80c599eee3f3 dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents: 14438
diff changeset
644 def _dispatch(req):
14438
08bfec2ef031 dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents: 14286
diff changeset
645 args = req.args
14439
80c599eee3f3 dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents: 14438
diff changeset
646 ui = req.ui
80c599eee3f3 dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents: 14438
diff changeset
647
12536
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
648 # 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
649 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
650 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
651 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
652
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
653 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
654 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
655
9410
1c83938b6a8e extensions: load and configure extensions in well-defined phases
Martin Geisler <mg@lazybytes.net>
parents: 8936
diff changeset
656 # 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
657 # 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
658 # 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
659 extensions.loadall(lui)
9410
1c83938b6a8e extensions: load and configure extensions in well-defined phases
Martin Geisler <mg@lazybytes.net>
parents: 8936
diff changeset
660 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
661 # 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
662 ui.__class__ = lui.__class__
5828
863e237b58fb dispatch: allow extensions to provide setup code
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5664
diff changeset
663
9660
e0eae93e6c67 extensions: changed to call extsetup() from extensions.loadall()
Yuya Nishihara <yuya@tcha.org>
parents: 9610
diff changeset
664 # (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
665
9410
1c83938b6a8e extensions: load and configure extensions in well-defined phases
Martin Geisler <mg@lazybytes.net>
parents: 8936
diff changeset
666 for name, module in exts:
28391
73905484ef70 dispatch: make loading extra information from extension extensible
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28313
diff changeset
667 for objname, loadermod, loadername in extraloaders:
73905484ef70 dispatch: make loading extra information from extension extensible
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28313
diff changeset
668 extraobj = getattr(module, objname, None)
73905484ef70 dispatch: make loading extra information from extension extensible
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28313
diff changeset
669 if extraobj is not None:
73905484ef70 dispatch: make loading extra information from extension extensible
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28313
diff changeset
670 getattr(loadermod, loadername)(ui, name, extraobj)
8304
991ca609ccd6 dispatch: remember loaded extensions in a real set
Martin Geisler <mg@lazybytes.net>
parents: 8225
diff changeset
671 _loaded.add(name)
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
672
9410
1c83938b6a8e extensions: load and configure extensions in well-defined phases
Martin Geisler <mg@lazybytes.net>
parents: 8936
diff changeset
673 # (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
674
30401
869d660b8669 debugcommands: introduce standalone module for debug commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30006
diff changeset
675 # Side-effect of accessing is debugcommands module is guaranteed to be
869d660b8669 debugcommands: introduce standalone module for debug commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30006
diff changeset
676 # imported and commands.table is populated.
869d660b8669 debugcommands: introduce standalone module for debug commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30006
diff changeset
677 debugcommands.command
869d660b8669 debugcommands: introduce standalone module for debug commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30006
diff changeset
678
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
679 addaliases(lui, commands.table)
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
680
29132
12769703d4ba dispatch: always load extensions before running shell aliases (issue5230)
Jun Wu <quark@fb.com>
parents: 29129
diff changeset
681 # All aliases and commands are completely defined, now.
12769703d4ba dispatch: always load extensions before running shell aliases (issue5230)
Jun Wu <quark@fb.com>
parents: 29129
diff changeset
682 # Check abbreviation/ambiguity of shell alias.
12769703d4ba dispatch: always load extensions before running shell aliases (issue5230)
Jun Wu <quark@fb.com>
parents: 29129
diff changeset
683 shellaliasfn = _checkshellalias(lui, ui, args)
12769703d4ba dispatch: always load extensions before running shell aliases (issue5230)
Jun Wu <quark@fb.com>
parents: 29129
diff changeset
684 if shellaliasfn:
30006
b19c2679289c dispatch: make hg --profile wrap reposetup
Arun Kulshreshtha <kulshrax@fb.com>
parents: 30005
diff changeset
685 with profiling.maybeprofile(lui):
b19c2679289c dispatch: make hg --profile wrap reposetup
Arun Kulshreshtha <kulshrax@fb.com>
parents: 30005
diff changeset
686 return shellaliasfn()
22377
f98abe3146b2 dispatch: check shell alias again after loading extensions (issue4355)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 22376
diff changeset
687
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
688 # check for fallback encoding
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
689 fallback = lui.config('ui', 'fallbackencoding')
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
690 if fallback:
7948
de377b1a9a84 move encoding bits from util to encoding
Matt Mackall <mpm@selenic.com>
parents: 7873
diff changeset
691 encoding.fallbackencoding = fallback
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
692
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
693 fullargs = args
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
694 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
695
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
696 if options["config"]:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26421
diff changeset
697 raise error.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
698 if options["cwd"]:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26421
diff changeset
699 raise error.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
700 if options["repository"]:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26421
diff changeset
701 raise error.Abort(_(
15781
cc2da4a5ed9a dispatch: lowercase abort message
Martin Geisler <mg@aragost.com>
parents: 15632
diff changeset
702 "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
703 "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
704
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
705 if options["encoding"]:
7948
de377b1a9a84 move encoding bits from util to encoding
Matt Mackall <mpm@selenic.com>
parents: 7873
diff changeset
706 encoding.encoding = options["encoding"]
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
707 if options["encodingmode"]:
7948
de377b1a9a84 move encoding bits from util to encoding
Matt Mackall <mpm@selenic.com>
parents: 7873
diff changeset
708 encoding.encodingmode = options["encodingmode"]
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
709 if options["time"]:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
710 def get_times():
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
711 t = os.times()
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
712 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
713 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
714 return t
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
715 s = get_times()
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
716 def print_time():
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
717 t = get_times()
16933
30143c3dd102 dispatch: lowercase --time message
Martin Geisler <mg@aragost.com>
parents: 16839
diff changeset
718 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
719 (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
720 atexit.register(print_time)
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
721
14752
99ace3cb7352 dispatch: set global options on the request repo.ui
Idan Kamara <idankk86@gmail.com>
parents: 14748
diff changeset
722 uis = set([ui, lui])
99ace3cb7352 dispatch: set global options on the request repo.ui
Idan Kamara <idankk86@gmail.com>
parents: 14748
diff changeset
723
99ace3cb7352 dispatch: set global options on the request repo.ui
Idan Kamara <idankk86@gmail.com>
parents: 14748
diff changeset
724 if req.repo:
99ace3cb7352 dispatch: set global options on the request repo.ui
Idan Kamara <idankk86@gmail.com>
parents: 14748
diff changeset
725 uis.add(req.repo.ui)
99ace3cb7352 dispatch: set global options on the request repo.ui
Idan Kamara <idankk86@gmail.com>
parents: 14748
diff changeset
726
14992
188936b334b1 dispatch: make sure global options on the command line take precedence
Idan Kamara <idankk86@gmail.com>
parents: 14914
diff changeset
727 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
728 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
729 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
730 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
731 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
732
29782
97bfc2e5fba5 dispatch: set profiling.enabled when profiling is enabled
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29781
diff changeset
733 if options['profile']:
97bfc2e5fba5 dispatch: set profiling.enabled when profiling is enabled
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29781
diff changeset
734 for ui_ in uis:
97bfc2e5fba5 dispatch: set profiling.enabled when profiling is enabled
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29781
diff changeset
735 ui_.setconfig('profiling', 'enabled', 'true', '--profile')
97bfc2e5fba5 dispatch: set profiling.enabled when profiling is enabled
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29781
diff changeset
736
14992
188936b334b1 dispatch: make sure global options on the command line take precedence
Idan Kamara <idankk86@gmail.com>
parents: 14914
diff changeset
737 if options['traceback']:
188936b334b1 dispatch: make sure global options on the command line take precedence
Idan Kamara <idankk86@gmail.com>
parents: 14914
diff changeset
738 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
739 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
740
8136
6b5522cb2ad2 ui: refactor option setting
Matt Mackall <mpm@selenic.com>
parents: 8024
diff changeset
741 if options['noninteractive']:
14752
99ace3cb7352 dispatch: set global options on the request repo.ui
Idan Kamara <idankk86@gmail.com>
parents: 14748
diff changeset
742 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
743 ui_.setconfig('ui', 'interactive', 'off', '-y')
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
744
13328
a939f08fae9c url: add --insecure option to bypass verification of ssl certificates
Yuya Nishihara <yuya@tcha.org>
parents: 12932
diff changeset
745 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
746 for ui_ in uis:
29110
b197e2aba703 dispatch: set ui.insecureconnections when --insecure is used
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29087
diff changeset
747 ui_.insecureconnections = True
13328
a939f08fae9c url: add --insecure option to bypass verification of ssl certificates
Yuya Nishihara <yuya@tcha.org>
parents: 12932
diff changeset
748
15020
607f1434501d help: drop with_version
Matt Mackall <mpm@selenic.com>
parents: 15017
diff changeset
749 if options['version']:
607f1434501d help: drop with_version
Matt Mackall <mpm@selenic.com>
parents: 15017
diff changeset
750 return commands.version_(ui)
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
751 if options['help']:
27325
eadbbd14bdc1 help: fix help -c/help -e/help -k
timeless <timeless@mozdev.org>
parents: 27113
diff changeset
752 return commands.help_(ui, cmd, command=cmd is not None)
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
753 elif not cmd:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
754 return commands.help_(ui, 'shortlist')
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
755
30006
b19c2679289c dispatch: make hg --profile wrap reposetup
Arun Kulshreshtha <kulshrax@fb.com>
parents: 30005
diff changeset
756 with profiling.maybeprofile(lui):
30005
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
757 repo = None
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
758 cmdpats = args[:]
30485
acd30a959980 dispatch: stop supporting non-use of @command
Augie Fackler <augie@google.com>
parents: 30473
diff changeset
759 if not func.norepo:
30005
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
760 # use the repo from the request only if we don't have -R
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
761 if not rpath and not cwd:
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
762 repo = req.repo
14510
eccbb9980ada dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents: 14439
diff changeset
763
30005
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
764 if repo:
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
765 # set the descriptors of the repo ui to those of ui
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
766 repo.ui.fin = ui.fin
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
767 repo.ui.fout = ui.fout
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
768 repo.ui.ferr = ui.ferr
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
769 else:
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
770 try:
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
771 repo = hg.repository(ui, path=path)
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
772 if not repo.local():
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
773 raise error.Abort(_("repository '%s' is not local")
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
774 % path)
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
775 repo.ui.setconfig("bundle", "mainreporoot", repo.root,
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
776 'repo')
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
777 except error.RequirementError:
26142
7332bf4ae959 dispatch: error out on invalid -R path even if optionalrepo (issue4805) (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 25932
diff changeset
778 raise
30005
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
779 except error.RepoError:
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
780 if rpath and rpath[-1]: # invalid -R path
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
781 raise
30485
acd30a959980 dispatch: stop supporting non-use of @command
Augie Fackler <augie@google.com>
parents: 30473
diff changeset
782 if not func.optionalrepo:
acd30a959980 dispatch: stop supporting non-use of @command
Augie Fackler <augie@google.com>
parents: 30473
diff changeset
783 if func.inferrepo and args and not path:
30005
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
784 # try to infer -R from command args
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
785 repos = map(cmdutil.findrepo, args)
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
786 guess = repos[0]
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
787 if guess and repos.count(guess) == len(repos):
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
788 req.args = ['--repository', guess] + fullargs
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
789 return _dispatch(req)
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
790 if not path:
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
791 raise error.RepoError(_("no repository found in"
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
792 " '%s' (.hg not found)")
30519
20a42325fdef py3: use pycompat.getcwd() instead of os.getcwd()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30500
diff changeset
793 % pycompat.getcwd())
30005
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
794 raise
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
795 if repo:
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
796 ui = repo.ui
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
797 if options['hidden']:
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
798 repo = repo.unfiltered()
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
799 args.insert(0, repo)
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
800 elif rpath:
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
801 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
802
30005
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
803 msg = ' '.join(' ' in a and repr(a) or a for a in fullargs)
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
804 ui.log("command", '%s\n', msg)
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
805 d = lambda: util.checksignature(func)(ui, *args, **cmdoptions)
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
806 try:
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
807 return runcommand(lui, repo, cmd, fullargs, ui, options, d,
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
808 cmdpats, cmdoptions)
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
809 finally:
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
810 if repo and repo != req.repo:
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
811 repo.close()
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
812
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
813 def _runcommand(ui, options, cmd, cmdfunc):
29784
e3501546f7e4 profiling: add a context manager that no-ops if profiling isn't enabled
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29783
diff changeset
814 """Run a command function, possibly with profiling enabled."""
30006
b19c2679289c dispatch: make hg --profile wrap reposetup
Arun Kulshreshtha <kulshrax@fb.com>
parents: 30005
diff changeset
815 try:
b19c2679289c dispatch: make hg --profile wrap reposetup
Arun Kulshreshtha <kulshrax@fb.com>
parents: 30005
diff changeset
816 return cmdfunc()
b19c2679289c dispatch: make hg --profile wrap reposetup
Arun Kulshreshtha <kulshrax@fb.com>
parents: 30005
diff changeset
817 except error.SignatureError:
b19c2679289c dispatch: make hg --profile wrap reposetup
Arun Kulshreshtha <kulshrax@fb.com>
parents: 30005
diff changeset
818 raise error.CommandError(cmd, _('invalid arguments'))
28784
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
819
28821
d3369dc6c1d0 dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents: 28784
diff changeset
820 def _exceptionwarning(ui):
d3369dc6c1d0 dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents: 28784
diff changeset
821 """Produce a warning message for the current active exception"""
28784
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
822
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
823 # For compatibility checking, we discard the portion of the hg
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
824 # version after the + on the assumption that if a "normal
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
825 # user" is running a build with a + in it the packager
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
826 # probably built from fairly close to a tag and anyone with a
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
827 # 'make local' copy of hg (where the version number can be out
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
828 # of date) will be clueful enough to notice the implausible
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
829 # version number and try updating.
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
830 ct = util.versiontuple(n=2)
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
831 worst = None, ct, ''
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
832 if ui.config('ui', 'supportcontact', None) is None:
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
833 for name, mod in extensions.extensions():
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
834 testedwith = getattr(mod, 'testedwith', '')
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
835 report = getattr(mod, 'buglink', _('the extension author.'))
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
836 if not testedwith.strip():
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
837 # We found an untested extension. It's likely the culprit.
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
838 worst = name, 'unknown', report
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
839 break
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
840
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
841 # Never blame on extensions bundled with Mercurial.
29884
ed793f41e83f extensions: use ismoduleinternal() thoroughly
Yuya Nishihara <yuya@tcha.org>
parents: 29846
diff changeset
842 if extensions.ismoduleinternal(mod):
28784
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
843 continue
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
844
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
845 tested = [util.versiontuple(t, 2) for t in testedwith.split()]
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
846 if ct in tested:
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
847 continue
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
848
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
849 lower = [t for t in tested if t < ct]
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
850 nearest = max(lower or tested)
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
851 if worst[0] is None or nearest < worst[1]:
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
852 worst = name, nearest, report
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
853 if worst[0] is not None:
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
854 name, testedwith, report = worst
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
855 if not isinstance(testedwith, str):
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
856 testedwith = '.'.join([str(c) for c in testedwith])
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
857 warning = (_('** Unknown exception encountered with '
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
858 'possibly-broken third-party extension %s\n'
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
859 '** which supports versions %s of Mercurial.\n'
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
860 '** Please disable %s and try your action again.\n'
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
861 '** If that fixes the bug please report it to %s\n')
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
862 % (name, testedwith, name, report))
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
863 else:
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
864 bugtracker = ui.config('ui', 'supportcontact', None)
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
865 if bugtracker is None:
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
866 bugtracker = _("https://mercurial-scm.org/wiki/BugTracker")
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
867 warning = (_("** unknown exception encountered, "
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
868 "please report by visiting\n** ") + bugtracker + '\n')
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
869 warning += ((_("** Python %s\n") % sys.version.replace('\n', '')) +
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
870 (_("** Mercurial Distributed SCM (version %s)\n") %
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
871 util.version()) +
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
872 (_("** Extensions loaded: %s\n") %
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
873 ", ".join([x[0] for x in extensions.extensions()])))
28821
d3369dc6c1d0 dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents: 28784
diff changeset
874 return warning
d3369dc6c1d0 dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents: 28784
diff changeset
875
d3369dc6c1d0 dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents: 28784
diff changeset
876 def handlecommandexception(ui):
d3369dc6c1d0 dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents: 28784
diff changeset
877 """Produce a warning message for broken commands
d3369dc6c1d0 dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents: 28784
diff changeset
878
d3369dc6c1d0 dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents: 28784
diff changeset
879 Called when handling an exception; the exception is reraised if
d3369dc6c1d0 dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents: 28784
diff changeset
880 this function returns False, ignored otherwise.
d3369dc6c1d0 dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents: 28784
diff changeset
881 """
d3369dc6c1d0 dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents: 28784
diff changeset
882 warning = _exceptionwarning(ui)
28784
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
883 ui.log("commandexception", "%s\n%s\n", warning, traceback.format_exc())
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
884 ui.warn(warning)
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
885 return False # re-raise the exception