annotate mercurial/dispatch.py @ 36814:f9078c6caeb6

hgweb: parse and store HTTP request headers WSGI transmits HTTP request headers as HTTP_* environment variables. We teach our parser about these and hook up a dict-like data structure that supports case insensitive header manipulation. Differential Revision: https://phab.mercurial-scm.org/D2742
author Gregory Szorc <gregory.szorc@gmail.com>
date Thu, 08 Mar 2018 16:22:25 -0800
parents 389b950f5190
children f0b6fbea00cf
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,
31060
ab20491b1760 dispatch: rearrange 'unknown command' code to better employ pager
Augie Fackler <augie@google.com>
parents: 31027
diff changeset
33 help,
25932
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
34 hg,
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
35 hook,
29781
2654a0aac80d profiling: move profiling code from dispatch.py (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29761
diff changeset
36 profiling,
30468
7f2b18c34c02 py3: use pycompat.sysargv in dispatch.run()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30401
diff changeset
37 pycompat,
34781
fe987d0b9e1e registrar: add support for storing the type of command in func object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34638
diff changeset
38 registrar,
30520
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30519
diff changeset
39 scmutil,
25932
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
40 ui as uimod,
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
41 util,
d491f289045f dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25834
diff changeset
42 )
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
43
34781
fe987d0b9e1e registrar: add support for storing the type of command in func object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34638
diff changeset
44 unrecoverablewrite = registrar.command.unrecoverablewrite
fe987d0b9e1e registrar: add support for storing the type of command in func object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34638
diff changeset
45
14438
08bfec2ef031 dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents: 14286
diff changeset
46 class request(object):
16683
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 16609
diff changeset
47 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
48 ferr=None, prereposetups=None):
14438
08bfec2ef031 dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents: 14286
diff changeset
49 self.args = args
14439
80c599eee3f3 dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents: 14438
diff changeset
50 self.ui = ui
14510
eccbb9980ada dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents: 14439
diff changeset
51 self.repo = repo
14438
08bfec2ef031 dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents: 14286
diff changeset
52
14613
ea8938d3a5aa dispatch: add I/O descriptors to the request
Idan Kamara <idankk86@gmail.com>
parents: 14601
diff changeset
53 # input/output/error streams
ea8938d3a5aa dispatch: add I/O descriptors to the request
Idan Kamara <idankk86@gmail.com>
parents: 14601
diff changeset
54 self.fin = fin
ea8938d3a5aa dispatch: add I/O descriptors to the request
Idan Kamara <idankk86@gmail.com>
parents: 14601
diff changeset
55 self.fout = fout
ea8938d3a5aa dispatch: add I/O descriptors to the request
Idan Kamara <idankk86@gmail.com>
parents: 14601
diff changeset
56 self.ferr = ferr
ea8938d3a5aa dispatch: add I/O descriptors to the request
Idan Kamara <idankk86@gmail.com>
parents: 14601
diff changeset
57
35224
6e6d0a5b88e6 dispatch: replace _earlyreq*() with new fancyopts-based parser
Yuya Nishihara <yuya@tcha.org>
parents: 35223
diff changeset
58 # remember options pre-parsed by _earlyparseopts()
35030
d9aba3730d30 dispatch: abort if early boolean options can't be parsed
Yuya Nishihara <yuya@tcha.org>
parents: 35029
diff changeset
59 self.earlyoptions = {}
d9aba3730d30 dispatch: abort if early boolean options can't be parsed
Yuya Nishihara <yuya@tcha.org>
parents: 35029
diff changeset
60
32379
71e735bd8170 dispatch: make request accept additional reposetups
Jun Wu <quark@fb.com>
parents: 32377
diff changeset
61 # 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
62 # 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
63 self.prereposetups = prereposetups or []
71e735bd8170 dispatch: make request accept additional reposetups
Jun Wu <quark@fb.com>
parents: 32377
diff changeset
64
31956
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31629
diff changeset
65 def _runexithandlers(self):
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31629
diff changeset
66 exc = None
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31629
diff changeset
67 handlers = self.ui._exithandlers
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31629
diff changeset
68 try:
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31629
diff changeset
69 while handlers:
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31629
diff changeset
70 func, args, kwargs = handlers.pop()
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31629
diff changeset
71 try:
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31629
diff changeset
72 func(*args, **kwargs)
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31629
diff changeset
73 except: # re-raises below
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31629
diff changeset
74 if exc is None:
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31629
diff changeset
75 exc = sys.exc_info()[1]
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31629
diff changeset
76 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
77 self.ui.traceback(force=True)
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31629
diff changeset
78 finally:
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31629
diff changeset
79 if exc is not None:
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31629
diff changeset
80 raise exc
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31629
diff changeset
81
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
82 def run():
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
83 "run the command in sys.argv"
34533
163fa0aea71e dispatch: move initialization of sys.std* files
Yuya Nishihara <yuya@tcha.org>
parents: 34532
diff changeset
84 _initstdio()
31960
71dcd4a4fa2f stdio: catch StdioError in dispatch.run and clean up appropriately
Bryan O'Sullivan <bryano@fb.com>
parents: 31958
diff changeset
85 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
86 err = None
71dcd4a4fa2f stdio: catch StdioError in dispatch.run and clean up appropriately
Bryan O'Sullivan <bryano@fb.com>
parents: 31958
diff changeset
87 try:
36682
68328202f270 dispatch: don't clamp the range of the exit code twice
Kevin Bullock <kbullock+mercurial@ringworld.org>
parents: 36641
diff changeset
88 status = (dispatch(req) or 0)
34532
b09b3eaf9c96 py3: work around the scope of exception variable in dispatch.run()
Yuya Nishihara <yuya@tcha.org>
parents: 34486
diff changeset
89 except error.StdioError as e:
b09b3eaf9c96 py3: work around the scope of exception variable in dispatch.run()
Yuya Nishihara <yuya@tcha.org>
parents: 34486
diff changeset
90 err = e
31960
71dcd4a4fa2f stdio: catch StdioError in dispatch.run and clean up appropriately
Bryan O'Sullivan <bryano@fb.com>
parents: 31958
diff changeset
91 status = -1
71dcd4a4fa2f stdio: catch StdioError in dispatch.run and clean up appropriately
Bryan O'Sullivan <bryano@fb.com>
parents: 31958
diff changeset
92 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
93 try:
32687
12941a782928 dispatch: do not close stdout and stderr, just flush() instead
Yuya Nishihara <yuya@tcha.org>
parents: 32652
diff changeset
94 req.ui.fout.flush()
34532
b09b3eaf9c96 py3: work around the scope of exception variable in dispatch.run()
Yuya Nishihara <yuya@tcha.org>
parents: 34486
diff changeset
95 except IOError as e:
b09b3eaf9c96 py3: work around the scope of exception variable in dispatch.run()
Yuya Nishihara <yuya@tcha.org>
parents: 34486
diff changeset
96 err = e
31960
71dcd4a4fa2f stdio: catch StdioError in dispatch.run and clean up appropriately
Bryan O'Sullivan <bryano@fb.com>
parents: 31958
diff changeset
97 status = -1
71dcd4a4fa2f stdio: catch StdioError in dispatch.run and clean up appropriately
Bryan O'Sullivan <bryano@fb.com>
parents: 31958
diff changeset
98 if util.safehasattr(req.ui, 'ferr'):
35653
48fe4f56a3b4 dispatch: handle IOError when writing to stderr
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35466
diff changeset
99 try:
48fe4f56a3b4 dispatch: handle IOError when writing to stderr
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35466
diff changeset
100 if err is not None and err.errno != errno.EPIPE:
48fe4f56a3b4 dispatch: handle IOError when writing to stderr
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35466
diff changeset
101 req.ui.ferr.write('abort: %s\n' %
48fe4f56a3b4 dispatch: handle IOError when writing to stderr
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35466
diff changeset
102 encoding.strtolocal(err.strerror))
48fe4f56a3b4 dispatch: handle IOError when writing to stderr
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35466
diff changeset
103 req.ui.ferr.flush()
48fe4f56a3b4 dispatch: handle IOError when writing to stderr
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35466
diff changeset
104 # There's not much we can do about an I/O error here. So (possibly)
48fe4f56a3b4 dispatch: handle IOError when writing to stderr
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35466
diff changeset
105 # change the status code and move on.
48fe4f56a3b4 dispatch: handle IOError when writing to stderr
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35466
diff changeset
106 except IOError:
48fe4f56a3b4 dispatch: handle IOError when writing to stderr
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35466
diff changeset
107 status = -1
36637
e8c361316803 py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents: 36636
diff changeset
108
e8c361316803 py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents: 36636
diff changeset
109 _silencestdio()
31960
71dcd4a4fa2f stdio: catch StdioError in dispatch.run and clean up appropriately
Bryan O'Sullivan <bryano@fb.com>
parents: 31958
diff changeset
110 sys.exit(status & 255)
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
111
36636
c263c684da91 py3: conditionalize initialization of stdio flags
Yuya Nishihara <yuya@tcha.org>
parents: 36503
diff changeset
112 if pycompat.ispy3:
c263c684da91 py3: conditionalize initialization of stdio flags
Yuya Nishihara <yuya@tcha.org>
parents: 36503
diff changeset
113 def _initstdio():
c263c684da91 py3: conditionalize initialization of stdio flags
Yuya Nishihara <yuya@tcha.org>
parents: 36503
diff changeset
114 pass
36637
e8c361316803 py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents: 36636
diff changeset
115
e8c361316803 py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents: 36636
diff changeset
116 def _silencestdio():
e8c361316803 py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents: 36636
diff changeset
117 for fp in (sys.stdout, sys.stderr):
e8c361316803 py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents: 36636
diff changeset
118 # Check if the file is okay
e8c361316803 py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents: 36636
diff changeset
119 try:
e8c361316803 py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents: 36636
diff changeset
120 fp.flush()
e8c361316803 py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents: 36636
diff changeset
121 continue
e8c361316803 py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents: 36636
diff changeset
122 except IOError:
e8c361316803 py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents: 36636
diff changeset
123 pass
e8c361316803 py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents: 36636
diff changeset
124 # Otherwise mark it as closed to silence "Exception ignored in"
e8c361316803 py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents: 36636
diff changeset
125 # message emitted by the interpreter finalizer. Be careful to
e8c361316803 py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents: 36636
diff changeset
126 # not close util.stdout, which may be a fdopen-ed file object and
e8c361316803 py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents: 36636
diff changeset
127 # its close() actually closes the underlying file descriptor.
e8c361316803 py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents: 36636
diff changeset
128 try:
e8c361316803 py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents: 36636
diff changeset
129 fp.close()
e8c361316803 py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents: 36636
diff changeset
130 except IOError:
e8c361316803 py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents: 36636
diff changeset
131 pass
36636
c263c684da91 py3: conditionalize initialization of stdio flags
Yuya Nishihara <yuya@tcha.org>
parents: 36503
diff changeset
132 else:
c263c684da91 py3: conditionalize initialization of stdio flags
Yuya Nishihara <yuya@tcha.org>
parents: 36503
diff changeset
133 def _initstdio():
c263c684da91 py3: conditionalize initialization of stdio flags
Yuya Nishihara <yuya@tcha.org>
parents: 36503
diff changeset
134 for fp in (sys.stdin, sys.stdout, sys.stderr):
c263c684da91 py3: conditionalize initialization of stdio flags
Yuya Nishihara <yuya@tcha.org>
parents: 36503
diff changeset
135 util.setbinary(fp)
34533
163fa0aea71e dispatch: move initialization of sys.std* files
Yuya Nishihara <yuya@tcha.org>
parents: 34532
diff changeset
136
36637
e8c361316803 py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents: 36636
diff changeset
137 def _silencestdio():
e8c361316803 py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents: 36636
diff changeset
138 pass
e8c361316803 py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents: 36636
diff changeset
139
24221
4e240d6ab898 dispatch: offer near-edit-distance suggestions for {file,rev}set functions
Augie Fackler <augie@google.com>
parents: 24163
diff changeset
140 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
141 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
142 # 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
143 # 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
144 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
145
27623
b3376fba4ab9 dispatch: report similar names consistently
Bryan O'Sullivan <bos@serpentine.com>
parents: 27615
diff changeset
146 def _reportsimilar(write, similar):
b3376fba4ab9 dispatch: report similar names consistently
Bryan O'Sullivan <bos@serpentine.com>
parents: 27615
diff changeset
147 if len(similar) == 1:
b3376fba4ab9 dispatch: report similar names consistently
Bryan O'Sullivan <bos@serpentine.com>
parents: 27615
diff changeset
148 write(_("(did you mean %s?)\n") % similar[0])
b3376fba4ab9 dispatch: report similar names consistently
Bryan O'Sullivan <bos@serpentine.com>
parents: 27615
diff changeset
149 elif similar:
b3376fba4ab9 dispatch: report similar names consistently
Bryan O'Sullivan <bos@serpentine.com>
parents: 27615
diff changeset
150 ss = ", ".join(sorted(similar))
b3376fba4ab9 dispatch: report similar names consistently
Bryan O'Sullivan <bos@serpentine.com>
parents: 27615
diff changeset
151 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
152
24039
2ee35b6ee4fb dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents: 23871
diff changeset
153 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
154 similar = []
4e240d6ab898 dispatch: offer near-edit-distance suggestions for {file,rev}set functions
Augie Fackler <augie@google.com>
parents: 24163
diff changeset
155 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
156 # 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
157 similar = _getsimilar(inst.symbols, inst.function)
24039
2ee35b6ee4fb dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents: 23871
diff changeset
158 if len(inst.args) > 1:
2ee35b6ee4fb dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents: 23871
diff changeset
159 write(_("hg: parse error at %s: %s\n") %
36503
8b662717c53f py3: use bytestr() to coerce position carried by ParseError to string
Yuya Nishihara <yuya@tcha.org>
parents: 36124
diff changeset
160 (pycompat.bytestr(inst.args[1]), inst.args[0]))
36729
389b950f5190 py3: use startswith() instead of slicing to detect leading whitespace
Yuya Nishihara <yuya@tcha.org>
parents: 36720
diff changeset
161 if inst.args[0].startswith(' '):
24039
2ee35b6ee4fb dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents: 23871
diff changeset
162 write(_("unexpected leading whitespace\n"))
2ee35b6ee4fb dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents: 23871
diff changeset
163 else:
2ee35b6ee4fb dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents: 23871
diff changeset
164 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
165 _reportsimilar(write, similar)
28515
491eabd0df79 dispatch: extract common logic for handling ParseError
Jun Wu <quark@fb.com>
parents: 28447
diff changeset
166 if inst.hint:
491eabd0df79 dispatch: extract common logic for handling ParseError
Jun Wu <quark@fb.com>
parents: 28447
diff changeset
167 write(_("(%s)\n") % inst.hint)
24039
2ee35b6ee4fb dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents: 23871
diff changeset
168
31492
3c77414a0f9c dispatch: consolidate formatting of arguments
Augie Fackler <augie@google.com>
parents: 31491
diff changeset
169 def _formatargs(args):
31500
bc315e669a32 dispatch: replace mayberepr with shellquote
Augie Fackler <augie@google.com>
parents: 31494
diff changeset
170 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
171
14438
08bfec2ef031 dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents: 14286
diff changeset
172 def dispatch(req):
08bfec2ef031 dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents: 14286
diff changeset
173 "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
174 if req.ferr:
9fba795dd030 dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents: 14613
diff changeset
175 ferr = req.ferr
9fba795dd030 dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents: 14613
diff changeset
176 elif req.ui:
9fba795dd030 dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents: 14613
diff changeset
177 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
178 else:
30473
39d13b8c101d py3: bulk replace sys.stdin/out/err by util's
Yuya Nishihara <yuya@tcha.org>
parents: 30468
diff changeset
179 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
180
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
181 try:
14439
80c599eee3f3 dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents: 14438
diff changeset
182 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
183 req.ui = uimod.ui.load()
35224
6e6d0a5b88e6 dispatch: replace _earlyreq*() with new fancyopts-based parser
Yuya Nishihara <yuya@tcha.org>
parents: 35223
diff changeset
184 req.earlyoptions.update(_earlyparseopts(req.ui, req.args))
6e6d0a5b88e6 dispatch: replace _earlyreq*() with new fancyopts-based parser
Yuya Nishihara <yuya@tcha.org>
parents: 35223
diff changeset
185 if req.earlyoptions['traceback']:
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
186 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
187
9fba795dd030 dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents: 14613
diff changeset
188 # 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
189 if req.fin:
9fba795dd030 dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents: 14613
diff changeset
190 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
191 if req.fout:
9fba795dd030 dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents: 14613
diff changeset
192 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
193 if req.ferr:
9fba795dd030 dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents: 14613
diff changeset
194 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
195 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
196 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
197 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
198 ferr.write(_("(%s)\n") % inst.hint)
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
199 return -1
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25329
diff changeset
200 except error.ParseError as inst:
24039
2ee35b6ee4fb dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents: 23871
diff changeset
201 _formatparse(ferr.write, inst)
9470
ba75830d17a9 dispatch: catch ConfigError while constructing ui
Martin Geisler <mg@lazybytes.net>
parents: 8936
diff changeset
202 return -1
14615
9fba795dd030 dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents: 14613
diff changeset
203
31492
3c77414a0f9c dispatch: consolidate formatting of arguments
Augie Fackler <augie@google.com>
parents: 31491
diff changeset
204 msg = _formatargs(req.args)
30975
22fbca1d11ed mercurial: switch to util.timer for all interval timings
Simon Farnsworth <simonfar@fb.com>
parents: 30934
diff changeset
205 starttime = util.timer()
19229
41e39a0299cb blackbox: fix recording exit codes (issue3938)
Durham Goode <durham@fb.com>
parents: 19099
diff changeset
206 ret = None
41e39a0299cb blackbox: fix recording exit codes (issue3938)
Durham Goode <durham@fb.com>
parents: 19099
diff changeset
207 try:
41e39a0299cb blackbox: fix recording exit codes (issue3938)
Durham Goode <durham@fb.com>
parents: 19099
diff changeset
208 ret = _runcatch(req)
32340
9c023179e8d0 error: add hint to ProgrammingError
Yuya Nishihara <yuya@tcha.org>
parents: 32291
diff changeset
209 except error.ProgrammingError as inst:
9c023179e8d0 error: add hint to ProgrammingError
Yuya Nishihara <yuya@tcha.org>
parents: 32291
diff changeset
210 req.ui.warn(_('** ProgrammingError: %s\n') % inst)
9c023179e8d0 error: add hint to ProgrammingError
Yuya Nishihara <yuya@tcha.org>
parents: 32291
diff changeset
211 if inst.hint:
9c023179e8d0 error: add hint to ProgrammingError
Yuya Nishihara <yuya@tcha.org>
parents: 32291
diff changeset
212 req.ui.warn(_('** (%s)\n') % inst.hint)
9c023179e8d0 error: add hint to ProgrammingError
Yuya Nishihara <yuya@tcha.org>
parents: 32291
diff changeset
213 raise
32111
1208b74841ff dispatch: take over SignalInterrupt handling from scmutil
Jun Wu <quark@fb.com>
parents: 32054
diff changeset
214 except KeyboardInterrupt as inst:
28520
84cc72c5771e dispatch: catch KeyboardInterrupt more broadly
Yuya Nishihara <yuya@tcha.org>
parents: 28515
diff changeset
215 try:
32111
1208b74841ff dispatch: take over SignalInterrupt handling from scmutil
Jun Wu <quark@fb.com>
parents: 32054
diff changeset
216 if isinstance(inst, error.SignalInterrupt):
1208b74841ff dispatch: take over SignalInterrupt handling from scmutil
Jun Wu <quark@fb.com>
parents: 32054
diff changeset
217 msg = _("killed!\n")
1208b74841ff dispatch: take over SignalInterrupt handling from scmutil
Jun Wu <quark@fb.com>
parents: 32054
diff changeset
218 else:
1208b74841ff dispatch: take over SignalInterrupt handling from scmutil
Jun Wu <quark@fb.com>
parents: 32054
diff changeset
219 msg = _("interrupted!\n")
1208b74841ff dispatch: take over SignalInterrupt handling from scmutil
Jun Wu <quark@fb.com>
parents: 32054
diff changeset
220 req.ui.warn(msg)
32044
cde72a195f32 dispatch: ignore further SIGPIPE while handling KeyboardInterrupt
Yuya Nishihara <yuya@tcha.org>
parents: 32041
diff changeset
221 except error.SignalInterrupt:
cde72a195f32 dispatch: ignore further SIGPIPE while handling KeyboardInterrupt
Yuya Nishihara <yuya@tcha.org>
parents: 32041
diff changeset
222 # 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
223 # 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
224 pass
28520
84cc72c5771e dispatch: catch KeyboardInterrupt more broadly
Yuya Nishihara <yuya@tcha.org>
parents: 28515
diff changeset
225 except IOError as inst:
84cc72c5771e dispatch: catch KeyboardInterrupt more broadly
Yuya Nishihara <yuya@tcha.org>
parents: 28515
diff changeset
226 if inst.errno != errno.EPIPE:
84cc72c5771e dispatch: catch KeyboardInterrupt more broadly
Yuya Nishihara <yuya@tcha.org>
parents: 28515
diff changeset
227 raise
84cc72c5771e dispatch: catch KeyboardInterrupt more broadly
Yuya Nishihara <yuya@tcha.org>
parents: 28515
diff changeset
228 ret = -1
19229
41e39a0299cb blackbox: fix recording exit codes (issue3938)
Durham Goode <durham@fb.com>
parents: 19099
diff changeset
229 finally:
30975
22fbca1d11ed mercurial: switch to util.timer for all interval timings
Simon Farnsworth <simonfar@fb.com>
parents: 30934
diff changeset
230 duration = util.timer() - starttime
28534
293adbaa14a7 dispatch: flush ui before returning from dispatch
Jun Wu <quark@fb.com>
parents: 28520
diff changeset
231 req.ui.flush()
30976
e92daf156d5c ui: provide a mechanism to track and log blocked time
Simon Farnsworth <simonfar@fb.com>
parents: 30975
diff changeset
232 if req.ui.logblockedtimes:
e92daf156d5c ui: provide a mechanism to track and log blocked time
Simon Farnsworth <simonfar@fb.com>
parents: 30975
diff changeset
233 req.ui._blockedtimes['command_duration'] = duration * 1000
35354
08f28f58f863 py3: handle keyword arguments correctly in dispatch.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35225
diff changeset
234 req.ui.log('uiblocked', 'ui blocked ms',
08f28f58f863 py3: handle keyword arguments correctly in dispatch.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35225
diff changeset
235 **pycompat.strkwargs(req.ui._blockedtimes))
32130
c3dcec6cbc1b py3: use %d instead of %s for integers
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32111
diff changeset
236 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
237 msg, ret or 0, duration)
31956
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31629
diff changeset
238 try:
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31629
diff changeset
239 req._runexithandlers()
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31629
diff changeset
240 except: # exiting, so no re-raises
c13ff31818b0 ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents: 31629
diff changeset
241 ret = ret or -1
28520
84cc72c5771e dispatch: catch KeyboardInterrupt more broadly
Yuya Nishihara <yuya@tcha.org>
parents: 28515
diff changeset
242 return ret
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
243
14439
80c599eee3f3 dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents: 14438
diff changeset
244 def _runcatch(req):
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
245 def catchterm(*args):
7644
182b7114d35a error: move SignalInterrupt
Matt Mackall <mpm@selenic.com>
parents: 7643
diff changeset
246 raise error.SignalInterrupt
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
247
14439
80c599eee3f3 dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents: 14438
diff changeset
248 ui = req.ui
10952
6c2c766afefe dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents: 10793
diff changeset
249 try:
6c2c766afefe dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents: 10793
diff changeset
250 for name in 'SIGBREAK', 'SIGHUP', 'SIGTERM':
6c2c766afefe dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents: 10793
diff changeset
251 num = getattr(signal, name, None)
6c2c766afefe dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents: 10793
diff changeset
252 if num:
6c2c766afefe dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents: 10793
diff changeset
253 signal.signal(num, catchterm)
6c2c766afefe dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents: 10793
diff changeset
254 except ValueError:
6c2c766afefe dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents: 10793
diff changeset
255 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
256
29761
39149b6036e6 dispatch: split global error handling out so it can be reused
Jun Wu <quark@fb.com>
parents: 29132
diff changeset
257 def _runcatchfunc():
32050
77eaf9539499 dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents: 30678
diff changeset
258 realcmd = None
77eaf9539499 dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents: 30678
diff changeset
259 try:
77eaf9539499 dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents: 30678
diff changeset
260 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
261 cmd = cmdargs[0]
77eaf9539499 dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents: 30678
diff changeset
262 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
263 realcmd = aliases[0]
77eaf9539499 dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents: 30678
diff changeset
264 except (error.UnknownCommand, error.AmbiguousCommand,
77eaf9539499 dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents: 30678
diff changeset
265 IndexError, getopt.GetoptError):
77eaf9539499 dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents: 30678
diff changeset
266 # 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
267 # 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
268 # 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
269 # 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
270 pass
77eaf9539499 dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents: 30678
diff changeset
271 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
272 # 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
273 # 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
274 # 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
275 # 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
276 # 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
277 # 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
278 # --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
279 # 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
280 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
281 req.args[0] != '-R' or
77eaf9539499 dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents: 30678
diff changeset
282 req.args[1].startswith('--') or
77eaf9539499 dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents: 30678
diff changeset
283 req.args[2] != 'serve' or
77eaf9539499 dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents: 30678
diff changeset
284 req.args[3] != '--stdio'):
77eaf9539499 dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents: 30678
diff changeset
285 raise error.Abort(
77eaf9539499 dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents: 30678
diff changeset
286 _('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
287 (req.args,))
77eaf9539499 dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents: 30678
diff changeset
288
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
289 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
290 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
291 debugtrace = {
34486
a57c938e7ac8 style: never use a space before a colon or comma
Alex Gaynor <agaynor@mozilla.com>
parents: 34306
diff changeset
292 'pdb': pdb.set_trace
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
293 }
472fa3b782b1 dispatch: add ability to specify a custom pdb module as a debugger
Sean Farley <sean.michael.farley@gmail.com>
parents: 19639
diff changeset
294 debugmortem = {
34486
a57c938e7ac8 style: never use a space before a colon or comma
Alex Gaynor <agaynor@mozilla.com>
parents: 34306
diff changeset
295 'pdb': pdb.post_mortem
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
296 }
19639
09573ad59f7b dispatch: move command line --config argument parsing to _runcatch()
Sean Farley <sean.michael.farley@gmail.com>
parents: 19229
diff changeset
297
09573ad59f7b dispatch: move command line --config argument parsing to _runcatch()
Sean Farley <sean.michael.farley@gmail.com>
parents: 19229
diff changeset
298 # 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
299 # (e.g. to change trust settings for reading .hg/hgrc)
35224
6e6d0a5b88e6 dispatch: replace _earlyreq*() with new fancyopts-based parser
Yuya Nishihara <yuya@tcha.org>
parents: 35223
diff changeset
300 cfgs = _parseconfig(req.ui, req.earlyoptions['config'])
19639
09573ad59f7b dispatch: move command line --config argument parsing to _runcatch()
Sean Farley <sean.michael.farley@gmail.com>
parents: 19229
diff changeset
301
09573ad59f7b dispatch: move command line --config argument parsing to _runcatch()
Sean Farley <sean.michael.farley@gmail.com>
parents: 19229
diff changeset
302 if req.repo:
09573ad59f7b dispatch: move command line --config argument parsing to _runcatch()
Sean Farley <sean.michael.farley@gmail.com>
parents: 19229
diff changeset
303 # 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
304 # the repo ui
20796
131f7fe06e9e check-code: check for argument passing py2.6ism
Matt Mackall <mpm@selenic.com>
parents: 20788
diff changeset
305 for sec, name, val in cfgs:
131f7fe06e9e check-code: check for argument passing py2.6ism
Matt Mackall <mpm@selenic.com>
parents: 20788
diff changeset
306 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
307
25833
8243e999f22b debugger: mark developer-only option
Matt Mackall <mpm@selenic.com>
parents: 25660
diff changeset
308 # 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
309 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
310 debugmod = pdb
20122
8f4a226c840c dispatch: turn off custom debugger for HGPLAIN mode
Sean Farley <sean.michael.farley@gmail.com>
parents: 19640
diff changeset
311 if not debugger or ui.plain():
25833
8243e999f22b debugger: mark developer-only option
Matt Mackall <mpm@selenic.com>
parents: 25660
diff changeset
312 # 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
313 debugger = 'pdb'
35224
6e6d0a5b88e6 dispatch: replace _earlyreq*() with new fancyopts-based parser
Yuya Nishihara <yuya@tcha.org>
parents: 35223
diff changeset
314 elif req.earlyoptions['debugger']:
20826
dd2e25e49862 dispatch: only do __import__(debugger) when a debugger is requested
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 20330
diff changeset
315 # 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
316 # 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
317 # debugging has been requested
25329
101e84121c13 dispatch: disable demandimport for the --debugger option
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 25277
diff changeset
318 with demandimport.deactivated():
101e84121c13 dispatch: disable demandimport for the --debugger option
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 25277
diff changeset
319 try:
101e84121c13 dispatch: disable demandimport for the --debugger option
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 25277
diff changeset
320 debugmod = __import__(debugger)
101e84121c13 dispatch: disable demandimport for the --debugger option
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 25277
diff changeset
321 except ImportError:
101e84121c13 dispatch: disable demandimport for the --debugger option
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 25277
diff changeset
322 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
323
472fa3b782b1 dispatch: add ability to specify a custom pdb module as a debugger
Sean Farley <sean.michael.farley@gmail.com>
parents: 19639
diff changeset
324 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
325 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
326
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
327 # enter the debugger before command execution
35224
6e6d0a5b88e6 dispatch: replace _earlyreq*() with new fancyopts-based parser
Yuya Nishihara <yuya@tcha.org>
parents: 35223
diff changeset
328 if req.earlyoptions['debugger']:
11495
6ee107782018 debugger: give a little intro before entering pdb
Mads Kiilerich <mads@kiilerich.com>
parents: 11494
diff changeset
329 ui.warn(_("entering debugger - "
6ee107782018 debugger: give a little intro before entering pdb
Mads Kiilerich <mads@kiilerich.com>
parents: 11494
diff changeset
330 "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
331
472fa3b782b1 dispatch: add ability to specify a custom pdb module as a debugger
Sean Farley <sean.michael.farley@gmail.com>
parents: 19639
diff changeset
332 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
333 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
334 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
335 "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
336 with demandimport.deactivated():
26216
e86d12404d69 dispatch: disable demandimport when invoking the debugger
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 26191
diff changeset
337 debugtrace[debugger]()
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
338 try:
14439
80c599eee3f3 dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents: 14438
diff changeset
339 return _dispatch(req)
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
340 finally:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
341 ui.flush()
16705
c2d9ef43ff6c check-code: ignore naked excepts with a "re-raise" comment
Brodie Rao <brodie@sf.io>
parents: 16686
diff changeset
342 except: # re-raises
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
343 # enter the debugger when we hit an exception
35224
6e6d0a5b88e6 dispatch: replace _earlyreq*() with new fancyopts-based parser
Yuya Nishihara <yuya@tcha.org>
parents: 35223
diff changeset
344 if req.earlyoptions['debugger']:
11494
2347513f562a debugger: show traceback before entering pdb post-mortem
Mads Kiilerich <mads@kiilerich.com>
parents: 11330
diff changeset
345 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
346 debugmortem[debugger](sys.exc_info()[2])
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
347 raise
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
348
32040
0fb78cb90ca7 dispatch: mark callcatch() as a private function
Yuya Nishihara <yuya@tcha.org>
parents: 31960
diff changeset
349 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
350
32040
0fb78cb90ca7 dispatch: mark callcatch() as a private function
Yuya Nishihara <yuya@tcha.org>
parents: 31960
diff changeset
351 def _callcatch(ui, func):
30520
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30519
diff changeset
352 """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
353 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
354 uncaught exceptions.
29761
39149b6036e6 dispatch: split global error handling out so it can be reused
Jun Wu <quark@fb.com>
parents: 29132
diff changeset
355 """
39149b6036e6 dispatch: split global error handling out so it can be reused
Jun Wu <quark@fb.com>
parents: 29132
diff changeset
356 try:
30520
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30519
diff changeset
357 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
358 except error.AmbiguousCommand as inst:
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
359 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
360 (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
361 except error.CommandError as inst:
7645
020a896a5292 dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents: 7644
diff changeset
362 if inst.args[0]:
31266
8089de5fab89 dispatch: add pagination of two more help cases
Augie Fackler <augie@google.com>
parents: 31199
diff changeset
363 ui.pager('help')
32620
3ce53a499334 dispatch: convert exception payload to bytes more carefully
Augie Fackler <raf@durin42.com>
parents: 32566
diff changeset
364 msgbytes = pycompat.bytestr(inst.args[1])
3ce53a499334 dispatch: convert exception payload to bytes more carefully
Augie Fackler <raf@durin42.com>
parents: 32566
diff changeset
365 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
366 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
367 else:
31266
8089de5fab89 dispatch: add pagination of two more help cases
Augie Fackler <augie@google.com>
parents: 31199
diff changeset
368 ui.pager('help')
7645
020a896a5292 dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents: 7644
diff changeset
369 ui.warn(_("hg: %s\n") % inst.args[1])
020a896a5292 dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents: 7644
diff changeset
370 commands.help_(ui, 'shortlist')
30520
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30519
diff changeset
371 except error.ParseError as inst:
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30519
diff changeset
372 _formatparse(ui.warn, inst)
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30519
diff changeset
373 return -1
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25329
diff changeset
374 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
375 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
376 try:
de1e7099d100 dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents: 10282
diff changeset
377 # 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
378 # (but don't check for extensions themselves)
32566
1b90036f42f0 help: pass commands module by argument
Yuya Nishihara <yuya@tcha.org>
parents: 32379
diff changeset
379 formatted = help.formattedhelp(ui, commands, inst.args[0],
1b90036f42f0 help: pass commands module by argument
Yuya Nishihara <yuya@tcha.org>
parents: 32379
diff changeset
380 unknowncmd=True)
31060
ab20491b1760 dispatch: rearrange 'unknown command' code to better employ pager
Augie Fackler <augie@google.com>
parents: 31027
diff changeset
381 ui.warn(nocmdmsg)
ab20491b1760 dispatch: rearrange 'unknown command' code to better employ pager
Augie Fackler <augie@google.com>
parents: 31027
diff changeset
382 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
383 except (error.UnknownCommand, error.Abort):
24222
02d7b5cd373b dispatch: offer suggestions of similar-named commands
Augie Fackler <augie@google.com>
parents: 24221
diff changeset
384 suggested = False
02d7b5cd373b dispatch: offer suggestions of similar-named commands
Augie Fackler <augie@google.com>
parents: 24221
diff changeset
385 if len(inst.args) == 2:
02d7b5cd373b dispatch: offer suggestions of similar-named commands
Augie Fackler <augie@google.com>
parents: 24221
diff changeset
386 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
387 if sim:
31060
ab20491b1760 dispatch: rearrange 'unknown command' code to better employ pager
Augie Fackler <augie@google.com>
parents: 31027
diff changeset
388 ui.warn(nocmdmsg)
27623
b3376fba4ab9 dispatch: report similar names consistently
Bryan O'Sullivan <bos@serpentine.com>
parents: 27615
diff changeset
389 _reportsimilar(ui.warn, sim)
24222
02d7b5cd373b dispatch: offer suggestions of similar-named commands
Augie Fackler <augie@google.com>
parents: 24221
diff changeset
390 suggested = True
02d7b5cd373b dispatch: offer suggestions of similar-named commands
Augie Fackler <augie@google.com>
parents: 24221
diff changeset
391 if not suggested:
31060
ab20491b1760 dispatch: rearrange 'unknown command' code to better employ pager
Augie Fackler <augie@google.com>
parents: 31027
diff changeset
392 ui.pager('help')
ab20491b1760 dispatch: rearrange 'unknown command' code to better employ pager
Augie Fackler <augie@google.com>
parents: 31027
diff changeset
393 ui.warn(nocmdmsg)
24222
02d7b5cd373b dispatch: offer suggestions of similar-named commands
Augie Fackler <augie@google.com>
parents: 24221
diff changeset
394 commands.help_(ui, 'shortlist')
30520
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30519
diff changeset
395 except IOError:
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30519
diff changeset
396 raise
7645
020a896a5292 dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents: 7644
diff changeset
397 except KeyboardInterrupt:
28520
84cc72c5771e dispatch: catch KeyboardInterrupt more broadly
Yuya Nishihara <yuya@tcha.org>
parents: 28515
diff changeset
398 raise
30520
4338f87dbf6f dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents: 30519
diff changeset
399 except: # probably re-raises
28784
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
400 if not handlecommandexception(ui):
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
401 raise
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
402
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
403 return -1
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
404
14265
e4ab5ae193f2 add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents: 14096
diff changeset
405 def aliasargs(fn, givenargs):
34087
5361771f9714 wrapfunction: use functools.partial if possible
Jun Wu <quark@fb.com>
parents: 34022
diff changeset
406 args = []
5361771f9714 wrapfunction: use functools.partial if possible
Jun Wu <quark@fb.com>
parents: 34022
diff changeset
407 # only care about alias 'args', ignore 'args' set by extensions.wrapfunction
5361771f9714 wrapfunction: use functools.partial if possible
Jun Wu <quark@fb.com>
parents: 34022
diff changeset
408 if not util.safehasattr(fn, '_origfunc'):
5361771f9714 wrapfunction: use functools.partial if possible
Jun Wu <quark@fb.com>
parents: 34022
diff changeset
409 args = getattr(fn, 'args', args)
16294
795d591b6ef5 alias: abort on missing positional args (issue3331)
Matt Mackall <mpm@selenic.com>
parents: 16277
diff changeset
410 if args:
14265
e4ab5ae193f2 add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents: 14096
diff changeset
411 cmd = ' '.join(map(util.shellquote, args))
e4ab5ae193f2 add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents: 14096
diff changeset
412
e4ab5ae193f2 add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents: 14096
diff changeset
413 nums = []
e4ab5ae193f2 add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents: 14096
diff changeset
414 def replacer(m):
e4ab5ae193f2 add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents: 14096
diff changeset
415 num = int(m.group(1)) - 1
e4ab5ae193f2 add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents: 14096
diff changeset
416 nums.append(num)
16277
1c2aaf05f7d7 aliases: use empty string for missing position parameters (issue3331)
Matt Mackall <mpm@selenic.com>
parents: 15781
diff changeset
417 if num < len(givenargs):
1c2aaf05f7d7 aliases: use empty string for missing position parameters (issue3331)
Matt Mackall <mpm@selenic.com>
parents: 15781
diff changeset
418 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
419 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
420 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
421 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
422 if i not in nums]
30678
caf7e1c5efe4 py3: have a bytes version of shlex.split()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30653
diff changeset
423 args = pycompat.shlexsplit(cmd)
14265
e4ab5ae193f2 add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents: 14096
diff changeset
424 return args + givenargs
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
425
22158
bc2132dfc0a4 alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents: 21961
diff changeset
426 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
427 '''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
428
bc2132dfc0a4 alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents: 21961
diff changeset
429 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
430 '''
bc2132dfc0a4 alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents: 21961
diff changeset
431 # 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
432 # 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
433 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
434 replacemap['$0'] = name
bc2132dfc0a4 alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents: 21961
diff changeset
435 replacemap['$$'] = '$'
bc2132dfc0a4 alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents: 21961
diff changeset
436 replacemap['$@'] = ' '.join(args)
bc2132dfc0a4 alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents: 21961
diff changeset
437 # 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
438 # 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
439 # 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
440 # 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
441 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
442 # escape '\$' for regex
35145
25c543944bc0 py3: add b'' to regular expressions which are raw strings
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34781
diff changeset
443 regex = '|'.join(replacemap.keys()).replace('$', br'\$')
22158
bc2132dfc0a4 alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents: 21961
diff changeset
444 r = re.compile(regex)
bc2132dfc0a4 alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents: 21961
diff changeset
445 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
446
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
447 class cmdalias(object):
28828
3640c1702c43 help: report source of aliases
timeless <timeless@mozdev.org>
parents: 28821
diff changeset
448 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
449 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
450 self.cmdname = ''
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
451 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
452 self.fn = None
29087
ad1bdea43965 dispatch: defer environment variable resolution in alias commands (BC)
Jun Wu <quark@fb.com>
parents: 28861
diff changeset
453 self.givenargs = []
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
454 self.opts = []
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
455 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
456 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
457 self.unknowncmd = False
28828
3640c1702c43 help: report source of aliases
timeless <timeless@mozdev.org>
parents: 28821
diff changeset
458 self.source = source
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
459
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
460 try:
12039
18e1e7520b67 alias: make shadowing behavior more consistent (issue2054)
Brodie Rao <brodie@bitheap.org>
parents: 11712
diff changeset
461 aliases, entry = cmdutil.findcmd(self.name, cmdtable)
18e1e7520b67 alias: make shadowing behavior more consistent (issue2054)
Brodie Rao <brodie@bitheap.org>
parents: 11712
diff changeset
462 for alias, e in cmdtable.iteritems():
18e1e7520b67 alias: make shadowing behavior more consistent (issue2054)
Brodie Rao <brodie@bitheap.org>
parents: 11712
diff changeset
463 if e is entry:
18e1e7520b67 alias: make shadowing behavior more consistent (issue2054)
Brodie Rao <brodie@bitheap.org>
parents: 11712
diff changeset
464 self.cmd = alias
18e1e7520b67 alias: make shadowing behavior more consistent (issue2054)
Brodie Rao <brodie@bitheap.org>
parents: 11712
diff changeset
465 break
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
466 self.shadows = True
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
467 except error.UnknownCommand:
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
468 self.shadows = False
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
469
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
470 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
471 self.badalias = _("no definition for alias '%s'") % self.name
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
472 return
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
473
11524
24965bb270b7 dispatch: add shell aliases
Steve Losh <steve@stevelosh.com>
parents: 11495
diff changeset
474 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
475 self.shell = True
11524
24965bb270b7 dispatch: add shell aliases
Steve Losh <steve@stevelosh.com>
parents: 11495
diff changeset
476 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
477 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
478 def _checkvar(m):
13392
777cef34a890 dispatch: support for $ escaping in shell-alias definition
Roman Sokolov <sokolov.r.v@gmail.com>
parents: 13382
diff changeset
479 if m.groups()[0] == '$':
777cef34a890 dispatch: support for $ escaping in shell-alias definition
Roman Sokolov <sokolov.r.v@gmail.com>
parents: 13382
diff changeset
480 return m.group()
777cef34a890 dispatch: support for $ escaping in shell-alias definition
Roman Sokolov <sokolov.r.v@gmail.com>
parents: 13382
diff changeset
481 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
482 return m.group()
f853873fc66d aliases: provide more flexible ways to work with shell alias arguments
Steve Losh <steve@stevelosh.com>
parents: 11985
diff changeset
483 else:
14708
8083f4d00bd1 i18n: remove translation of debug messages
David Soria Parra <dsp@php.net>
parents: 14704
diff changeset
484 ui.debug("No argument found for substitution "
35466
7906354cbc68 debug: add newlines at the end of three locations that appear to need it
Kyle Lippincott <spectral@google.com>
parents: 35354
diff changeset
485 "of %i variable in alias '%s' definition.\n"
13393
d38d500deb08 dispatch: debug message for missing arguments in shell alias
Roman Sokolov <sokolov.r.v@gmail.com>
parents: 13392
diff changeset
486 % (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
487 return ''
35145
25c543944bc0 py3: add b'' to regular expressions which are raw strings
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34781
diff changeset
488 cmd = re.sub(br'\$(\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
489 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
490 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
491 blockedtag='alias_%s' % self.name)
11524
24965bb270b7 dispatch: add shell aliases
Steve Losh <steve@stevelosh.com>
parents: 11495
diff changeset
492 self.fn = fn
24965bb270b7 dispatch: add shell aliases
Steve Losh <steve@stevelosh.com>
parents: 11495
diff changeset
493 return
24965bb270b7 dispatch: add shell aliases
Steve Losh <steve@stevelosh.com>
parents: 11495
diff changeset
494
21569
c5afb07c33d3 alias: handle shlex error in command aliases
Yuya Nishihara <yuya@tcha.org>
parents: 21556
diff changeset
495 try:
30678
caf7e1c5efe4 py3: have a bytes version of shlex.split()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30653
diff changeset
496 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
497 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
498 self.badalias = (_("error in definition for alias '%s': %s")
36641
77f98867538f py3: fix some unicode madness in global exception catcher
Yuya Nishihara <yuya@tcha.org>
parents: 36637
diff changeset
499 % (self.name, util.forcebytestr(inst)))
21569
c5afb07c33d3 alias: handle shlex error in command aliases
Yuya Nishihara <yuya@tcha.org>
parents: 21556
diff changeset
500 return
35225
7ce0ba3a1c32 dispatch: replace _earlygetopt(strip=True) with new parser
Yuya Nishihara <yuya@tcha.org>
parents: 35224
diff changeset
501 earlyopts, args = _earlysplitopts(args)
7ce0ba3a1c32 dispatch: replace _earlygetopt(strip=True) with new parser
Yuya Nishihara <yuya@tcha.org>
parents: 35224
diff changeset
502 if earlyopts:
7ce0ba3a1c32 dispatch: replace _earlygetopt(strip=True) with new parser
Yuya Nishihara <yuya@tcha.org>
parents: 35224
diff changeset
503 self.badalias = (_("error in definition for alias '%s': %s may "
7ce0ba3a1c32 dispatch: replace _earlygetopt(strip=True) with new parser
Yuya Nishihara <yuya@tcha.org>
parents: 35224
diff changeset
504 "only be given on the command line")
35942
f81df691efe7 py3: use pycompat.ziplist instead of zip
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35899
diff changeset
505 % (self.name, '/'.join(pycompat.ziplist(*earlyopts)
f81df691efe7 py3: use pycompat.ziplist instead of zip
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35899
diff changeset
506 [0])))
35225
7ce0ba3a1c32 dispatch: replace _earlygetopt(strip=True) with new parser
Yuya Nishihara <yuya@tcha.org>
parents: 35224
diff changeset
507 return
12092
4982fa38e544 alias: print what command is being shadowed in debug message
Brodie Rao <brodie@bitheap.org>
parents: 12070
diff changeset
508 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
509 self.givenargs = args
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
510
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
511 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
512 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
513 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
514 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
515 else:
8bce1e0d2801 alias: do not crash when aliased command has no usage help text
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 9825
diff changeset
516 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
517
9876
6e8a16dd3e30 alias: improve help text for command aliases
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 9875
diff changeset
518 if self.help.startswith("hg " + cmd):
6e8a16dd3e30 alias: improve help text for command aliases
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 9875
diff changeset
519 # 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
520 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
521 self.__doc__ = self.fn.__doc__
9876
6e8a16dd3e30 alias: improve help text for command aliases
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 9875
diff changeset
522
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
523 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
524 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
525 % (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
526 self.unknowncmd = True
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
527 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
528 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
529 % (self.name, cmd))
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
530
29087
ad1bdea43965 dispatch: defer environment variable resolution in alias commands (BC)
Jun Wu <quark@fb.com>
parents: 28861
diff changeset
531 @property
ad1bdea43965 dispatch: defer environment variable resolution in alias commands (BC)
Jun Wu <quark@fb.com>
parents: 28861
diff changeset
532 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
533 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
534 return aliasargs(self.fn, args)
ad1bdea43965 dispatch: defer environment variable resolution in alias commands (BC)
Jun Wu <quark@fb.com>
parents: 28861
diff changeset
535
28621
d856e85a8a7a dispatch: make cmdalias forward command attributes to function
Yuya Nishihara <yuya@tcha.org>
parents: 28538
diff changeset
536 def __getattr__(self, name):
34781
fe987d0b9e1e registrar: add support for storing the type of command in func object
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34638
diff changeset
537 adefaults = {r'norepo': True, r'cmdtype': unrecoverablewrite,
32158
89153b0d4881 py3: make adefaults keys str to be compatible with getattr
Pulkit Goyal <7895pulkit@gmail.com>
parents: 32130
diff changeset
538 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
539 if name not in adefaults:
d856e85a8a7a dispatch: make cmdalias forward command attributes to function
Yuya Nishihara <yuya@tcha.org>
parents: 28538
diff changeset
540 raise AttributeError(name)
d856e85a8a7a dispatch: make cmdalias forward command attributes to function
Yuya Nishihara <yuya@tcha.org>
parents: 28538
diff changeset
541 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
542 return adefaults[name]
d856e85a8a7a dispatch: make cmdalias forward command attributes to function
Yuya Nishihara <yuya@tcha.org>
parents: 28538
diff changeset
543 return getattr(self.fn, name)
d856e85a8a7a dispatch: make cmdalias forward command attributes to function
Yuya Nishihara <yuya@tcha.org>
parents: 28538
diff changeset
544
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
545 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
546 if self.badalias:
22164
efd65e51bc0b alias: exit from bad definition by Abort
Yuya Nishihara <yuya@tcha.org>
parents: 22163
diff changeset
547 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
548 if self.unknowncmd:
10364
de1e7099d100 dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents: 10282
diff changeset
549 try:
de1e7099d100 dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents: 10282
diff changeset
550 # 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
551 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
552 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
553 except error.UnknownCommand:
de1e7099d100 dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents: 10282
diff changeset
554 pass
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26421
diff changeset
555 raise error.Abort(self.badalias, hint=hint)
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
556 if self.shadows:
14704
b24d596fcd25 Backed out changeset 1ec8bd909ac3
Martin Geisler <mg@aragost.com>
parents: 14702
diff changeset
557 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
558 (self.name, self.cmdname))
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
559
29846
318e2b600b80 blackbox: also log alias expansions
Augie Fackler <augie@google.com>
parents: 29841
diff changeset
560 ui.log('commandalias', "alias '%s' expands to '%s'\n",
318e2b600b80 blackbox: also log alias expansions
Augie Fackler <augie@google.com>
parents: 29841
diff changeset
561 self.name, self.definition)
14950
144e97421f6b dispatch: use safehasattr instead of hasattr
Augie Fackler <durin42@gmail.com>
parents: 14918
diff changeset
562 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
563 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
564 else:
12093
cd895084a4cd alias: on --debug, print expansion when it has invalid arguments
Brodie Rao <brodie@bitheap.org>
parents: 12092
diff changeset
565 try:
21556
5e13507a3b4e alias: fix loss of non-zero return code in command aliases
Yuya Nishihara <yuya@tcha.org>
parents: 20829
diff changeset
566 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
567 except error.SignatureError:
cd895084a4cd alias: on --debug, print expansion when it has invalid arguments
Brodie Rao <brodie@bitheap.org>
parents: 12092
diff changeset
568 args = ' '.join([self.cmdname] + self.args)
14704
b24d596fcd25 Backed out changeset 1ec8bd909ac3
Martin Geisler <mg@aragost.com>
parents: 14702
diff changeset
569 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
570 raise
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
571
34306
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
572 class lazyaliasentry(object):
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
573 """like a typical command entry (func, opts, help), but is lazy"""
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
574
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
575 def __init__(self, name, definition, cmdtable, source):
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
576 self.name = name
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
577 self.definition = definition
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
578 self.cmdtable = cmdtable.copy()
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
579 self.source = source
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
580
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
581 @util.propertycache
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
582 def _aliasdef(self):
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
583 return cmdalias(self.name, self.definition, self.cmdtable, self.source)
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
584
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
585 def __getitem__(self, n):
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
586 aliasdef = self._aliasdef
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
587 if n == 0:
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
588 return aliasdef
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
589 elif n == 1:
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
590 return aliasdef.opts
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
591 elif n == 2:
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
592 return aliasdef.help
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
593 else:
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
594 raise IndexError
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
595
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
596 def __iter__(self):
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
597 for i in range(3):
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
598 yield self[i]
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
599
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
600 def __len__(self):
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
601 return 3
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
602
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
603 def addaliases(ui, cmdtable):
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
604 # aliases are processed after extensions have been loaded, so they
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
605 # 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
606 # 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
607 for alias, definition in ui.configitems('alias'):
15019
f4b7be3f8430 dispatch: don't rewrap aliases that have the same definition
Idan Kamara <idankk86@gmail.com>
parents: 14992
diff changeset
608 try:
34306
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
609 if cmdtable[alias].definition == definition:
15019
f4b7be3f8430 dispatch: don't rewrap aliases that have the same definition
Idan Kamara <idankk86@gmail.com>
parents: 14992
diff changeset
610 continue
f4b7be3f8430 dispatch: don't rewrap aliases that have the same definition
Idan Kamara <idankk86@gmail.com>
parents: 14992
diff changeset
611 except (KeyError, AttributeError):
f4b7be3f8430 dispatch: don't rewrap aliases that have the same definition
Idan Kamara <idankk86@gmail.com>
parents: 14992
diff changeset
612 # 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
613 pass
f4b7be3f8430 dispatch: don't rewrap aliases that have the same definition
Idan Kamara <idankk86@gmail.com>
parents: 14992
diff changeset
614
34305
0e48813cc106 alias: test duplicated definition earlier
Jun Wu <quark@fb.com>
parents: 34131
diff changeset
615 source = ui.configsource('alias', alias)
34306
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
616 entry = lazyaliasentry(alias, definition, cmdtable, source)
bd50aa1aa035 alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents: 34305
diff changeset
617 cmdtable[alias] = entry
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
618
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
619 def _parse(ui, args):
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
620 options = {}
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
621 cmdoptions = {}
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
622
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
623 try:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
624 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
625 except getopt.GetoptError as inst:
36641
77f98867538f py3: fix some unicode madness in global exception catcher
Yuya Nishihara <yuya@tcha.org>
parents: 36637
diff changeset
626 raise error.CommandError(None, util.forcebytestr(inst))
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
627
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
628 if args:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
629 cmd, args = args[0], args[1:]
9875
d6a95c5f6ff9 dispatch: minor refactoring
Henri Wiechers <hwiechers@gmail.com>
parents: 9825
diff changeset
630 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
631 ui.configbool("ui", "strict"))
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
632 cmd = aliases[0]
14265
e4ab5ae193f2 add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents: 14096
diff changeset
633 args = aliasargs(entry[0], args)
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
634 defaults = ui.config("defaults", cmd)
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
635 if defaults:
31502
9916b3d579a9 dispatch: use pycompat.maplist to allow summing with args
Augie Fackler <augie@google.com>
parents: 31500
diff changeset
636 args = pycompat.maplist(
9916b3d579a9 dispatch: use pycompat.maplist to allow summing with args
Augie Fackler <augie@google.com>
parents: 31500
diff changeset
637 util.expandpath, pycompat.shlexsplit(defaults)) + args
9875
d6a95c5f6ff9 dispatch: minor refactoring
Henri Wiechers <hwiechers@gmail.com>
parents: 9825
diff changeset
638 c = list(entry[1])
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
639 else:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
640 cmd = None
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
641 c = []
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
642
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
643 # combine global options into local
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
644 for o in commands.globalopts:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
645 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
646
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
647 try:
29822
61a4cdc98307 dispatch: explicitly pass fancyopts optional arg as a keyword
Augie Fackler <augie@google.com>
parents: 29784
diff changeset
648 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
649 except getopt.GetoptError as inst:
36641
77f98867538f py3: fix some unicode madness in global exception catcher
Yuya Nishihara <yuya@tcha.org>
parents: 36637
diff changeset
650 raise error.CommandError(cmd, util.forcebytestr(inst))
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
651
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
652 # separate global options back out
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
653 for o in commands.globalopts:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
654 n = o[1]
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
655 options[n] = cmdoptions[n]
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
656 del cmdoptions[n]
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
657
9875
d6a95c5f6ff9 dispatch: minor refactoring
Henri Wiechers <hwiechers@gmail.com>
parents: 9825
diff changeset
658 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
659
8137
7fd0616b3d80 ui: kill updateopts
Matt Mackall <mpm@selenic.com>
parents: 8136
diff changeset
660 def _parseconfig(ui, config):
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
661 """parse the --config options from the command line"""
14753
10dcb3e7cb55 dispatch: return read config options
Idan Kamara <idankk86@gmail.com>
parents: 14752
diff changeset
662 configs = []
10dcb3e7cb55 dispatch: return read config options
Idan Kamara <idankk86@gmail.com>
parents: 14752
diff changeset
663
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
664 for cfg in config:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
665 try:
28081
a6344df5108e dispatch: strip command line options like config file options
Tony Tung <ttung@fb.com>
parents: 27679
diff changeset
666 name, value = [cfgelem.strip()
a6344df5108e dispatch: strip command line options like config file options
Tony Tung <ttung@fb.com>
parents: 27679
diff changeset
667 for cfgelem in cfg.split('=', 1)]
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
668 section, name = name.split('.', 1)
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
669 if not section or not name:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
670 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
671 ui.setconfig(section, name, value, '--config')
14753
10dcb3e7cb55 dispatch: return read config options
Idan Kamara <idankk86@gmail.com>
parents: 14752
diff changeset
672 configs.append((section, name, value))
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
673 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
674 raise error.Abort(_('malformed --config option: %r '
36641
77f98867538f py3: fix some unicode madness in global exception catcher
Yuya Nishihara <yuya@tcha.org>
parents: 36637
diff changeset
675 '(use --config section.name=value)')
77f98867538f py3: fix some unicode madness in global exception catcher
Yuya Nishihara <yuya@tcha.org>
parents: 36637
diff changeset
676 % pycompat.bytestr(cfg))
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
677
14753
10dcb3e7cb55 dispatch: return read config options
Idan Kamara <idankk86@gmail.com>
parents: 14752
diff changeset
678 return configs
10dcb3e7cb55 dispatch: return read config options
Idan Kamara <idankk86@gmail.com>
parents: 14752
diff changeset
679
35224
6e6d0a5b88e6 dispatch: replace _earlyreq*() with new fancyopts-based parser
Yuya Nishihara <yuya@tcha.org>
parents: 35223
diff changeset
680 def _earlyparseopts(ui, args):
35170
c9740b69b9b7 dispatch: add HGPLAIN=+strictflags to restrict early parsing of global options
Yuya Nishihara <yuya@tcha.org>
parents: 35034
diff changeset
681 options = {}
c9740b69b9b7 dispatch: add HGPLAIN=+strictflags to restrict early parsing of global options
Yuya Nishihara <yuya@tcha.org>
parents: 35034
diff changeset
682 fancyopts.fancyopts(args, commands.globalopts, options,
35224
6e6d0a5b88e6 dispatch: replace _earlyreq*() with new fancyopts-based parser
Yuya Nishihara <yuya@tcha.org>
parents: 35223
diff changeset
683 gnu=not ui.plain('strictflags'), early=True,
35223
4edd2202f7d7 dispatch: alias --repo to --repository while parsing early options
Yuya Nishihara <yuya@tcha.org>
parents: 35186
diff changeset
684 optaliases={'repository': ['repo']})
35170
c9740b69b9b7 dispatch: add HGPLAIN=+strictflags to restrict early parsing of global options
Yuya Nishihara <yuya@tcha.org>
parents: 35034
diff changeset
685 return options
c9740b69b9b7 dispatch: add HGPLAIN=+strictflags to restrict early parsing of global options
Yuya Nishihara <yuya@tcha.org>
parents: 35034
diff changeset
686
35225
7ce0ba3a1c32 dispatch: replace _earlygetopt(strip=True) with new parser
Yuya Nishihara <yuya@tcha.org>
parents: 35224
diff changeset
687 def _earlysplitopts(args):
7ce0ba3a1c32 dispatch: replace _earlygetopt(strip=True) with new parser
Yuya Nishihara <yuya@tcha.org>
parents: 35224
diff changeset
688 """Split args into a list of possible early options and remainder args"""
7ce0ba3a1c32 dispatch: replace _earlygetopt(strip=True) with new parser
Yuya Nishihara <yuya@tcha.org>
parents: 35224
diff changeset
689 shortoptions = 'R:'
7ce0ba3a1c32 dispatch: replace _earlygetopt(strip=True) with new parser
Yuya Nishihara <yuya@tcha.org>
parents: 35224
diff changeset
690 # TODO: perhaps 'debugger' should be included
7ce0ba3a1c32 dispatch: replace _earlygetopt(strip=True) with new parser
Yuya Nishihara <yuya@tcha.org>
parents: 35224
diff changeset
691 longoptions = ['cwd=', 'repository=', 'repo=', 'config=']
7ce0ba3a1c32 dispatch: replace _earlygetopt(strip=True) with new parser
Yuya Nishihara <yuya@tcha.org>
parents: 35224
diff changeset
692 return fancyopts.earlygetopt(args, shortoptions, longoptions,
7ce0ba3a1c32 dispatch: replace _earlygetopt(strip=True) with new parser
Yuya Nishihara <yuya@tcha.org>
parents: 35224
diff changeset
693 gnu=True, keepsep=True)
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
694
11330
713ae78bb583 provide pre- and post- hooks with parsed command line arguments.
Chad Dombrova <chadrik@gmail.com>
parents: 11305
diff changeset
695 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
696 # 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
697 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
698 pats=cmdpats, opts=cmdoptions)
29129
e6dfb0e4eeef dispatch: add fail-* family of hooks
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 29114
diff changeset
699 try:
e6dfb0e4eeef dispatch: add fail-* family of hooks
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 29114
diff changeset
700 ret = _runcommand(ui, options, cmd, d)
e6dfb0e4eeef dispatch: add fail-* family of hooks
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 29114
diff changeset
701 # run post-hook, passing command result
e6dfb0e4eeef dispatch: add fail-* family of hooks
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 29114
diff changeset
702 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
703 result=ret, pats=cmdpats, opts=cmdoptions)
e6dfb0e4eeef dispatch: add fail-* family of hooks
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 29114
diff changeset
704 except Exception:
e6dfb0e4eeef dispatch: add fail-* family of hooks
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 29114
diff changeset
705 # run failure hook and re-raise
e6dfb0e4eeef dispatch: add fail-* family of hooks
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 29114
diff changeset
706 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
707 pats=cmdpats, opts=cmdoptions)
e6dfb0e4eeef dispatch: add fail-* family of hooks
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 29114
diff changeset
708 raise
7819
14b703252f14 dispatch: extract command execution block into method
Bill Barry <after.fallout@gmail.com>
parents: 7772
diff changeset
709 return ret
14b703252f14 dispatch: extract command execution block into method
Bill Barry <after.fallout@gmail.com>
parents: 7772
diff changeset
710
28263
59509c6724c7 dispatch: add wd parameter to _getlocal
Jun Wu <quark@fb.com>
parents: 28081
diff changeset
711 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
712 """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
713
12536
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
714 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
715 """
28263
59509c6724c7 dispatch: add wd parameter to _getlocal
Jun Wu <quark@fb.com>
parents: 28081
diff changeset
716 if wd is None:
59509c6724c7 dispatch: add wd parameter to _getlocal
Jun Wu <quark@fb.com>
parents: 28081
diff changeset
717 try:
30500
fc0cfe6c87d7 py3: add os.getcwdb() to have bytes path
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30485
diff changeset
718 wd = pycompat.getcwd()
28263
59509c6724c7 dispatch: add wd parameter to _getlocal
Jun Wu <quark@fb.com>
parents: 28081
diff changeset
719 except OSError as e:
59509c6724c7 dispatch: add wd parameter to _getlocal
Jun Wu <quark@fb.com>
parents: 28081
diff changeset
720 raise error.Abort(_("error getting current working directory: %s") %
34022
d5b2beca16c0 python3: wrap all uses of <exception>.strerror with strtolocal
Augie Fackler <raf@durin42.com>
parents: 33620
diff changeset
721 encoding.strtolocal(e.strerror))
11675
f92f8921a5cc dispatch: give better error message when cwd doesn't exist (issue2293)
Mads Kiilerich <mads@kiilerich.com>
parents: 11600
diff changeset
722 path = cmdutil.findrepo(wd) or ""
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
723 if not path:
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
724 lui = ui
9436
96379c93ba6f improve code readability
Andrey Somov <py4fun@gmail.com>
parents: 9411
diff changeset
725 else:
12636
c24215aa7e69 dispatch: remove superfluous try/except when reading local ui config
Brodie Rao <brodie@bitheap.org>
parents: 12633
diff changeset
726 lui = ui.copy()
12637
42ca7aef28d3 dispatch: properly handle relative path aliases used with -R (issue2376)
Brodie Rao <brodie@bitheap.org>
parents: 12636
diff changeset
727 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
728
35033
d3d35a55e03b dispatch: convert non-list option parsed by _earlygetopt() to string
Yuya Nishihara <yuya@tcha.org>
parents: 35032
diff changeset
729 if rpath:
d3d35a55e03b dispatch: convert non-list option parsed by _earlygetopt() to string
Yuya Nishihara <yuya@tcha.org>
parents: 35032
diff changeset
730 path = lui.expandpath(rpath)
8190
9b8ac5fb7760 ui: kill most users of parentui name and arg, replace with .copy()
Matt Mackall <mpm@selenic.com>
parents: 8144
diff changeset
731 lui = ui.copy()
12637
42ca7aef28d3 dispatch: properly handle relative path aliases used with -R (issue2376)
Brodie Rao <brodie@bitheap.org>
parents: 12636
diff changeset
732 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
733
12536
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
734 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
735
29132
12769703d4ba dispatch: always load extensions before running shell aliases (issue5230)
Jun Wu <quark@fb.com>
parents: 29129
diff changeset
736 def _checkshellalias(lui, ui, args):
12769703d4ba dispatch: always load extensions before running shell aliases (issue5230)
Jun Wu <quark@fb.com>
parents: 29129
diff changeset
737 """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
738 options = {}
12748
d10369fefd01 alias: fail gracefully when invalid global options are given (issue2442)
Steve Losh <steve@stevelosh.com>
parents: 12637
diff changeset
739
d10369fefd01 alias: fail gracefully when invalid global options are given (issue2442)
Steve Losh <steve@stevelosh.com>
parents: 12637
diff changeset
740 try:
d10369fefd01 alias: fail gracefully when invalid global options are given (issue2442)
Steve Losh <steve@stevelosh.com>
parents: 12637
diff changeset
741 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
742 except getopt.GetoptError:
12748
d10369fefd01 alias: fail gracefully when invalid global options are given (issue2442)
Steve Losh <steve@stevelosh.com>
parents: 12637
diff changeset
743 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
744
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
745 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
746 return
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
747
29132
12769703d4ba dispatch: always load extensions before running shell aliases (issue5230)
Jun Wu <quark@fb.com>
parents: 29129
diff changeset
748 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
749
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
750 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
751 try:
29132
12769703d4ba dispatch: always load extensions before running shell aliases (issue5230)
Jun Wu <quark@fb.com>
parents: 29129
diff changeset
752 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
753 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
754 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
755 return
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
756
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
757 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
758 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
759
14950
144e97421f6b dispatch: use safehasattr instead of hasattr
Augie Fackler <durin42@gmail.com>
parents: 14918
diff changeset
760 if cmd and util.safehasattr(fn, 'shell'):
35034
02845f7441af dispatch: verify result of early command parsing
Yuya Nishihara <yuya@tcha.org>
parents: 35033
diff changeset
761 # shell alias shouldn't receive early options which are consumed by hg
35225
7ce0ba3a1c32 dispatch: replace _earlygetopt(strip=True) with new parser
Yuya Nishihara <yuya@tcha.org>
parents: 35224
diff changeset
762 _earlyopts, args = _earlysplitopts(args)
12536
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
763 d = lambda: fn(ui, *args[1:])
16683
525fdb738975 cleanup: eradicate long lines
Brodie Rao <brodie@sf.io>
parents: 16609
diff changeset
764 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
765 [], {})
12536
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
766
14439
80c599eee3f3 dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents: 14438
diff changeset
767 def _dispatch(req):
14438
08bfec2ef031 dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents: 14286
diff changeset
768 args = req.args
14439
80c599eee3f3 dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents: 14438
diff changeset
769 ui = req.ui
80c599eee3f3 dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents: 14438
diff changeset
770
12536
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
771 # check for cwd
35224
6e6d0a5b88e6 dispatch: replace _earlyreq*() with new fancyopts-based parser
Yuya Nishihara <yuya@tcha.org>
parents: 35223
diff changeset
772 cwd = req.earlyoptions['cwd']
12536
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
773 if cwd:
35033
d3d35a55e03b dispatch: convert non-list option parsed by _earlygetopt() to string
Yuya Nishihara <yuya@tcha.org>
parents: 35032
diff changeset
774 os.chdir(cwd)
12536
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
775
35224
6e6d0a5b88e6 dispatch: replace _earlyreq*() with new fancyopts-based parser
Yuya Nishihara <yuya@tcha.org>
parents: 35223
diff changeset
776 rpath = req.earlyoptions['repository']
12536
208fc9ad6a48 alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents: 12276
diff changeset
777 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
778
32291
bd872f64a8ba cleanup: use set literals
Martin von Zweigbergk <martinvonz@google.com>
parents: 32158
diff changeset
779 uis = {ui, lui}
30933
69a3c6c8bf95 dispatch: move detection of profiling earlier during startup
Bryan O'Sullivan <bryano@fb.com>
parents: 30917
diff changeset
780
69a3c6c8bf95 dispatch: move detection of profiling earlier during startup
Bryan O'Sullivan <bryano@fb.com>
parents: 30917
diff changeset
781 if req.repo:
69a3c6c8bf95 dispatch: move detection of profiling earlier during startup
Bryan O'Sullivan <bryano@fb.com>
parents: 30917
diff changeset
782 uis.add(req.repo.ui)
69a3c6c8bf95 dispatch: move detection of profiling earlier during startup
Bryan O'Sullivan <bryano@fb.com>
parents: 30917
diff changeset
783
35224
6e6d0a5b88e6 dispatch: replace _earlyreq*() with new fancyopts-based parser
Yuya Nishihara <yuya@tcha.org>
parents: 35223
diff changeset
784 if req.earlyoptions['profile']:
30933
69a3c6c8bf95 dispatch: move detection of profiling earlier during startup
Bryan O'Sullivan <bryano@fb.com>
parents: 30917
diff changeset
785 for ui_ in uis:
69a3c6c8bf95 dispatch: move detection of profiling earlier during startup
Bryan O'Sullivan <bryano@fb.com>
parents: 30917
diff changeset
786 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
787
32788
eede022fc142 profile: drop maybeprofile
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32787
diff changeset
788 profile = lui.configbool('profiling', 'enabled')
eede022fc142 profile: drop maybeprofile
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32787
diff changeset
789 with profiling.profile(lui, enabled=profile) as profiler:
30934
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
790 # Configure extensions in phases: uisetup, extsetup, cmdtable, and
33053
ef46d432e2e4 dispatch: remove unused _loaded
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33052
diff changeset
791 # reposetup
30934
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
792 extensions.loadall(lui)
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
793 # Propagate any changes to lui.__class__ by extensions
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
794 ui.__class__ = lui.__class__
5828
863e237b58fb dispatch: allow extensions to provide setup code
Kirill Smelkov <kirr@mns.spb.ru>
parents: 5664
diff changeset
795
30934
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
796 # (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
797
30934
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
798 # (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
799
30934
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
800 addaliases(lui, commands.table)
8655
21688b8a594b Move alias into core
Brendan Cully <brendan@kublai.com>
parents: 8304
diff changeset
801
30934
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
802 # All aliases and commands are completely defined, now.
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
803 # Check abbreviation/ambiguity of shell alias.
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
804 shellaliasfn = _checkshellalias(lui, ui, args)
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
805 if shellaliasfn:
30006
b19c2679289c dispatch: make hg --profile wrap reposetup
Arun Kulshreshtha <kulshrax@fb.com>
parents: 30005
diff changeset
806 return shellaliasfn()
22377
f98abe3146b2 dispatch: check shell alias again after loading extensions (issue4355)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 22376
diff changeset
807
30934
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
808 # check for fallback encoding
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
809 fallback = lui.config('ui', 'fallbackencoding')
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
810 if fallback:
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
811 encoding.fallbackencoding = fallback
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
812
30934
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
813 fullargs = args
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
814 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
815
35034
02845f7441af dispatch: verify result of early command parsing
Yuya Nishihara <yuya@tcha.org>
parents: 35033
diff changeset
816 if options["config"] != req.earlyoptions["config"]:
30934
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
817 raise error.Abort(_("option --config may not be abbreviated!"))
35034
02845f7441af dispatch: verify result of early command parsing
Yuya Nishihara <yuya@tcha.org>
parents: 35033
diff changeset
818 if options["cwd"] != req.earlyoptions["cwd"]:
30934
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
819 raise error.Abort(_("option --cwd may not be abbreviated!"))
35034
02845f7441af dispatch: verify result of early command parsing
Yuya Nishihara <yuya@tcha.org>
parents: 35033
diff changeset
820 if options["repository"] != req.earlyoptions["repository"]:
30934
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
821 raise error.Abort(_(
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
822 "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
823 "-qR) and --repository may only be abbreviated as --repo!"))
35030
d9aba3730d30 dispatch: abort if early boolean options can't be parsed
Yuya Nishihara <yuya@tcha.org>
parents: 35029
diff changeset
824 if options["debugger"] != req.earlyoptions["debugger"]:
d9aba3730d30 dispatch: abort if early boolean options can't be parsed
Yuya Nishihara <yuya@tcha.org>
parents: 35029
diff changeset
825 raise error.Abort(_("option --debugger may not be abbreviated!"))
d9aba3730d30 dispatch: abort if early boolean options can't be parsed
Yuya Nishihara <yuya@tcha.org>
parents: 35029
diff changeset
826 # don't validate --profile/--traceback, which can be enabled from now
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
827
30934
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
828 if options["encoding"]:
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
829 encoding.encoding = options["encoding"]
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
830 if options["encodingmode"]:
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
831 encoding.encodingmode = options["encodingmode"]
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
832 if options["time"]:
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
833 def get_times():
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
834 t = os.times()
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
835 if t[4] == 0.0:
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
836 # Windows leaves this as zero, so use time.clock()
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
837 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
838 return t
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
839 s = get_times()
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
840 def print_time():
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
841 t = get_times()
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
842 ui.warn(
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
843 _("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
844 (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
845 ui.atexit(print_time)
32787
545f69cd6042 profile: support --profile in alias and abbreviated version (--prof)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32687
diff changeset
846 if options["profile"]:
545f69cd6042 profile: support --profile in alias and abbreviated version (--prof)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32687
diff changeset
847 profiler.start()
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
848
30934
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
849 if options['verbose'] or options['debug'] or options['quiet']:
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
850 for opt in ('verbose', 'debug', 'quiet'):
35898
a2b3b5c5a25a py3: replace "if ispy3" by pycompat.bytestr()
Yuya Nishihara <yuya@tcha.org>
parents: 35653
diff changeset
851 val = pycompat.bytestr(bool(options[opt]))
30934
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
852 for ui_ in uis:
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
853 ui_.setconfig('ui', opt, val, '--' + opt)
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
854
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
855 if options['traceback']:
14752
99ace3cb7352 dispatch: set global options on the request repo.ui
Idan Kamara <idankk86@gmail.com>
parents: 14748
diff changeset
856 for ui_ in uis:
30934
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
857 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
858
30934
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
859 if options['noninteractive']:
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
860 for ui_ in uis:
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
861 ui_.setconfig('ui', 'interactive', 'off', '-y')
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
862
30934
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
863 if cmdoptions.get('insecure', False):
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
864 for ui_ in uis:
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
865 ui_.insecureconnections = True
13328
a939f08fae9c url: add --insecure option to bypass verification of ssl certificates
Yuya Nishihara <yuya@tcha.org>
parents: 12932
diff changeset
866
32383
f928d53b687c dispatch: setup color before pager for correct console information on windows
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32054
diff changeset
867 # 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
868 # 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
869 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
870 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
871 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
872 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
873 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
874
32383
f928d53b687c dispatch: setup color before pager for correct console information on windows
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32054
diff changeset
875 if util.parsebool(options['pager']):
33620
cc047a733f69 ui: enable pager always for explicit --pager=on (issue5580)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33499
diff changeset
876 # ui.pager() expects 'internal-always-' prefix in this case
32383
f928d53b687c dispatch: setup color before pager for correct console information on windows
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32054
diff changeset
877 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
878 elif options['pager'] != 'auto':
34638
021607b4ef49 dispatch: when --pager=no is passed, also disable pager on req.repo.ui
Jun Wu <quark@fb.com>
parents: 34533
diff changeset
879 for ui_ in uis:
021607b4ef49 dispatch: when --pager=no is passed, also disable pager on req.repo.ui
Jun Wu <quark@fb.com>
parents: 34533
diff changeset
880 ui_.disablepager()
32383
f928d53b687c dispatch: setup color before pager for correct console information on windows
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 32054
diff changeset
881
30934
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
882 if options['version']:
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
883 return commands.version_(ui)
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
884 if options['help']:
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
885 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
886 elif not cmd:
6d642ecf1a89 dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents: 30933
diff changeset
887 return commands.help_(ui, 'shortlist')
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
888
30005
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
889 repo = None
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
890 cmdpats = args[:]
30485
acd30a959980 dispatch: stop supporting non-use of @command
Augie Fackler <augie@google.com>
parents: 30473
diff changeset
891 if not func.norepo:
30005
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
892 # 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
893 if not rpath and not cwd:
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
894 repo = req.repo
14510
eccbb9980ada dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents: 14439
diff changeset
895
30005
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
896 if repo:
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
897 # 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
898 repo.ui.fin = ui.fin
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
899 repo.ui.fout = ui.fout
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
900 repo.ui.ferr = ui.ferr
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
901 else:
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
902 try:
32379
71e735bd8170 dispatch: make request accept additional reposetups
Jun Wu <quark@fb.com>
parents: 32377
diff changeset
903 repo = hg.repository(ui, path=path,
71e735bd8170 dispatch: make request accept additional reposetups
Jun Wu <quark@fb.com>
parents: 32377
diff changeset
904 presetupfuncs=req.prereposetups)
30005
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
905 if not repo.local():
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
906 raise error.Abort(_("repository '%s' is not local")
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
907 % path)
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
908 repo.ui.setconfig("bundle", "mainreporoot", repo.root,
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
909 'repo')
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
910 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
911 raise
30005
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
912 except error.RepoError:
35033
d3d35a55e03b dispatch: convert non-list option parsed by _earlygetopt() to string
Yuya Nishihara <yuya@tcha.org>
parents: 35032
diff changeset
913 if rpath: # invalid -R path
30005
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
914 raise
30485
acd30a959980 dispatch: stop supporting non-use of @command
Augie Fackler <augie@google.com>
parents: 30473
diff changeset
915 if not func.optionalrepo:
acd30a959980 dispatch: stop supporting non-use of @command
Augie Fackler <augie@google.com>
parents: 30473
diff changeset
916 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
917 # try to infer -R from command args
35149
e6487522ef92 py3: use pycompat.maplist() instead of map()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35145
diff changeset
918 repos = pycompat.maplist(cmdutil.findrepo, args)
30005
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
919 guess = repos[0]
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
920 if guess and repos.count(guess) == len(repos):
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
921 req.args = ['--repository', guess] + fullargs
35224
6e6d0a5b88e6 dispatch: replace _earlyreq*() with new fancyopts-based parser
Yuya Nishihara <yuya@tcha.org>
parents: 35223
diff changeset
922 req.earlyoptions['repository'] = guess
30005
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
923 return _dispatch(req)
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
924 if not path:
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
925 raise error.RepoError(_("no repository found in"
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
926 " '%s' (.hg not found)")
30519
20a42325fdef py3: use pycompat.getcwd() instead of os.getcwd()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30500
diff changeset
927 % pycompat.getcwd())
30005
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
928 raise
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
929 if repo:
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
930 ui = repo.ui
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
931 if options['hidden']:
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
932 repo = repo.unfiltered()
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
933 args.insert(0, repo)
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
934 elif rpath:
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
935 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
936
31492
3c77414a0f9c dispatch: consolidate formatting of arguments
Augie Fackler <augie@google.com>
parents: 31491
diff changeset
937 msg = _formatargs(fullargs)
30005
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
938 ui.log("command", '%s\n', msg)
30586
2d555d753f0e py3: make keys of keyword arguments strings
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30576
diff changeset
939 strcmdopt = pycompat.strkwargs(cmdoptions)
2d555d753f0e py3: make keys of keyword arguments strings
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30576
diff changeset
940 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
941 try:
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
942 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
943 cmdpats, cmdoptions)
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
944 finally:
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
945 if repo and repo != req.repo:
dfd97e60044c dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents: 29884
diff changeset
946 repo.close()
5178
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
947
18a9fbb5cd78 dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff changeset
948 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
949 """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
950 try:
b19c2679289c dispatch: make hg --profile wrap reposetup
Arun Kulshreshtha <kulshrax@fb.com>
parents: 30005
diff changeset
951 return cmdfunc()
b19c2679289c dispatch: make hg --profile wrap reposetup
Arun Kulshreshtha <kulshrax@fb.com>
parents: 30005
diff changeset
952 except error.SignatureError:
b19c2679289c dispatch: make hg --profile wrap reposetup
Arun Kulshreshtha <kulshrax@fb.com>
parents: 30005
diff changeset
953 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
954
28821
d3369dc6c1d0 dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents: 28784
diff changeset
955 def _exceptionwarning(ui):
d3369dc6c1d0 dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents: 28784
diff changeset
956 """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
957
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
958 # 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
959 # 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
960 # 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
961 # 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
962 # '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
963 # 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
964 # version number and try updating.
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
965 ct = util.versiontuple(n=2)
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
966 worst = None, ct, ''
33499
0407a51b9d8c codemod: register core configitems using a script
Jun Wu <quark@fb.com>
parents: 33053
diff changeset
967 if ui.config('ui', 'supportcontact') is None:
28784
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
968 for name, mod in extensions.extensions():
35899
d5457d94e1c9 py3: replace "if ispy3" by pycompat.sysbytes() or util.forcebytestr()
Yuya Nishihara <yuya@tcha.org>
parents: 35898
diff changeset
969 # 'testedwith' should be bytes, but not all extensions are ported
d5457d94e1c9 py3: replace "if ispy3" by pycompat.sysbytes() or util.forcebytestr()
Yuya Nishihara <yuya@tcha.org>
parents: 35898
diff changeset
970 # to py3 and we don't want UnicodeException because of that.
d5457d94e1c9 py3: replace "if ispy3" by pycompat.sysbytes() or util.forcebytestr()
Yuya Nishihara <yuya@tcha.org>
parents: 35898
diff changeset
971 testedwith = util.forcebytestr(getattr(mod, 'testedwith', ''))
28784
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
972 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
973 if not testedwith.strip():
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
974 # 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
975 worst = name, 'unknown', report
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
976 break
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
977
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
978 # Never blame on extensions bundled with Mercurial.
29884
ed793f41e83f extensions: use ismoduleinternal() thoroughly
Yuya Nishihara <yuya@tcha.org>
parents: 29846
diff changeset
979 if extensions.ismoduleinternal(mod):
28784
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
980 continue
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
981
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
982 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
983 if ct in tested:
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
984 continue
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
985
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
986 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
987 nearest = max(lower or tested)
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
988 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
989 worst = name, nearest, report
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
990 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
991 name, testedwith, report = worst
31179
49ad6bf63107 dispatch: allow testedwith to be bytes or str
Augie Fackler <raf@durin42.com>
parents: 31110
diff changeset
992 if not isinstance(testedwith, (bytes, str)):
36720
3fdba7fb264d py3: use util.forcebytestr to convert testedwith value to bytes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36682
diff changeset
993 testedwith = '.'.join([util.forcebytestr(c) for c in testedwith])
28784
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
994 warning = (_('** Unknown exception encountered with '
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
995 '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
996 '** 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
997 '** 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
998 '** 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
999 % (name, testedwith, name, report))
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
1000 else:
33499
0407a51b9d8c codemod: register core configitems using a script
Jun Wu <quark@fb.com>
parents: 33053
diff changeset
1001 bugtracker = ui.config('ui', 'supportcontact')
28784
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
1002 if bugtracker is None:
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
1003 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
1004 warning = (_("** unknown exception encountered, "
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
1005 "please report by visiting\n** ") + bugtracker + '\n')
35899
d5457d94e1c9 py3: replace "if ispy3" by pycompat.sysbytes() or util.forcebytestr()
Yuya Nishihara <yuya@tcha.org>
parents: 35898
diff changeset
1006 sysversion = pycompat.sysbytes(sys.version).replace('\n', '')
31180
27e3b66ec7c5 dispatch: cope with sys.version being unicode on Python 3
Augie Fackler <raf@durin42.com>
parents: 31179
diff changeset
1007 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
1008 (_("** 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
1009 util.version()) +
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
1010 (_("** Extensions loaded: %s\n") %
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
1011 ", ".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
1012 return warning
d3369dc6c1d0 dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents: 28784
diff changeset
1013
d3369dc6c1d0 dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents: 28784
diff changeset
1014 def handlecommandexception(ui):
d3369dc6c1d0 dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents: 28784
diff changeset
1015 """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
1016
d3369dc6c1d0 dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents: 28784
diff changeset
1017 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
1018 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
1019 """
d3369dc6c1d0 dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents: 28784
diff changeset
1020 warning = _exceptionwarning(ui)
36124
976a9fd706ed py3: convert traceback representation to bytes when logging
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35942
diff changeset
1021 ui.log("commandexception", "%s\n%s\n", warning,
976a9fd706ed py3: convert traceback representation to bytes when logging
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35942
diff changeset
1022 pycompat.sysbytes(traceback.format_exc()))
28784
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
1023 ui.warn(warning)
09750b1231c2 dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents: 28695
diff changeset
1024 return False # re-raise the exception