annotate mercurial/dispatch.py @ 32744:33b7283a3828

streamclone: consider secret changesets (BC) (issue5589) Previously, a repo containing secret changesets would be served via stream clone, transferring those secret changesets. While secret changesets aren't meant to imply strong security (if you really want to keep them secret, others shouldn't have read access to the repo), we should at least make an effort to protect secret changesets when possible. After this commit, we no longer serve stream clones for repos containing secret changesets by default. This is backwards incompatible behavior. In case anyone is relying on the behavior, we provide a config option to opt into the old behavior. Note that this defense is only beneficial for remote repos accessed via the wire protocol: if a client has access to the files backing a repo, they can get to the raw data and see secret revisions.
author Gregory Szorc <gregory.szorc@gmail.com>
date Fri, 09 Jun 2017 10:41:13 -0700
parents 12941a782928
children 545f69cd6042
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
24221
4e240d6ab898 dispatch: offer near-edit-distance suggestions for {file,rev}set functions
Augie Fackler <augie@google.com>
parents: 24163
diff changeset
10 import difflib
25932
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
11 import errno
30576
541949a10a68 fancyopts: switch from fancyopts.getopt.* to getopt.*
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30559
diff changeset
12 import getopt
25932
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 signal
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
17 import sys
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
18 import time
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
19 import traceback
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
20
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 from .i18n import _
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
23
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
24 from . import (
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
25 cmdutil,
30653
b2be4ccaff1d color: load 'colortable' from extension using an 'extraloader'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30586
diff changeset
26 color,
25932
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
27 commands,
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
28 demandimport,
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
29 encoding,
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
30 error,
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
31 extensions,
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
32 fancyopts,
28447
4eb5496c2bd4 registrar: add filesetpredicate to mark a function as fileset predicate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28394
diff changeset
33 fileset,
31060
ab20491b1760 dispatch: rearrange 'unknown command' code to better employ pager
Augie Fackler <augie@google.com>
parents: 31027
diff changeset
34 help,
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,
32379
71e735bd8170 dispatch: make request accept additional reposetups
Jun Wu <quark@fb.com>
parents: 32377
diff changeset
50 ferr=None, prereposetups=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
32379
71e735bd8170 dispatch: make request accept additional reposetups
Jun Wu <quark@fb.com>
parents: 32377
diff changeset
60 # reposetups which run before extensions, useful for chg to pre-fill
71e735bd8170 dispatch: make request accept additional reposetups
Jun Wu <quark@fb.com>
parents: 32377
diff changeset
61 # low-level repo state (for example, changelog) before extensions.
71e735bd8170 dispatch: make request accept additional reposetups
Jun Wu <quark@fb.com>
parents: 32377
diff changeset
62 self.prereposetups = prereposetups or []
71e735bd8170 dispatch: make request accept additional reposetups
Jun Wu <quark@fb.com>
parents: 32377
diff changeset
63
31956
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31629
diff changeset
64 def _runexithandlers(self):
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31629
diff changeset
65 exc = None
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31629
diff changeset
66 handlers = self.ui._exithandlers
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31629
diff changeset
67 try:
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31629
diff changeset
68 while handlers:
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31629
diff changeset
69 func, args, kwargs = handlers.pop()
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31629
diff changeset
70 try:
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31629
diff changeset
71 func(*args, **kwargs)
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31629
diff changeset
72 except: # re-raises below
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31629
diff changeset
73 if exc is None:
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31629
diff changeset
74 exc = sys.exc_info()[1]
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31629
diff changeset
75 self.ui.warn(('error in exit handlers:\n'))
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31629
diff changeset
76 self.ui.traceback(force=True)
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31629
diff changeset
77 finally:
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31629
diff changeset
78 if exc is not None:
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31629
diff changeset
79 raise exc
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31629
diff changeset
80
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
81 def run():
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
82 "run the command in sys.argv"
31960
71dcd4a4fa2f stdio: catch StdioError in dispatch.run and clean up appropriately
Bryan O'Sullivan <bryano@fb.com>
parents: 31958
diff changeset
83 req = request(pycompat.sysargv[1:])
71dcd4a4fa2f stdio: catch StdioError in dispatch.run and clean up appropriately
Bryan O'Sullivan <bryano@fb.com>
parents: 31958
diff changeset
84 err = None
71dcd4a4fa2f stdio: catch StdioError in dispatch.run and clean up appropriately
Bryan O'Sullivan <bryano@fb.com>
parents: 31958
diff changeset
85 try:
71dcd4a4fa2f stdio: catch StdioError in dispatch.run and clean up appropriately
Bryan O'Sullivan <bryano@fb.com>
parents: 31958
diff changeset
86 status = (dispatch(req) or 0) & 255
71dcd4a4fa2f stdio: catch StdioError in dispatch.run and clean up appropriately
Bryan O'Sullivan <bryano@fb.com>
parents: 31958
diff changeset
87 except error.StdioError as err:
71dcd4a4fa2f stdio: catch StdioError in dispatch.run and clean up appropriately
Bryan O'Sullivan <bryano@fb.com>
parents: 31958
diff changeset
88 status = -1
71dcd4a4fa2f stdio: catch StdioError in dispatch.run and clean up appropriately
Bryan O'Sullivan <bryano@fb.com>
parents: 31958
diff changeset
89 if util.safehasattr(req.ui, 'fout'):
71dcd4a4fa2f stdio: catch StdioError in dispatch.run and clean up appropriately
Bryan O'Sullivan <bryano@fb.com>
parents: 31958
diff changeset
90 try:
32687
12941a782928 dispatch: do not close stdout and stderr, just flush() instead
Yuya Nishihara <yuya@tcha.org>
parents: 32652
diff changeset
91 req.ui.fout.flush()
31960
71dcd4a4fa2f stdio: catch StdioError in dispatch.run and clean up appropriately
Bryan O'Sullivan <bryano@fb.com>
parents: 31958
diff changeset
92 except IOError as err:
71dcd4a4fa2f stdio: catch StdioError in dispatch.run and clean up appropriately
Bryan O'Sullivan <bryano@fb.com>
parents: 31958
diff changeset
93 status = -1
71dcd4a4fa2f stdio: catch StdioError in dispatch.run and clean up appropriately
Bryan O'Sullivan <bryano@fb.com>
parents: 31958
diff changeset
94 if util.safehasattr(req.ui, 'ferr'):
71dcd4a4fa2f stdio: catch StdioError in dispatch.run and clean up appropriately
Bryan O'Sullivan <bryano@fb.com>
parents: 31958
diff changeset
95 if err is not None and err.errno != errno.EPIPE:
71dcd4a4fa2f stdio: catch StdioError in dispatch.run and clean up appropriately
Bryan O'Sullivan <bryano@fb.com>
parents: 31958
diff changeset
96 req.ui.ferr.write('abort: %s\n' % err.strerror)
32687
12941a782928 dispatch: do not close stdout and stderr, just flush() instead
Yuya Nishihara <yuya@tcha.org>
parents: 32652
diff changeset
97 req.ui.ferr.flush()
31960
71dcd4a4fa2f stdio: catch StdioError in dispatch.run and clean up appropriately
Bryan O'Sullivan <bryano@fb.com>
parents: 31958
diff changeset
98 sys.exit(status & 255)
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
99
24221
4e240d6ab898 dispatch: offer near-edit-distance suggestions for {file,rev}set functions
Augie Fackler <augie@google.com>
parents: 24163
diff changeset
100 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
101 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
102 # 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
103 # 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
104 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
105
27623
b3376fba4ab9 dispatch: report similar names consistently
Bryan O'Sullivan <bos@serpentine.com>
parents: 27615
diff changeset
106 def _reportsimilar(write, similar):
b3376fba4ab9 dispatch: report similar names consistently
Bryan O'Sullivan <bos@serpentine.com>
parents: 27615
diff changeset
107 if len(similar) == 1:
b3376fba4ab9 dispatch: report similar names consistently
Bryan O'Sullivan <bos@serpentine.com>
parents: 27615
diff changeset
108 write(_("(did you mean %s?)\n") % similar[0])
b3376fba4ab9 dispatch: report similar names consistently
Bryan O'Sullivan <bos@serpentine.com>
parents: 27615
diff changeset
109 elif similar:
b3376fba4ab9 dispatch: report similar names consistently
Bryan O'Sullivan <bos@serpentine.com>
parents: 27615
diff changeset
110 ss = ", ".join(sorted(similar))
b3376fba4ab9 dispatch: report similar names consistently
Bryan O'Sullivan <bos@serpentine.com>
parents: 27615
diff changeset
111 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
112
24039
2ee35b6ee4fb dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents: 23871
diff changeset
113 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
114 similar = []
4e240d6ab898 dispatch: offer near-edit-distance suggestions for {file,rev}set functions
Augie Fackler <augie@google.com>
parents: 24163
diff changeset
115 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
116 # 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
117 similar = _getsimilar(inst.symbols, inst.function)
24039
2ee35b6ee4fb dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents: 23871
diff changeset
118 if len(inst.args) > 1:
2ee35b6ee4fb dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents: 23871
diff changeset
119 write(_("hg: parse error at %s: %s\n") %
2ee35b6ee4fb dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents: 23871
diff changeset
120 (inst.args[1], inst.args[0]))
2ee35b6ee4fb dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents: 23871
diff changeset
121 if (inst.args[0][0] == ' '):
2ee35b6ee4fb dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents: 23871
diff changeset
122 write(_("unexpected leading whitespace\n"))
2ee35b6ee4fb dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents: 23871
diff changeset
123 else:
2ee35b6ee4fb dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents: 23871
diff changeset
124 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
125 _reportsimilar(write, similar)
28515
491eabd0df79 dispatch: extract common logic for handling ParseError
Jun Wu <quark@fb.com>
parents: 28447
diff changeset
126 if inst.hint:
491eabd0df79 dispatch: extract common logic for handling ParseError
Jun Wu <quark@fb.com>
parents: 28447
diff changeset
127 write(_("(%s)\n") % inst.hint)
24039
2ee35b6ee4fb dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents: 23871
diff changeset
128
31492
3c77414a0f9c dispatch: consolidate formatting of arguments
Augie Fackler <augie@google.com>
parents: 31491
diff changeset
129 def _formatargs(args):
31500
bc315e669a32 dispatch: replace mayberepr with shellquote
Augie Fackler <augie@google.com>
parents: 31494
diff changeset
130 return ' '.join(util.shellquote(a) for a in args)
31492
3c77414a0f9c dispatch: consolidate formatting of arguments
Augie Fackler <augie@google.com>
parents: 31491
diff changeset
131
14438
08bfec2ef031 dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents: 14286
diff changeset
132 def dispatch(req):
08bfec2ef031 dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents: 14286
diff changeset
133 "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
134 if req.ferr:
9fba795dd030 dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents: 14613
diff changeset
135 ferr = req.ferr
9fba795dd030 dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents: 14613
diff changeset
136 elif req.ui:
9fba795dd030 dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents: 14613
diff changeset
137 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
138 else:
30473
39d13b8c101d py3: bulk replace sys.stdin/out/err by util's
Yuya Nishihara <yuya@tcha.org>
parents: 30468
diff changeset
139 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
140
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
141 try:
14439
80c599eee3f3 dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents: 14438
diff changeset
142 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
143 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
144 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
145 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
146
9fba795dd030 dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents: 14613
diff changeset
147 # 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
148 if req.fin:
9fba795dd030 dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents: 14613
diff changeset
149 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
150 if req.fout:
9fba795dd030 dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents: 14613
diff changeset
151 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
152 if req.ferr:
9fba795dd030 dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents: 14613
diff changeset
153 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
154 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
155 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
156 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
157 ferr.write(_("(%s)\n") % inst.hint)
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
158 return -1
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25329
diff changeset
159 except error.ParseError as inst:
24039
2ee35b6ee4fb dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents: 23871
diff changeset
160 _formatparse(ferr.write, inst)
9470
ba75830d17a9 dispatch: catch ConfigError while constructing ui
Martin Geisler <mg@lazybytes.net>
parents: 8936
diff changeset
161 return -1
14615
9fba795dd030 dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents: 14613
diff changeset
162
31492
3c77414a0f9c dispatch: consolidate formatting of arguments
Augie Fackler <augie@google.com>
parents: 31491
diff changeset
163 msg = _formatargs(req.args)
30975
22fbca1d11ed mercurial: switch to util.timer for all interval timings
Simon Farnsworth <simonfar@fb.com>
parents: 30934
diff changeset
164 starttime = util.timer()
19229
41e39a0299cb blackbox: fix recording exit codes (issue3938)
Durham Goode <durham@fb.com>
parents: 19099
diff changeset
165 ret = None
41e39a0299cb blackbox: fix recording exit codes (issue3938)
Durham Goode <durham@fb.com>
parents: 19099
diff changeset
166 try:
41e39a0299cb blackbox: fix recording exit codes (issue3938)
Durham Goode <durham@fb.com>
parents: 19099
diff changeset
167 ret = _runcatch(req)
32340
9c023179e8d0 error: add hint to ProgrammingError
Yuya Nishihara <yuya@tcha.org>
parents: 32291
diff changeset
168 except error.ProgrammingError as inst:
9c023179e8d0 error: add hint to ProgrammingError
Yuya Nishihara <yuya@tcha.org>
parents: 32291
diff changeset
169 req.ui.warn(_('** ProgrammingError: %s\n') % inst)
9c023179e8d0 error: add hint to ProgrammingError
Yuya Nishihara <yuya@tcha.org>
parents: 32291
diff changeset
170 if inst.hint:
9c023179e8d0 error: add hint to ProgrammingError
Yuya Nishihara <yuya@tcha.org>
parents: 32291
diff changeset
171 req.ui.warn(_('** (%s)\n') % inst.hint)
9c023179e8d0 error: add hint to ProgrammingError
Yuya Nishihara <yuya@tcha.org>
parents: 32291
diff changeset
172 raise
32111
1208b74841ff dispatch: take over SignalInterrupt handling from scmutil
Jun Wu <quark@fb.com>
parents: 32054
diff changeset
173 except KeyboardInterrupt as inst:
28520
84cc72c5771e dispatch: catch KeyboardInterrupt more broadly
Yuya Nishihara <yuya@tcha.org>
parents: 28515
diff changeset
174 try:
32111
1208b74841ff dispatch: take over SignalInterrupt handling from scmutil
Jun Wu <quark@fb.com>
parents: 32054
diff changeset
175 if isinstance(inst, error.SignalInterrupt):
1208b74841ff dispatch: take over SignalInterrupt handling from scmutil
Jun Wu <quark@fb.com>
parents: 32054
diff changeset
176 msg = _("killed!\n")
1208b74841ff dispatch: take over SignalInterrupt handling from scmutil
Jun Wu <quark@fb.com>
parents: 32054
diff changeset
177 else:
1208b74841ff dispatch: take over SignalInterrupt handling from scmutil
Jun Wu <quark@fb.com>
parents: 32054
diff changeset
178 msg = _("interrupted!\n")
1208b74841ff dispatch: take over SignalInterrupt handling from scmutil
Jun Wu <quark@fb.com>
parents: 32054
diff changeset
179 req.ui.warn(msg)
32044
cde72a195f32 dispatch: ignore further SIGPIPE while handling KeyboardInterrupt
Yuya Nishihara <yuya@tcha.org>
parents: 32041
diff changeset
180 except error.SignalInterrupt:
cde72a195f32 dispatch: ignore further SIGPIPE while handling KeyboardInterrupt
Yuya Nishihara <yuya@tcha.org>
parents: 32041
diff changeset
181 # maybe pager would quit without consuming all the output, and
cde72a195f32 dispatch: ignore further SIGPIPE while handling KeyboardInterrupt
Yuya Nishihara <yuya@tcha.org>
parents: 32041
diff changeset
182 # SIGPIPE was raised. we cannot print anything in this case.
cde72a195f32 dispatch: ignore further SIGPIPE while handling KeyboardInterrupt
Yuya Nishihara <yuya@tcha.org>
parents: 32041
diff changeset
183 pass
28520
84cc72c5771e dispatch: catch KeyboardInterrupt more broadly
Yuya Nishihara <yuya@tcha.org>
parents: 28515
diff changeset
184 except IOError as inst:
84cc72c5771e dispatch: catch KeyboardInterrupt more broadly
Yuya Nishihara <yuya@tcha.org>
parents: 28515
diff changeset
185 if inst.errno != errno.EPIPE:
84cc72c5771e dispatch: catch KeyboardInterrupt more broadly
Yuya Nishihara <yuya@tcha.org>
parents: 28515
diff changeset
186 raise
84cc72c5771e dispatch: catch KeyboardInterrupt more broadly
Yuya Nishihara <yuya@tcha.org>
parents: 28515
diff changeset
187 ret = -1
19229
41e39a0299cb blackbox: fix recording exit codes (issue3938)
Durham Goode <durham@fb.com>
parents: 19099
diff changeset
188 finally:
30975
22fbca1d11ed mercurial: switch to util.timer for all interval timings
Simon Farnsworth <simonfar@fb.com>
parents: 30934
diff changeset
189 duration = util.timer() - starttime
28534
293adbaa14a7 dispatch: flush ui before returning from dispatch
Jun Wu <quark@fb.com>
parents: 28520
diff changeset
190 req.ui.flush()
30976
e92daf156d5c ui: provide a mechanism to track and log blocked time
Simon Farnsworth <simonfar@fb.com>
parents: 30975
diff changeset
191 if req.ui.logblockedtimes:
e92daf156d5c ui: provide a mechanism to track and log blocked time
Simon Farnsworth <simonfar@fb.com>
parents: 30975
diff changeset
192 req.ui._blockedtimes['command_duration'] = duration * 1000
e92daf156d5c ui: provide a mechanism to track and log blocked time
Simon Farnsworth <simonfar@fb.com>
parents: 30975
diff changeset
193 req.ui.log('uiblocked', 'ui blocked ms', **req.ui._blockedtimes)
32130
c3dcec6cbc1b py3: use %d instead of %s for integers
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32111
diff changeset
194 req.ui.log("commandfinish", "%s exited %d after %0.2f seconds\n",
19229
41e39a0299cb blackbox: fix recording exit codes (issue3938)
Durham Goode <durham@fb.com>
parents: 19099
diff changeset
195 msg, ret or 0, duration)
31956
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31629
diff changeset
196 try:
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31629
diff changeset
197 req._runexithandlers()
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31629
diff changeset
198 except: # exiting, so no re-raises
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31629
diff changeset
199 ret = ret or -1
28520
84cc72c5771e dispatch: catch KeyboardInterrupt more broadly
Yuya Nishihara <yuya@tcha.org>
parents: 28515
diff changeset
200 return ret
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
201
14439
80c599eee3f3 dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents: 14438
diff changeset
202 def _runcatch(req):
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
203 def catchterm(*args):
7644
182b7114d35a error: move SignalInterrupt
Matt Mackall <mpm@selenic.com>
parents: 7643
diff changeset
204 raise error.SignalInterrupt
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
205
14439
80c599eee3f3 dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents: 14438
diff changeset
206 ui = req.ui
10952
6c2c766afefe dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents: 10793
diff changeset
207 try:
6c2c766afefe dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents: 10793
diff changeset
208 for name in 'SIGBREAK', 'SIGHUP', 'SIGTERM':
6c2c766afefe dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents: 10793
diff changeset
209 num = getattr(signal, name, None)
6c2c766afefe dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents: 10793
diff changeset
210 if num:
6c2c766afefe dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents: 10793
diff changeset
211 signal.signal(num, catchterm)
6c2c766afefe dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents: 10793
diff changeset
212 except ValueError:
6c2c766afefe dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents: 10793
diff changeset
213 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
214
29761
39149b6036e6 dispatch: split global error handling out so it can be reused
Jun Wu <quark@fb.com>
parents: 29132
diff changeset
215 def _runcatchfunc():
32050
77eaf9539499 dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents: 30678
diff changeset
216 realcmd = None
77eaf9539499 dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents: 30678
diff changeset
217 try:
77eaf9539499 dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents: 30678
diff changeset
218 cmdargs = fancyopts.fancyopts(req.args[:], commands.globalopts, {})
77eaf9539499 dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents: 30678
diff changeset
219 cmd = cmdargs[0]
77eaf9539499 dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents: 30678
diff changeset
220 aliases, entry = cmdutil.findcmd(cmd, commands.table, False)
77eaf9539499 dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents: 30678
diff changeset
221 realcmd = aliases[0]
77eaf9539499 dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents: 30678
diff changeset
222 except (error.UnknownCommand, error.AmbiguousCommand,
77eaf9539499 dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents: 30678
diff changeset
223 IndexError, getopt.GetoptError):
77eaf9539499 dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents: 30678
diff changeset
224 # Don't handle this here. We know the command is
77eaf9539499 dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents: 30678
diff changeset
225 # invalid, but all we're worried about for now is that
77eaf9539499 dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents: 30678
diff changeset
226 # it's not a command that server operators expect to
77eaf9539499 dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents: 30678
diff changeset
227 # be safe to offer to users in a sandbox.
77eaf9539499 dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents: 30678
diff changeset
228 pass
77eaf9539499 dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents: 30678
diff changeset
229 if realcmd == 'serve' and '--stdio' in cmdargs:
77eaf9539499 dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents: 30678
diff changeset
230 # We want to constrain 'hg serve --stdio' instances pretty
77eaf9539499 dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents: 30678
diff changeset
231 # closely, as many shared-ssh access tools want to grant
77eaf9539499 dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents: 30678
diff changeset
232 # access to run *only* 'hg -R $repo serve --stdio'. We
77eaf9539499 dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents: 30678
diff changeset
233 # restrict to exactly that set of arguments, and prohibit
77eaf9539499 dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents: 30678
diff changeset
234 # any repo name that starts with '--' to prevent
77eaf9539499 dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents: 30678
diff changeset
235 # shenanigans wherein a user does something like pass
77eaf9539499 dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents: 30678
diff changeset
236 # --debugger or --config=ui.debugger=1 as a repo
77eaf9539499 dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents: 30678
diff changeset
237 # name. This used to actually run the debugger.
77eaf9539499 dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents: 30678
diff changeset
238 if (len(req.args) != 4 or
77eaf9539499 dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents: 30678
diff changeset
239 req.args[0] != '-R' or
77eaf9539499 dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents: 30678
diff changeset
240 req.args[1].startswith('--') or
77eaf9539499 dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents: 30678
diff changeset
241 req.args[2] != 'serve' or
77eaf9539499 dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents: 30678
diff changeset
242 req.args[3] != '--stdio'):
77eaf9539499 dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents: 30678
diff changeset
243 raise error.Abort(
77eaf9539499 dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents: 30678
diff changeset
244 _('potentially unsafe serve --stdio invocation: %r') %
77eaf9539499 dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents: 30678
diff changeset
245 (req.args,))
77eaf9539499 dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents: 30678
diff changeset
246
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
247 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
248 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
249 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
250 '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
251 }
472fa3b782b1 dispatch: add ability to specify a custom pdb module as a debugger
Sean Farley <sean.michael.farley@gmail.com>
parents: 19639
diff changeset
252 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
253 '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
254 }
19639
09573ad59f7b dispatch: move command line --config argument parsing to _runcatch()
Sean Farley <sean.michael.farley@gmail.com>
parents: 19229
diff changeset
255
09573ad59f7b dispatch: move command line --config argument parsing to _runcatch()
Sean Farley <sean.michael.farley@gmail.com>
parents: 19229
diff changeset
256 # 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
257 # (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
258 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
259
09573ad59f7b dispatch: move command line --config argument parsing to _runcatch()
Sean Farley <sean.michael.farley@gmail.com>
parents: 19229
diff changeset
260 if req.repo:
09573ad59f7b dispatch: move command line --config argument parsing to _runcatch()
Sean Farley <sean.michael.farley@gmail.com>
parents: 19229
diff changeset
261 # 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
262 # the repo ui
20796
131f7fe06e9e check-code: check for argument passing py2.6ism
Matt Mackall <mpm@selenic.com>
parents: 20788
diff changeset
263 for sec, name, val in cfgs:
131f7fe06e9e check-code: check for argument passing py2.6ism
Matt Mackall <mpm@selenic.com>
parents: 20788
diff changeset
264 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
265
25833
8243e999f22b debugger: mark developer-only option
Matt Mackall <mpm@selenic.com>
parents: 25660
diff changeset
266 # 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
267 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
268 debugmod = pdb
20122
8f4a226c840c dispatch: turn off custom debugger for HGPLAIN mode
Sean Farley <sean.michael.farley@gmail.com>
parents: 19640
diff changeset
269 if not debugger or ui.plain():
25833
8243e999f22b debugger: mark developer-only option
Matt Mackall <mpm@selenic.com>
parents: 25660
diff changeset
270 # 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
271 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
272 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
273 # 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
274 # 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
275 # debugging has been requested
25329
101e84121c13 dispatch: disable demandimport for the --debugger option
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 25277
diff changeset
276 with demandimport.deactivated():
101e84121c13 dispatch: disable demandimport for the --debugger option
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 25277
diff changeset
277 try:
101e84121c13 dispatch: disable demandimport for the --debugger option
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 25277
diff changeset
278 debugmod = __import__(debugger)
101e84121c13 dispatch: disable demandimport for the --debugger option
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 25277
diff changeset
279 except ImportError:
101e84121c13 dispatch: disable demandimport for the --debugger option
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 25277
diff changeset
280 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
281
472fa3b782b1 dispatch: add ability to specify a custom pdb module as a debugger
Sean Farley <sean.michael.farley@gmail.com>
parents: 19639
diff changeset
282 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
283 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
284
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
285 # 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
286 if '--debugger' in req.args:
11495
6ee107782018 debugger: give a little intro before entering pdb
Mads Kiilerich <mads@kiilerich.com>
parents: 11494
diff changeset
287 ui.warn(_("entering debugger - "
6ee107782018 debugger: give a little intro before entering pdb
Mads Kiilerich <mads@kiilerich.com>
parents: 11494
diff changeset
288 "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
289
472fa3b782b1 dispatch: add ability to specify a custom pdb module as a debugger
Sean Farley <sean.michael.farley@gmail.com>
parents: 19639
diff changeset
290 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
291 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
292 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
293 "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
294 with demandimport.deactivated():
26216
e86d12404d69 dispatch: disable demandimport when invoking the debugger
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 26191
diff changeset
295 debugtrace[debugger]()
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
296 try:
14439
80c599eee3f3 dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents: 14438
diff changeset
297 return _dispatch(req)
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
298 finally:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
299 ui.flush()
16705
c2d9ef43ff6c check-code: ignore naked excepts with a "re-raise" comment
Brodie Rao <brodie@sf.io>
parents: 16686
diff changeset
300 except: # re-raises
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
301 # 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
302 if '--debugger' in req.args:
11494
2347513f562a debugger: show traceback before entering pdb post-mortem
Mads Kiilerich <mads@kiilerich.com>
parents: 11330
diff changeset
303 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
304 debugmortem[debugger](sys.exc_info()[2])
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
305 raise
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
306
32040
0fb78cb90ca7 dispatch: mark callcatch() as a private function
Yuya Nishihara <yuya@tcha.org>
parents: 31960
diff changeset
307 return _callcatch(ui, _runcatchfunc)
29761
39149b6036e6 dispatch: split global error handling out so it can be reused
Jun Wu <quark@fb.com>
parents: 29132
diff changeset
308
32040
0fb78cb90ca7 dispatch: mark callcatch() as a private function
Yuya Nishihara <yuya@tcha.org>
parents: 31960
diff changeset
309 def _callcatch(ui, func):
30520
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30519
diff changeset
310 """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
311 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
312 uncaught exceptions.
29761
39149b6036e6 dispatch: split global error handling out so it can be reused
Jun Wu <quark@fb.com>
parents: 29132
diff changeset
313 """
39149b6036e6 dispatch: split global error handling out so it can be reused
Jun Wu <quark@fb.com>
parents: 29132
diff changeset
314 try:
30520
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30519
diff changeset
315 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
316 except error.AmbiguousCommand as inst:
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
317 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
318 (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
319 except error.CommandError as inst:
7645
020a896a5292 dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents: 7644
diff changeset
320 if inst.args[0]:
31266
8089de5fab89 dispatch: add pagination of two more help cases
Augie Fackler <augie@google.com>
parents: 31199
diff changeset
321 ui.pager('help')
32620
3ce53a499334 dispatch: convert exception payload to bytes more carefully
Augie Fackler <raf@durin42.com>
parents: 32566
diff changeset
322 msgbytes = pycompat.bytestr(inst.args[1])
3ce53a499334 dispatch: convert exception payload to bytes more carefully
Augie Fackler <raf@durin42.com>
parents: 32566
diff changeset
323 ui.warn(_("hg %s: %s\n") % (inst.args[0], msgbytes))
14286
005a540e9aee help: add -c/--command flag to only show command help (issue2799)
Martin Geisler <mg@aragost.com>
parents: 14265
diff changeset
324 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
325 else:
31266
8089de5fab89 dispatch: add pagination of two more help cases
Augie Fackler <augie@google.com>
parents: 31199
diff changeset
326 ui.pager('help')
7645
020a896a5292 dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents: 7644
diff changeset
327 ui.warn(_("hg: %s\n") % inst.args[1])
020a896a5292 dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents: 7644
diff changeset
328 commands.help_(ui, 'shortlist')
30520
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30519
diff changeset
329 except error.ParseError as inst:
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30519
diff changeset
330 _formatparse(ui.warn, inst)
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30519
diff changeset
331 return -1
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25329
diff changeset
332 except error.UnknownCommand as inst:
31060
ab20491b1760 dispatch: rearrange 'unknown command' code to better employ pager
Augie Fackler <augie@google.com>
parents: 31027
diff changeset
333 nocmdmsg = _("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
334 try:
de1e7099d100 dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents: 10282
diff changeset
335 # 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
336 # (but don't check for extensions themselves)
32566
1b90036f42f0 help: pass commands module by argument
Yuya Nishihara <yuya@tcha.org>
parents: 32379
diff changeset
337 formatted = help.formattedhelp(ui, commands, inst.args[0],
1b90036f42f0 help: pass commands module by argument
Yuya Nishihara <yuya@tcha.org>
parents: 32379
diff changeset
338 unknowncmd=True)
31060
ab20491b1760 dispatch: rearrange 'unknown command' code to better employ pager
Augie Fackler <augie@google.com>
parents: 31027
diff changeset
339 ui.warn(nocmdmsg)
ab20491b1760 dispatch: rearrange 'unknown command' code to better employ pager
Augie Fackler <augie@google.com>
parents: 31027
diff changeset
340 ui.write(formatted)
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26421
diff changeset
341 except (error.UnknownCommand, error.Abort):
24222
02d7b5cd373b dispatch: offer suggestions of similar-named commands
Augie Fackler <augie@google.com>
parents: 24221
diff changeset
342 suggested = False
02d7b5cd373b dispatch: offer suggestions of similar-named commands
Augie Fackler <augie@google.com>
parents: 24221
diff changeset
343 if len(inst.args) == 2:
02d7b5cd373b dispatch: offer suggestions of similar-named commands
Augie Fackler <augie@google.com>
parents: 24221
diff changeset
344 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
345 if sim:
31060
ab20491b1760 dispatch: rearrange 'unknown command' code to better employ pager
Augie Fackler <augie@google.com>
parents: 31027
diff changeset
346 ui.warn(nocmdmsg)
27623
b3376fba4ab9 dispatch: report similar names consistently
Bryan O'Sullivan <bos@serpentine.com>
parents: 27615
diff changeset
347 _reportsimilar(ui.warn, sim)
24222
02d7b5cd373b dispatch: offer suggestions of similar-named commands
Augie Fackler <augie@google.com>
parents: 24221
diff changeset
348 suggested = True
02d7b5cd373b dispatch: offer suggestions of similar-named commands
Augie Fackler <augie@google.com>
parents: 24221
diff changeset
349 if not suggested:
31060
ab20491b1760 dispatch: rearrange 'unknown command' code to better employ pager
Augie Fackler <augie@google.com>
parents: 31027
diff changeset
350 ui.pager('help')
ab20491b1760 dispatch: rearrange 'unknown command' code to better employ pager
Augie Fackler <augie@google.com>
parents: 31027
diff changeset
351 ui.warn(nocmdmsg)
24222
02d7b5cd373b dispatch: offer suggestions of similar-named commands
Augie Fackler <augie@google.com>
parents: 24221
diff changeset
352 commands.help_(ui, 'shortlist')
30520
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30519
diff changeset
353 except IOError:
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30519
diff changeset
354 raise
7645
020a896a5292 dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents: 7644
diff changeset
355 except KeyboardInterrupt:
28520
84cc72c5771e dispatch: catch KeyboardInterrupt more broadly
Yuya Nishihara <yuya@tcha.org>
parents: 28515
diff changeset
356 raise
30520
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30519
diff changeset
357 except: # probably re-raises
28784
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
358 if not handlecommandexception(ui):
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
359 raise
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
360
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
361 return -1
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
362
14265
e4ab5ae193f2 add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents: 14096
diff changeset
363 def aliasargs(fn, givenargs):
e4ab5ae193f2 add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents: 14096
diff changeset
364 args = getattr(fn, 'args', [])
16294
795d591b6ef5 alias: abort on missing positional args (issue3331)
Matt Mackall <mpm@selenic.com>
parents: 16277
diff changeset
365 if args:
14265
e4ab5ae193f2 add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents: 14096
diff changeset
366 cmd = ' '.join(map(util.shellquote, args))
e4ab5ae193f2 add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents: 14096
diff changeset
367
e4ab5ae193f2 add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents: 14096
diff changeset
368 nums = []
e4ab5ae193f2 add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents: 14096
diff changeset
369 def replacer(m):
e4ab5ae193f2 add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents: 14096
diff changeset
370 num = int(m.group(1)) - 1
e4ab5ae193f2 add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents: 14096
diff changeset
371 nums.append(num)
16277
1c2aaf05f7d7 aliases: use empty string for missing position parameters (issue3331)
Matt Mackall <mpm@selenic.com>
parents: 15781
diff changeset
372 if num < len(givenargs):
1c2aaf05f7d7 aliases: use empty string for missing position parameters (issue3331)
Matt Mackall <mpm@selenic.com>
parents: 15781
diff changeset
373 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
374 raise error.Abort(_('too few arguments for command alias'))
31491
492c64afc54c py3: make the regular expression bytes to prevent TypeError
Pulkit Goyal <7895pulkit@gmail.com>
parents: 31305
diff changeset
375 cmd = re.sub(br'\$(\d+|\$)', replacer, cmd)
14265
e4ab5ae193f2 add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents: 14096
diff changeset
376 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
377 if i not in nums]
30678
caf7e1c5efe4 py3: have a bytes version of shlex.split()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30653
diff changeset
378 args = pycompat.shlexsplit(cmd)
14265
e4ab5ae193f2 add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents: 14096
diff changeset
379 return args + givenargs
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
380
22158
bc2132dfc0a4 alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents: 21961
diff changeset
381 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
382 '''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
383
bc2132dfc0a4 alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents: 21961
diff changeset
384 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
385 '''
bc2132dfc0a4 alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents: 21961
diff changeset
386 # 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
387 # 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
388 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
389 replacemap['$0'] = name
bc2132dfc0a4 alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents: 21961
diff changeset
390 replacemap['$$'] = '$'
bc2132dfc0a4 alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents: 21961
diff changeset
391 replacemap['$@'] = ' '.join(args)
bc2132dfc0a4 alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents: 21961
diff changeset
392 # 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
393 # 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
394 # 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
395 # 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
396 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
397 # escape '\$' for regex
bc2132dfc0a4 alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents: 21961
diff changeset
398 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
399 r = re.compile(regex)
bc2132dfc0a4 alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents: 21961
diff changeset
400 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
401
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
402 class cmdalias(object):
28828
3640c1702c43 help: report source of aliases
timeless <timeless@mozdev.org>
parents: 28821
diff changeset
403 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
404 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
405 self.cmdname = ''
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
406 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
407 self.fn = None
29087
ad1bdea43965 dispatch: defer environment variable resolution in alias commands (BC)
Jun Wu <quark@fb.com>
parents: 28861
diff changeset
408 self.givenargs = []
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
409 self.opts = []
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
410 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
411 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
412 self.unknowncmd = False
28828
3640c1702c43 help: report source of aliases
timeless <timeless@mozdev.org>
parents: 28821
diff changeset
413 self.source = source
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
414
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
415 try:
12039
18e1e7520b67 alias: make shadowing behavior more consistent (issue2054)
Brodie Rao <brodie@bitheap.org>
parents: 11712
diff changeset
416 aliases, entry = cmdutil.findcmd(self.name, cmdtable)
18e1e7520b67 alias: make shadowing behavior more consistent (issue2054)
Brodie Rao <brodie@bitheap.org>
parents: 11712
diff changeset
417 for alias, e in cmdtable.iteritems():
18e1e7520b67 alias: make shadowing behavior more consistent (issue2054)
Brodie Rao <brodie@bitheap.org>
parents: 11712
diff changeset
418 if e is entry:
18e1e7520b67 alias: make shadowing behavior more consistent (issue2054)
Brodie Rao <brodie@bitheap.org>
parents: 11712
diff changeset
419 self.cmd = alias
18e1e7520b67 alias: make shadowing behavior more consistent (issue2054)
Brodie Rao <brodie@bitheap.org>
parents: 11712
diff changeset
420 break
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
421 self.shadows = True
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
422 except error.UnknownCommand:
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
423 self.shadows = False
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
424
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
425 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
426 self.badalias = _("no definition for alias '%s'") % self.name
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
427 return
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
428
11524
24965bb270b7 dispatch: add shell aliases
Steve Losh <steve@stevelosh.com>
parents: 11495
diff changeset
429 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
430 self.shell = True
11524
24965bb270b7 dispatch: add shell aliases
Steve Losh <steve@stevelosh.com>
parents: 11495
diff changeset
431 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
432 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
433 def _checkvar(m):
13392
777cef34a890 dispatch: support for $ escaping in shell-alias definition
Roman Sokolov <sokolov.r.v@gmail.com>
parents: 13382
diff changeset
434 if m.groups()[0] == '$':
777cef34a890 dispatch: support for $ escaping in shell-alias definition
Roman Sokolov <sokolov.r.v@gmail.com>
parents: 13382
diff changeset
435 return m.group()
777cef34a890 dispatch: support for $ escaping in shell-alias definition
Roman Sokolov <sokolov.r.v@gmail.com>
parents: 13382
diff changeset
436 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
437 return m.group()
f853873fc66d aliases: provide more flexible ways to work with shell alias arguments
Steve Losh <steve@stevelosh.com>
parents: 11985
diff changeset
438 else:
14708
8083f4d00bd1 i18n: remove translation of debug messages
David Soria Parra <dsp@php.net>
parents: 14704
diff changeset
439 ui.debug("No argument found for substitution "
8083f4d00bd1 i18n: remove translation of debug messages
David Soria Parra <dsp@php.net>
parents: 14704
diff changeset
440 "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
441 % (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
442 return ''
13392
777cef34a890 dispatch: support for $ escaping in shell-alias definition
Roman Sokolov <sokolov.r.v@gmail.com>
parents: 13382
diff changeset
443 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
444 cmd = aliasinterpolate(self.name, args, cmd)
31199
3a03264de3eb dispatch: set a blockedtag when running an external alias
Simon Farnsworth <simonfar@fb.com>
parents: 31180
diff changeset
445 return ui.system(cmd, environ=env,
3a03264de3eb dispatch: set a blockedtag when running an external alias
Simon Farnsworth <simonfar@fb.com>
parents: 31180
diff changeset
446 blockedtag='alias_%s' % self.name)
11524
24965bb270b7 dispatch: add shell aliases
Steve Losh <steve@stevelosh.com>
parents: 11495
diff changeset
447 self.fn = fn
24965bb270b7 dispatch: add shell aliases
Steve Losh <steve@stevelosh.com>
parents: 11495
diff changeset
448 return
24965bb270b7 dispatch: add shell aliases
Steve Losh <steve@stevelosh.com>
parents: 11495
diff changeset
449
21569
c5afb07c33d3 alias: handle shlex error in command aliases
Yuya Nishihara <yuya@tcha.org>
parents: 21556
diff changeset
450 try:
30678
caf7e1c5efe4 py3: have a bytes version of shlex.split()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30653
diff changeset
451 args = pycompat.shlexsplit(self.definition)
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25329
diff changeset
452 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
453 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
454 % (self.name, inst))
21569
c5afb07c33d3 alias: handle shlex error in command aliases
Yuya Nishihara <yuya@tcha.org>
parents: 21556
diff changeset
455 return
12092
4982fa38e544 alias: print what command is being shadowed in debug message
Brodie Rao <brodie@bitheap.org>
parents: 12070
diff changeset
456 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
457 self.givenargs = args
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
458
18693
633cd0c46e6a dispatch: also a separate warning message on aliases with --config
Simon Heimberg <simohe@besonet.ch>
parents: 18691
diff changeset
459 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
460 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
461 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
462 "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
463 % (self.name, invalidarg))
11695
ee8f36a6c766 alias: improved diagnostic when arguments include --cwd, etc.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11681
diff changeset
464 return
ee8f36a6c766 alias: improved diagnostic when arguments include --cwd, etc.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 11681
diff changeset
465
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
466 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
467 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
468 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
469 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
470 else:
8bce1e0d2801 alias: do not crash when aliased command has no usage help text
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 9825
diff changeset
471 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
472
9876
6e8a16dd3e30 alias: improve help text for command aliases
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 9875
diff changeset
473 if self.help.startswith("hg " + cmd):
6e8a16dd3e30 alias: improve help text for command aliases
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 9875
diff changeset
474 # 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
475 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
476 self.__doc__ = self.fn.__doc__
9876
6e8a16dd3e30 alias: improve help text for command aliases
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 9875
diff changeset
477
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
478 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
479 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
480 % (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
481 self.unknowncmd = True
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
482 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
483 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
484 % (self.name, cmd))
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
485
29087
ad1bdea43965 dispatch: defer environment variable resolution in alias commands (BC)
Jun Wu <quark@fb.com>
parents: 28861
diff changeset
486 @property
ad1bdea43965 dispatch: defer environment variable resolution in alias commands (BC)
Jun Wu <quark@fb.com>
parents: 28861
diff changeset
487 def args(self):
31629
2632df096fc0 dispatch: use pycompat.maplist() instead of map() to get a list
Pulkit Goyal <7895pulkit@gmail.com>
parents: 31502
diff changeset
488 args = pycompat.maplist(util.expandpath, self.givenargs)
29087
ad1bdea43965 dispatch: defer environment variable resolution in alias commands (BC)
Jun Wu <quark@fb.com>
parents: 28861
diff changeset
489 return aliasargs(self.fn, args)
ad1bdea43965 dispatch: defer environment variable resolution in alias commands (BC)
Jun Wu <quark@fb.com>
parents: 28861
diff changeset
490
28621
d856e85a8a7a dispatch: make cmdalias forward command attributes to function
Yuya Nishihara <yuya@tcha.org>
parents: 28538
diff changeset
491 def __getattr__(self, name):
32158
89153b0d4881 py3: make adefaults keys str to be compatible with getattr
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32130
diff changeset
492 adefaults = {r'norepo': True,
89153b0d4881 py3: make adefaults keys str to be compatible with getattr
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32130
diff changeset
493 r'optionalrepo': False, r'inferrepo': False}
28621
d856e85a8a7a dispatch: make cmdalias forward command attributes to function
Yuya Nishihara <yuya@tcha.org>
parents: 28538
diff changeset
494 if name not in adefaults:
d856e85a8a7a dispatch: make cmdalias forward command attributes to function
Yuya Nishihara <yuya@tcha.org>
parents: 28538
diff changeset
495 raise AttributeError(name)
d856e85a8a7a dispatch: make cmdalias forward command attributes to function
Yuya Nishihara <yuya@tcha.org>
parents: 28538
diff changeset
496 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
497 return adefaults[name]
d856e85a8a7a dispatch: make cmdalias forward command attributes to function
Yuya Nishihara <yuya@tcha.org>
parents: 28538
diff changeset
498 return getattr(self.fn, name)
d856e85a8a7a dispatch: make cmdalias forward command attributes to function
Yuya Nishihara <yuya@tcha.org>
parents: 28538
diff changeset
499
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
500 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
501 if self.badalias:
22164
efd65e51bc0b alias: exit from bad definition by Abort
Yuya Nishihara <yuya@tcha.org>
parents: 22163
diff changeset
502 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
503 if self.unknowncmd:
10364
de1e7099d100 dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents: 10282
diff changeset
504 try:
de1e7099d100 dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents: 10282
diff changeset
505 # 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
506 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
507 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
508 except error.UnknownCommand:
de1e7099d100 dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents: 10282
diff changeset
509 pass
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26421
diff changeset
510 raise error.Abort(self.badalias, hint=hint)
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
511 if self.shadows:
14704
b24d596fcd25 Backed out changeset 1ec8bd909ac3
Martin Geisler <mg@aragost.com>
parents: 14702
diff changeset
512 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
513 (self.name, self.cmdname))
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
514
29846
318e2b600b80 blackbox: also log alias expansions
Augie Fackler <augie@google.com>
parents: 29841
diff changeset
515 ui.log('commandalias', "alias '%s' expands to '%s'\n",
318e2b600b80 blackbox: also log alias expansions
Augie Fackler <augie@google.com>
parents: 29841
diff changeset
516 self.name, self.definition)
14950
144e97421f6b dispatch: use safehasattr instead of hasattr
Augie Fackler <durin42@gmail.com>
parents: 14918
diff changeset
517 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
518 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
519 else:
12093
cd895084a4cd alias: on --debug, print expansion when it has invalid arguments
Brodie Rao <brodie@bitheap.org>
parents: 12092
diff changeset
520 try:
21556
5e13507a3b4e alias: fix loss of non-zero return code in command aliases
Yuya Nishihara <yuya@tcha.org>
parents: 20829
diff changeset
521 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
522 except error.SignatureError:
cd895084a4cd alias: on --debug, print expansion when it has invalid arguments
Brodie Rao <brodie@bitheap.org>
parents: 12092
diff changeset
523 args = ' '.join([self.cmdname] + self.args)
14704
b24d596fcd25 Backed out changeset 1ec8bd909ac3
Martin Geisler <mg@aragost.com>
parents: 14702
diff changeset
524 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
525 raise
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
526
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
527 def addaliases(ui, cmdtable):
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
528 # aliases are processed after extensions have been loaded, so they
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
529 # 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
530 # 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
531 for alias, definition in ui.configitems('alias'):
28828
3640c1702c43 help: report source of aliases
timeless <timeless@mozdev.org>
parents: 28821
diff changeset
532 source = ui.configsource('alias', alias)
3640c1702c43 help: report source of aliases
timeless <timeless@mozdev.org>
parents: 28821
diff changeset
533 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
534
f4b7be3f8430 dispatch: don't rewrap aliases that have the same definition
Idan Kamara <idankk86@gmail.com>
parents: 14992
diff changeset
535 try:
f4b7be3f8430 dispatch: don't rewrap aliases that have the same definition
Idan Kamara <idankk86@gmail.com>
parents: 14992
diff changeset
536 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
537 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
538 continue
f4b7be3f8430 dispatch: don't rewrap aliases that have the same definition
Idan Kamara <idankk86@gmail.com>
parents: 14992
diff changeset
539 except (KeyError, AttributeError):
f4b7be3f8430 dispatch: don't rewrap aliases that have the same definition
Idan Kamara <idankk86@gmail.com>
parents: 14992
diff changeset
540 # 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
541 pass
f4b7be3f8430 dispatch: don't rewrap aliases that have the same definition
Idan Kamara <idankk86@gmail.com>
parents: 14992
diff changeset
542
15233
81c97964d123 alias: don't shadow commands that we only partially matched (issue2993) (BC)
Augie Fackler <durin42@gmail.com>
parents: 15027
diff changeset
543 cmdtable[aliasdef.name] = (aliasdef, aliasdef.opts, aliasdef.help)
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
544
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
545 def _parse(ui, args):
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
546 options = {}
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
547 cmdoptions = {}
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
548
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
549 try:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
550 args = fancyopts.fancyopts(args, commands.globalopts, options)
30576
541949a10a68 fancyopts: switch from fancyopts.getopt.* to getopt.*
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30559
diff changeset
551 except getopt.GetoptError as inst:
11287
b901bb751999 error: change ParseError to CommandError
Matt Mackall <mpm@selenic.com>
parents: 11209
diff changeset
552 raise error.CommandError(None, inst)
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
553
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
554 if args:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
555 cmd, args = args[0], args[1:]
9875
d6a95c5f6ff9 dispatch: minor refactoring
Henri Wiechers <hwiechers@gmail.com>
parents: 9825
diff changeset
556 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
557 ui.configbool("ui", "strict"))
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
558 cmd = aliases[0]
14265
e4ab5ae193f2 add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents: 14096
diff changeset
559 args = aliasargs(entry[0], args)
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
560 defaults = ui.config("defaults", cmd)
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
561 if defaults:
31502
9916b3d579a9 dispatch: use pycompat.maplist to allow summing with args
Augie Fackler <augie@google.com>
parents: 31500
diff changeset
562 args = pycompat.maplist(
9916b3d579a9 dispatch: use pycompat.maplist to allow summing with args
Augie Fackler <augie@google.com>
parents: 31500
diff changeset
563 util.expandpath, pycompat.shlexsplit(defaults)) + args
9875
d6a95c5f6ff9 dispatch: minor refactoring
Henri Wiechers <hwiechers@gmail.com>
parents: 9825
diff changeset
564 c = list(entry[1])
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
565 else:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
566 cmd = None
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
567 c = []
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
568
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
569 # combine global options into local
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
570 for o in commands.globalopts:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
571 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
572
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
573 try:
29822
61a4cdc98307 dispatch: explicitly pass fancyopts optional arg as a keyword
Augie Fackler <augie@google.com>
parents: 29784
diff changeset
574 args = fancyopts.fancyopts(args, c, cmdoptions, gnu=True)
30576
541949a10a68 fancyopts: switch from fancyopts.getopt.* to getopt.*
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30559
diff changeset
575 except getopt.GetoptError as inst:
11287
b901bb751999 error: change ParseError to CommandError
Matt Mackall <mpm@selenic.com>
parents: 11209
diff changeset
576 raise error.CommandError(cmd, inst)
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
577
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
578 # separate global options back out
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
579 for o in commands.globalopts:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
580 n = o[1]
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
581 options[n] = cmdoptions[n]
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
582 del cmdoptions[n]
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
583
9875
d6a95c5f6ff9 dispatch: minor refactoring
Henri Wiechers <hwiechers@gmail.com>
parents: 9825
diff changeset
584 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
585
8137
7fd0616b3d80 ui: kill updateopts
Matt Mackall <mpm@selenic.com>
parents: 8136
diff changeset
586 def _parseconfig(ui, config):
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
587 """parse the --config options from the command line"""
14753
10dcb3e7cb55 dispatch: return read config options
Idan Kamara <idankk86@gmail.com>
parents: 14752
diff changeset
588 configs = []
10dcb3e7cb55 dispatch: return read config options
Idan Kamara <idankk86@gmail.com>
parents: 14752
diff changeset
589
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
590 for cfg in config:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
591 try:
28081
a6344df5108e dispatch: strip command line options like config file options
Tony Tung <ttung@fb.com>
parents: 27679
diff changeset
592 name, value = [cfgelem.strip()
a6344df5108e dispatch: strip command line options like config file options
Tony Tung <ttung@fb.com>
parents: 27679
diff changeset
593 for cfgelem in cfg.split('=', 1)]
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
594 section, name = name.split('.', 1)
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
595 if not section or not name:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
596 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
597 ui.setconfig(section, name, value, '--config')
14753
10dcb3e7cb55 dispatch: return read config options
Idan Kamara <idankk86@gmail.com>
parents: 14752
diff changeset
598 configs.append((section, name, value))
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
599 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
600 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
601 '(use --config section.name=value)') % cfg)
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
602
14753
10dcb3e7cb55 dispatch: return read config options
Idan Kamara <idankk86@gmail.com>
parents: 14752
diff changeset
603 return configs
10dcb3e7cb55 dispatch: return read config options
Idan Kamara <idankk86@gmail.com>
parents: 14752
diff changeset
604
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
605 def _earlygetopt(aliases, args):
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
606 """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
607
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
608 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
609 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
610
f01ae031f84c dispatch: add doctests for _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents: 19011
diff changeset
611 >>> args = ['x', '--cwd', 'foo', 'y']
f01ae031f84c dispatch: add doctests for _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents: 19011
diff changeset
612 >>> _earlygetopt(['--cwd'], args), args
f01ae031f84c dispatch: add doctests for _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents: 19011
diff changeset
613 (['foo'], ['x', 'y'])
f01ae031f84c dispatch: add doctests for _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents: 19011
diff changeset
614
19099
fc081623f4bd dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents: 19098
diff changeset
615 >>> args = ['x', '--cwd=bar', 'y']
fc081623f4bd dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents: 19098
diff changeset
616 >>> _earlygetopt(['--cwd'], args), args
fc081623f4bd dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents: 19098
diff changeset
617 (['bar'], ['x', 'y'])
fc081623f4bd dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents: 19098
diff changeset
618
19098
f01ae031f84c dispatch: add doctests for _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents: 19011
diff changeset
619 >>> args = ['x', '-R', 'foo', 'y']
f01ae031f84c dispatch: add doctests for _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents: 19011
diff changeset
620 >>> _earlygetopt(['-R'], args), args
f01ae031f84c dispatch: add doctests for _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents: 19011
diff changeset
621 (['foo'], ['x', 'y'])
f01ae031f84c dispatch: add doctests for _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents: 19011
diff changeset
622
f01ae031f84c dispatch: add doctests for _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents: 19011
diff changeset
623 >>> args = ['x', '-Rbar', 'y']
f01ae031f84c dispatch: add doctests for _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents: 19011
diff changeset
624 >>> _earlygetopt(['-R'], args), args
f01ae031f84c dispatch: add doctests for _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents: 19011
diff changeset
625 (['bar'], ['x', 'y'])
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
626 """
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
627 try:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
628 argcount = args.index("--")
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
629 except ValueError:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
630 argcount = len(args)
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
631 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
632 values = []
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
633 pos = 0
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
634 while pos < argcount:
19099
fc081623f4bd dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents: 19098
diff changeset
635 fullarg = arg = args[pos]
fc081623f4bd dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents: 19098
diff changeset
636 equals = arg.find('=')
fc081623f4bd dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents: 19098
diff changeset
637 if equals > -1:
fc081623f4bd dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents: 19098
diff changeset
638 arg = arg[:equals]
fc081623f4bd dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents: 19098
diff changeset
639 if arg in aliases:
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
640 del args[pos]
19099
fc081623f4bd dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents: 19098
diff changeset
641 if equals > -1:
fc081623f4bd dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents: 19098
diff changeset
642 values.append(fullarg[equals + 1:])
fc081623f4bd dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents: 19098
diff changeset
643 argcount -= 1
fc081623f4bd dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents: 19098
diff changeset
644 else:
fc081623f4bd dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents: 19098
diff changeset
645 if pos + 1 >= argcount:
fc081623f4bd dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents: 19098
diff changeset
646 # 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
647 break
fc081623f4bd dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents: 19098
diff changeset
648 values.append(args.pop(pos))
fc081623f4bd dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents: 19098
diff changeset
649 argcount -= 2
fc081623f4bd dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents: 19098
diff changeset
650 elif arg[:2] in shortopts:
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
651 # 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
652 values.append(args.pop(pos)[2:])
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
653 argcount -= 1
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
654 else:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
655 pos += 1
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
656 return values
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
657
11330
713ae78bb583 provide pre- and post- hooks with parsed command line arguments.
Chad Dombrova <chadrik@gmail.com>
parents: 11305
diff changeset
658 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
659 # 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
660 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
661 pats=cmdpats, opts=cmdoptions)
29129
e6dfb0e4eeef dispatch: add fail-* family of hooks
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 29114
diff changeset
662 try:
e6dfb0e4eeef dispatch: add fail-* family of hooks
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 29114
diff changeset
663 ret = _runcommand(ui, options, cmd, d)
e6dfb0e4eeef dispatch: add fail-* family of hooks
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 29114
diff changeset
664 # run post-hook, passing command result
e6dfb0e4eeef dispatch: add fail-* family of hooks
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 29114
diff changeset
665 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
666 result=ret, pats=cmdpats, opts=cmdoptions)
e6dfb0e4eeef dispatch: add fail-* family of hooks
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 29114
diff changeset
667 except Exception:
e6dfb0e4eeef dispatch: add fail-* family of hooks
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 29114
diff changeset
668 # run failure hook and re-raise
e6dfb0e4eeef dispatch: add fail-* family of hooks
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 29114
diff changeset
669 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
670 pats=cmdpats, opts=cmdoptions)
e6dfb0e4eeef dispatch: add fail-* family of hooks
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 29114
diff changeset
671 raise
7819
14b703252f14 dispatch: extract command execution block into method
Bill Barry <after.fallout@gmail.com>
parents: 7772
diff changeset
672 return ret
14b703252f14 dispatch: extract command execution block into method
Bill Barry <after.fallout@gmail.com>
parents: 7772
diff changeset
673
28263
59509c6724c7 dispatch: add wd parameter to _getlocal
Jun Wu <quark@fb.com>
parents: 28081
diff changeset
674 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
675 """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
676
12536
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
677 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
678 """
28263
59509c6724c7 dispatch: add wd parameter to _getlocal
Jun Wu <quark@fb.com>
parents: 28081
diff changeset
679 if wd is None:
59509c6724c7 dispatch: add wd parameter to _getlocal
Jun Wu <quark@fb.com>
parents: 28081
diff changeset
680 try:
30500
fc0cfe6c87d7 py3: add os.getcwdb() to have bytes path
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30485
diff changeset
681 wd = pycompat.getcwd()
28263
59509c6724c7 dispatch: add wd parameter to _getlocal
Jun Wu <quark@fb.com>
parents: 28081
diff changeset
682 except OSError as e:
59509c6724c7 dispatch: add wd parameter to _getlocal
Jun Wu <quark@fb.com>
parents: 28081
diff changeset
683 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
684 e.strerror)
11675
f92f8921a5cc dispatch: give better error message when cwd doesn't exist (issue2293)
Mads Kiilerich <mads@kiilerich.com>
parents: 11600
diff changeset
685 path = cmdutil.findrepo(wd) or ""
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
686 if not path:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
687 lui = ui
9436
96379c93ba6f improve code readability
Andrey Somov <py4fun@gmail.com>
parents: 9411
diff changeset
688 else:
12636
c24215aa7e69 dispatch: remove superfluous try/except when reading local ui config
Brodie Rao <brodie@bitheap.org>
parents: 12633
diff changeset
689 lui = ui.copy()
12637
42ca7aef28d3 dispatch: properly handle relative path aliases used with -R (issue2376)
Brodie Rao <brodie@bitheap.org>
parents: 12636
diff changeset
690 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
691
14860
67add0f24f83 dispatch: fix checking of rpath in _getlocal
Matt Mackall <mpm@selenic.com>
parents: 14761
diff changeset
692 if rpath and rpath[-1]:
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
693 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
694 lui = ui.copy()
12637
42ca7aef28d3 dispatch: properly handle relative path aliases used with -R (issue2376)
Brodie Rao <brodie@bitheap.org>
parents: 12636
diff changeset
695 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
696
12536
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
697 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
698
29132
12769703d4ba dispatch: always load extensions before running shell aliases (issue5230)
Jun Wu <quark@fb.com>
parents: 29129
diff changeset
699 def _checkshellalias(lui, ui, args):
12769703d4ba dispatch: always load extensions before running shell aliases (issue5230)
Jun Wu <quark@fb.com>
parents: 29129
diff changeset
700 """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
701 options = {}
12748
d10369fefd01 alias: fail gracefully when invalid global options are given (issue2442)
Steve Losh <steve@stevelosh.com>
parents: 12637
diff changeset
702
d10369fefd01 alias: fail gracefully when invalid global options are given (issue2442)
Steve Losh <steve@stevelosh.com>
parents: 12637
diff changeset
703 try:
d10369fefd01 alias: fail gracefully when invalid global options are given (issue2442)
Steve Losh <steve@stevelosh.com>
parents: 12637
diff changeset
704 args = fancyopts.fancyopts(args, commands.globalopts, options)
30576
541949a10a68 fancyopts: switch from fancyopts.getopt.* to getopt.*
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30559
diff changeset
705 except getopt.GetoptError:
12748
d10369fefd01 alias: fail gracefully when invalid global options are given (issue2442)
Steve Losh <steve@stevelosh.com>
parents: 12637
diff changeset
706 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
707
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
708 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
709 return
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
710
29132
12769703d4ba dispatch: always load extensions before running shell aliases (issue5230)
Jun Wu <quark@fb.com>
parents: 29129
diff changeset
711 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
712
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
713 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
714 try:
29132
12769703d4ba dispatch: always load extensions before running shell aliases (issue5230)
Jun Wu <quark@fb.com>
parents: 29129
diff changeset
715 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
716 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
717 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
718 return
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
719
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
720 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
721 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
722
14950
144e97421f6b dispatch: use safehasattr instead of hasattr
Augie Fackler <durin42@gmail.com>
parents: 14918
diff changeset
723 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
724 d = lambda: fn(ui, *args[1:])
16683
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 16609
diff changeset
725 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
726 [], {})
12536
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
727
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
728 _loaded = set()
28391
73905484ef70 dispatch: make loading extra information from extension extensible
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28313
diff changeset
729
73905484ef70 dispatch: make loading extra information from extension extensible
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28313
diff changeset
730 # 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
731 # - 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
732 # extra information is loaded
73905484ef70 dispatch: make loading extra information from extension extensible
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28313
diff changeset
733 # - 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
734 # - 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
735 # extraobj) arguments
73905484ef70 dispatch: make loading extra information from extension extensible
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28313
diff changeset
736 extraloaders = [
73905484ef70 dispatch: make loading extra information from extension extensible
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28313
diff changeset
737 ('cmdtable', commands, 'loadcmdtable'),
30653
b2be4ccaff1d color: load 'colortable' from extension using an 'extraloader'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30586
diff changeset
738 ('colortable', color, 'loadcolortable'),
28447
4eb5496c2bd4 registrar: add filesetpredicate to mark a function as fileset predicate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28394
diff changeset
739 ('filesetpredicate', fileset, 'loadpredicate'),
28394
dcb4209bd30d revset: replace extpredicate by revsetpredicate of registrar
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28391
diff changeset
740 ('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
741 ('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
742 ('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
743 ('templatekeyword', templatekw, 'loadkeyword'),
28391
73905484ef70 dispatch: make loading extra information from extension extensible
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28313
diff changeset
744 ]
73905484ef70 dispatch: make loading extra information from extension extensible
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28313
diff changeset
745
14439
80c599eee3f3 dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents: 14438
diff changeset
746 def _dispatch(req):
14438
08bfec2ef031 dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents: 14286
diff changeset
747 args = req.args
14439
80c599eee3f3 dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents: 14438
diff changeset
748 ui = req.ui
80c599eee3f3 dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents: 14438
diff changeset
749
12536
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
750 # 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
751 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
752 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
753 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
754
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
755 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
756 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
757
32291
bd872f64a8ba cleanup: use set literals
Martin von Zweigbergk <martinvonz@google.com>
parents: 32158
diff changeset
758 uis = {ui, lui}
30933
69a3c6c8bf95 dispatch: move detection of profiling earlier during startup
Bryan O'Sullivan <bryano@fb.com>
parents: 30917
diff changeset
759
69a3c6c8bf95 dispatch: move detection of profiling earlier during startup
Bryan O'Sullivan <bryano@fb.com>
parents: 30917
diff changeset
760 if req.repo:
69a3c6c8bf95 dispatch: move detection of profiling earlier during startup
Bryan O'Sullivan <bryano@fb.com>
parents: 30917
diff changeset
761 uis.add(req.repo.ui)
69a3c6c8bf95 dispatch: move detection of profiling earlier during startup
Bryan O'Sullivan <bryano@fb.com>
parents: 30917
diff changeset
762
69a3c6c8bf95 dispatch: move detection of profiling earlier during startup
Bryan O'Sullivan <bryano@fb.com>
parents: 30917
diff changeset
763 if '--profile' in args:
69a3c6c8bf95 dispatch: move detection of profiling earlier during startup
Bryan O'Sullivan <bryano@fb.com>
parents: 30917
diff changeset
764 for ui_ in uis:
69a3c6c8bf95 dispatch: move detection of profiling earlier during startup
Bryan O'Sullivan <bryano@fb.com>
parents: 30917
diff changeset
765 ui_.setconfig('profiling', 'enabled', 'true', '--profile')
69a3c6c8bf95 dispatch: move detection of profiling earlier during startup
Bryan O'Sullivan <bryano@fb.com>
parents: 30917
diff changeset
766
30934
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
767 with profiling.maybeprofile(lui):
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
768 # Configure extensions in phases: uisetup, extsetup, cmdtable, and
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
769 # reposetup. Programs like TortoiseHg will call _dispatch several
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
770 # times so we keep track of configured extensions in _loaded.
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
771 extensions.loadall(lui)
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
772 exts = [ext for ext in extensions.extensions() if ext[0] not in _loaded]
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
773 # Propagate any changes to lui.__class__ by extensions
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
774 ui.__class__ = lui.__class__
5828
863e237b58fb dispatch: allow extensions to provide setup code
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5664
diff changeset
775
30934
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
776 # (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
777
30934
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
778 for name, module in exts:
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
779 for objname, loadermod, loadername in extraloaders:
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
780 extraobj = getattr(module, objname, None)
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
781 if extraobj is not None:
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
782 getattr(loadermod, loadername)(ui, name, extraobj)
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
783 _loaded.add(name)
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
784
30934
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
785 # (reposetup is handled in hg.repository)
9410
1c83938b6a8e extensions: load and configure extensions in well-defined phases
Martin Geisler <mg@lazybytes.net>
parents: 8936
diff changeset
786
30934
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
787 addaliases(lui, commands.table)
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
788
30934
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
789 # All aliases and commands are completely defined, now.
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
790 # Check abbreviation/ambiguity of shell alias.
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
791 shellaliasfn = _checkshellalias(lui, ui, args)
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
792 if shellaliasfn:
30006
b19c2679289c dispatch: make hg --profile wrap reposetup
Arun Kulshreshtha <kulshrax@fb.com>
parents: 30005
diff changeset
793 return shellaliasfn()
22377
f98abe3146b2 dispatch: check shell alias again after loading extensions (issue4355)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 22376
diff changeset
794
30934
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
795 # check for fallback encoding
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
796 fallback = lui.config('ui', 'fallbackencoding')
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
797 if fallback:
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
798 encoding.fallbackencoding = fallback
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
799
30934
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
800 fullargs = args
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
801 cmd, func, args, options, cmdoptions = _parse(lui, args)
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
802
30934
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
803 if options["config"]:
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
804 raise error.Abort(_("option --config may not be abbreviated!"))
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
805 if options["cwd"]:
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
806 raise error.Abort(_("option --cwd may not be abbreviated!"))
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
807 if options["repository"]:
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
808 raise error.Abort(_(
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
809 "option -R has to be separated from other options (e.g. not "
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
810 "-qR) and --repository may only be abbreviated as --repo!"))
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
811
30934
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
812 if options["encoding"]:
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
813 encoding.encoding = options["encoding"]
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
814 if options["encodingmode"]:
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
815 encoding.encodingmode = options["encodingmode"]
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
816 if options["time"]:
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
817 def get_times():
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
818 t = os.times()
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
819 if t[4] == 0.0:
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
820 # Windows leaves this as zero, so use time.clock()
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
821 t = (t[0], t[1], t[2], t[3], time.clock())
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
822 return t
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
823 s = get_times()
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
824 def print_time():
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
825 t = get_times()
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
826 ui.warn(
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
827 _("time: real %.3f secs (user %.3f+%.3f sys %.3f+%.3f)\n") %
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
828 (t[4]-s[4], t[0]-s[0], t[2]-s[2], t[1]-s[1], t[3]-s[3]))
31958
de5c9d0e02ea atexit: switch to home-grown implementation
Bryan O'Sullivan <bryano@fb.com>
parents: 31956
diff changeset
829 ui.atexit(print_time)
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
830
30934
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
831 if options['verbose'] or options['debug'] or options['quiet']:
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
832 for opt in ('verbose', 'debug', 'quiet'):
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
833 val = str(bool(options[opt]))
31305
dc9842a7017c dispatch: enforce bytes when converting boolean flags to config items
Augie Fackler <raf@durin42.com>
parents: 31266
diff changeset
834 if pycompat.ispy3:
dc9842a7017c dispatch: enforce bytes when converting boolean flags to config items
Augie Fackler <raf@durin42.com>
parents: 31266
diff changeset
835 val = val.encode('ascii')
30934
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
836 for ui_ in uis:
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
837 ui_.setconfig('ui', opt, val, '--' + opt)
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
838
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
839 if options['traceback']:
14752
99ace3cb7352 dispatch: set global options on the request repo.ui
Idan Kamara <idankk86@gmail.com>
parents: 14748
diff changeset
840 for ui_ in uis:
30934
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
841 ui_.setconfig('ui', 'traceback', 'on', '--traceback')
14992
188936b334b1 dispatch: make sure global options on the command line take precedence
Idan Kamara <idankk86@gmail.com>
parents: 14914
diff changeset
842
30934
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
843 if options['noninteractive']:
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
844 for ui_ in uis:
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
845 ui_.setconfig('ui', 'interactive', 'off', '-y')
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
846
30934
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
847 if cmdoptions.get('insecure', False):
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
848 for ui_ in uis:
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
849 ui_.insecureconnections = True
13328
a939f08fae9c url: add --insecure option to bypass verification of ssl certificates
Yuya Nishihara <yuya@tcha.org>
parents: 12932
diff changeset
850
32383
f928d53b687c dispatch: setup color before pager for correct console information on windows
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32054
diff changeset
851 # setup color handling before pager, because setting up pager
f928d53b687c dispatch: setup color before pager for correct console information on windows
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32054
diff changeset
852 # might cause incorrect console information
31110
7fec37746417 color: add a 'ui.color' option to control color behavior
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31105
diff changeset
853 coloropt = options['color']
31105
45be7590301d color: move triggering of the initialisation logic in core
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31060
diff changeset
854 for ui_ in uis:
31110
7fec37746417 color: add a 'ui.color' option to control color behavior
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31105
diff changeset
855 if coloropt:
7fec37746417 color: add a 'ui.color' option to control color behavior
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31105
diff changeset
856 ui_.setconfig('ui', 'color', coloropt, '--color')
7fec37746417 color: add a 'ui.color' option to control color behavior
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31105
diff changeset
857 color.setup(ui_)
31105
45be7590301d color: move triggering of the initialisation logic in core
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 31060
diff changeset
858
32383
f928d53b687c dispatch: setup color before pager for correct console information on windows
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32054
diff changeset
859 if util.parsebool(options['pager']):
f928d53b687c dispatch: setup color before pager for correct console information on windows
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32054
diff changeset
860 ui.pager('internal-always-' + cmd)
f928d53b687c dispatch: setup color before pager for correct console information on windows
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32054
diff changeset
861 elif options['pager'] != 'auto':
f928d53b687c dispatch: setup color before pager for correct console information on windows
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32054
diff changeset
862 ui.disablepager()
f928d53b687c dispatch: setup color before pager for correct console information on windows
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32054
diff changeset
863
30934
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
864 if options['version']:
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
865 return commands.version_(ui)
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
866 if options['help']:
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
867 return commands.help_(ui, cmd, command=cmd is not None)
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
868 elif not cmd:
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
869 return commands.help_(ui, 'shortlist')
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
870
30005
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
871 repo = None
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
872 cmdpats = args[:]
30485
acd30a959980 dispatch: stop supporting non-use of @command
Augie Fackler <augie@google.com>
parents: 30473
diff changeset
873 if not func.norepo:
30005
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
874 # 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
875 if not rpath and not cwd:
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
876 repo = req.repo
14510
eccbb9980ada dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents: 14439
diff changeset
877
30005
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
878 if repo:
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
879 # 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
880 repo.ui.fin = ui.fin
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
881 repo.ui.fout = ui.fout
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
882 repo.ui.ferr = ui.ferr
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
883 else:
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
884 try:
32379
71e735bd8170 dispatch: make request accept additional reposetups
Jun Wu <quark@fb.com>
parents: 32377
diff changeset
885 repo = hg.repository(ui, path=path,
71e735bd8170 dispatch: make request accept additional reposetups
Jun Wu <quark@fb.com>
parents: 32377
diff changeset
886 presetupfuncs=req.prereposetups)
30005
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
887 if not repo.local():
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
888 raise error.Abort(_("repository '%s' is not local")
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
889 % path)
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
890 repo.ui.setconfig("bundle", "mainreporoot", repo.root,
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
891 'repo')
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
892 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
893 raise
30005
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
894 except error.RepoError:
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
895 if rpath and rpath[-1]: # invalid -R path
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
896 raise
30485
acd30a959980 dispatch: stop supporting non-use of @command
Augie Fackler <augie@google.com>
parents: 30473
diff changeset
897 if not func.optionalrepo:
acd30a959980 dispatch: stop supporting non-use of @command
Augie Fackler <augie@google.com>
parents: 30473
diff changeset
898 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
899 # try to infer -R from command args
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
900 repos = map(cmdutil.findrepo, args)
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
901 guess = repos[0]
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
902 if guess and repos.count(guess) == len(repos):
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
903 req.args = ['--repository', guess] + fullargs
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
904 return _dispatch(req)
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
905 if not path:
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
906 raise error.RepoError(_("no repository found in"
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
907 " '%s' (.hg not found)")
30519
20a42325fdef py3: use pycompat.getcwd() instead of os.getcwd()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30500
diff changeset
908 % pycompat.getcwd())
30005
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
909 raise
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
910 if repo:
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
911 ui = repo.ui
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
912 if options['hidden']:
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
913 repo = repo.unfiltered()
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
914 args.insert(0, repo)
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
915 elif rpath:
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
916 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
917
31492
3c77414a0f9c dispatch: consolidate formatting of arguments
Augie Fackler <augie@google.com>
parents: 31491
diff changeset
918 msg = _formatargs(fullargs)
30005
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
919 ui.log("command", '%s\n', msg)
30586
2d555d753f0e py3: make keys of keyword arguments strings
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30576
diff changeset
920 strcmdopt = pycompat.strkwargs(cmdoptions)
2d555d753f0e py3: make keys of keyword arguments strings
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30576
diff changeset
921 d = lambda: util.checksignature(func)(ui, *args, **strcmdopt)
30005
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
922 try:
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
923 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
924 cmdpats, cmdoptions)
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
925 finally:
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
926 if repo and repo != req.repo:
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
927 repo.close()
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
928
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
929 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
930 """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
931 try:
b19c2679289c dispatch: make hg --profile wrap reposetup
Arun Kulshreshtha <kulshrax@fb.com>
parents: 30005
diff changeset
932 return cmdfunc()
b19c2679289c dispatch: make hg --profile wrap reposetup
Arun Kulshreshtha <kulshrax@fb.com>
parents: 30005
diff changeset
933 except error.SignatureError:
b19c2679289c dispatch: make hg --profile wrap reposetup
Arun Kulshreshtha <kulshrax@fb.com>
parents: 30005
diff changeset
934 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
935
28821
d3369dc6c1d0 dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents: 28784
diff changeset
936 def _exceptionwarning(ui):
d3369dc6c1d0 dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents: 28784
diff changeset
937 """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
938
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
939 # 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
940 # 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
941 # 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
942 # 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
943 # '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
944 # 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
945 # version number and try updating.
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
946 ct = util.versiontuple(n=2)
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
947 worst = None, ct, ''
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
948 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
949 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
950 testedwith = getattr(mod, 'testedwith', '')
31179
49ad6bf63107 dispatch: allow testedwith to be bytes or str
Augie Fackler <raf@durin42.com>
parents: 31110
diff changeset
951 if pycompat.ispy3 and isinstance(testedwith, str):
49ad6bf63107 dispatch: allow testedwith to be bytes or str
Augie Fackler <raf@durin42.com>
parents: 31110
diff changeset
952 testedwith = testedwith.encode(u'utf-8')
28784
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
953 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
954 if not testedwith.strip():
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
955 # 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
956 worst = name, 'unknown', report
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
957 break
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
958
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
959 # Never blame on extensions bundled with Mercurial.
29884
ed793f41e83f extensions: use ismoduleinternal() thoroughly
Yuya Nishihara <yuya@tcha.org>
parents: 29846
diff changeset
960 if extensions.ismoduleinternal(mod):
28784
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
961 continue
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
962
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
963 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
964 if ct in tested:
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
965 continue
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
966
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
967 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
968 nearest = max(lower or tested)
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
969 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
970 worst = name, nearest, report
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
971 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
972 name, testedwith, report = worst
31179
49ad6bf63107 dispatch: allow testedwith to be bytes or str
Augie Fackler <raf@durin42.com>
parents: 31110
diff changeset
973 if not isinstance(testedwith, (bytes, str)):
28784
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
974 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
975 warning = (_('** Unknown exception encountered with '
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
976 '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
977 '** 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
978 '** 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
979 '** 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
980 % (name, testedwith, name, report))
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
981 else:
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
982 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
983 if bugtracker is None:
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
984 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
985 warning = (_("** unknown exception encountered, "
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
986 "please report by visiting\n** ") + bugtracker + '\n')
31180
27e3b66ec7c5 dispatch: cope with sys.version being unicode on Python 3
Augie Fackler <raf@durin42.com>
parents: 31179
diff changeset
987 if pycompat.ispy3:
27e3b66ec7c5 dispatch: cope with sys.version being unicode on Python 3
Augie Fackler <raf@durin42.com>
parents: 31179
diff changeset
988 sysversion = sys.version.encode(u'utf-8')
27e3b66ec7c5 dispatch: cope with sys.version being unicode on Python 3
Augie Fackler <raf@durin42.com>
parents: 31179
diff changeset
989 else:
27e3b66ec7c5 dispatch: cope with sys.version being unicode on Python 3
Augie Fackler <raf@durin42.com>
parents: 31179
diff changeset
990 sysversion = sys.version
27e3b66ec7c5 dispatch: cope with sys.version being unicode on Python 3
Augie Fackler <raf@durin42.com>
parents: 31179
diff changeset
991 sysversion = sysversion.replace('\n', '')
27e3b66ec7c5 dispatch: cope with sys.version being unicode on Python 3
Augie Fackler <raf@durin42.com>
parents: 31179
diff changeset
992 warning += ((_("** Python %s\n") % sysversion) +
28784
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
993 (_("** 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
994 util.version()) +
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
995 (_("** Extensions loaded: %s\n") %
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
996 ", ".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
997 return warning
d3369dc6c1d0 dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents: 28784
diff changeset
998
d3369dc6c1d0 dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents: 28784
diff changeset
999 def handlecommandexception(ui):
d3369dc6c1d0 dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents: 28784
diff changeset
1000 """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
1001
d3369dc6c1d0 dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents: 28784
diff changeset
1002 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
1003 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
1004 """
d3369dc6c1d0 dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents: 28784
diff changeset
1005 warning = _exceptionwarning(ui)
28784
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
1006 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
1007 ui.warn(warning)
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
1008 return False # re-raise the exception