Mercurial > hg-stable
annotate mercurial/dispatch.py @ 39183:f39efa885a6d
revlog: also detect intermediate snapshots
Also detect intermediate-snapshot done against another previous snapshot.
Doing an intermediate snapshot instead of a full one can reduce the number of
full snapshots we need. They are especially useful for content with a lot of
churn on the same line (eg: the manifest) where having a delta over multiple
revisions can end up being significantly smaller than the sum of these
revision deltas.
A revlog built using intermediate snapshots can be a bit smaller and reuse
snapshot much more efficiently. This last property is useful combined with
constraints on chain length. Using intermediate snapshot can produce
repository with delta chain ten times shorter without impact on the storage
size. Shorter chain lengths are faster to restore, greatly improving read
performance.
This changesets (and the following ones) focus on getting the core principle
of intermediate snapshots into Mercurial core. Later changeset will introduce
the strategy to create them.
author | Paul Morelle <paul.morelle@octobus.net> |
---|---|
date | Fri, 20 Jul 2018 13:34:48 +0200 |
parents | a9ff2b0c11dd |
children | 4019b4542e61 |
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 | 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 |
30581
541949a10a68
fancyopts: switch from fancyopts.getopt.* to getopt.*
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30564
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, |
30657
b2be4ccaff1d
color: load 'colortable' from extension using an 'extraloader'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
30591
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, |
31080
ab20491b1760
dispatch: rearrange 'unknown command' code to better employ pager
Augie Fackler <augie@google.com>
parents:
31047
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, |
29792
2654a0aac80d
profiling: move profiling code from dispatch.py (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29773
diff
changeset
|
36 profiling, |
30477
7f2b18c34c02
py3: use pycompat.sysargv in dispatch.run()
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30411
diff
changeset
|
37 pycompat, |
30529
4338f87dbf6f
dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents:
30528
diff
changeset
|
38 scmutil, |
25932
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
39 ui as uimod, |
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
40 util, |
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
41 ) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
42 |
37087
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36752
diff
changeset
|
43 from .utils import ( |
37122
d4a2e0d5d042
procutil: bulk-replace util.std* to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37087
diff
changeset
|
44 procutil, |
37087
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36752
diff
changeset
|
45 stringutil, |
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36752
diff
changeset
|
46 ) |
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36752
diff
changeset
|
47 |
14438
08bfec2ef031
dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents:
14286
diff
changeset
|
48 class request(object): |
16683 | 49 def __init__(self, args, ui=None, repo=None, fin=None, fout=None, |
32418
71e735bd8170
dispatch: make request accept additional reposetups
Jun Wu <quark@fb.com>
parents:
32416
diff
changeset
|
50 ferr=None, prereposetups=None): |
14438
08bfec2ef031
dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents:
14286
diff
changeset
|
51 self.args = args |
14439
80c599eee3f3
dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents:
14438
diff
changeset
|
52 self.ui = ui |
14510
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
53 self.repo = repo |
14438
08bfec2ef031
dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents:
14286
diff
changeset
|
54 |
14613
ea8938d3a5aa
dispatch: add I/O descriptors to the request
Idan Kamara <idankk86@gmail.com>
parents:
14601
diff
changeset
|
55 # input/output/error streams |
ea8938d3a5aa
dispatch: add I/O descriptors to the request
Idan Kamara <idankk86@gmail.com>
parents:
14601
diff
changeset
|
56 self.fin = fin |
ea8938d3a5aa
dispatch: add I/O descriptors to the request
Idan Kamara <idankk86@gmail.com>
parents:
14601
diff
changeset
|
57 self.fout = fout |
ea8938d3a5aa
dispatch: add I/O descriptors to the request
Idan Kamara <idankk86@gmail.com>
parents:
14601
diff
changeset
|
58 self.ferr = ferr |
ea8938d3a5aa
dispatch: add I/O descriptors to the request
Idan Kamara <idankk86@gmail.com>
parents:
14601
diff
changeset
|
59 |
35233
6e6d0a5b88e6
dispatch: replace _earlyreq*() with new fancyopts-based parser
Yuya Nishihara <yuya@tcha.org>
parents:
35232
diff
changeset
|
60 # remember options pre-parsed by _earlyparseopts() |
34982
d9aba3730d30
dispatch: abort if early boolean options can't be parsed
Yuya Nishihara <yuya@tcha.org>
parents:
34981
diff
changeset
|
61 self.earlyoptions = {} |
d9aba3730d30
dispatch: abort if early boolean options can't be parsed
Yuya Nishihara <yuya@tcha.org>
parents:
34981
diff
changeset
|
62 |
32418
71e735bd8170
dispatch: make request accept additional reposetups
Jun Wu <quark@fb.com>
parents:
32416
diff
changeset
|
63 # reposetups which run before extensions, useful for chg to pre-fill |
71e735bd8170
dispatch: make request accept additional reposetups
Jun Wu <quark@fb.com>
parents:
32416
diff
changeset
|
64 # low-level repo state (for example, changelog) before extensions. |
71e735bd8170
dispatch: make request accept additional reposetups
Jun Wu <quark@fb.com>
parents:
32416
diff
changeset
|
65 self.prereposetups = prereposetups or [] |
71e735bd8170
dispatch: make request accept additional reposetups
Jun Wu <quark@fb.com>
parents:
32416
diff
changeset
|
66 |
31956
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31634
diff
changeset
|
67 def _runexithandlers(self): |
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31634
diff
changeset
|
68 exc = None |
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31634
diff
changeset
|
69 handlers = self.ui._exithandlers |
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31634
diff
changeset
|
70 try: |
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31634
diff
changeset
|
71 while handlers: |
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31634
diff
changeset
|
72 func, args, kwargs = handlers.pop() |
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31634
diff
changeset
|
73 try: |
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31634
diff
changeset
|
74 func(*args, **kwargs) |
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31634
diff
changeset
|
75 except: # re-raises below |
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31634
diff
changeset
|
76 if exc is None: |
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31634
diff
changeset
|
77 exc = sys.exc_info()[1] |
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31634
diff
changeset
|
78 self.ui.warn(('error in exit handlers:\n')) |
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31634
diff
changeset
|
79 self.ui.traceback(force=True) |
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31634
diff
changeset
|
80 finally: |
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31634
diff
changeset
|
81 if exc is not None: |
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31634
diff
changeset
|
82 raise exc |
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31634
diff
changeset
|
83 |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
84 def run(): |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
85 "run the command in sys.argv" |
37988
dc1ed7fe33e4
sshserver: do setbinary() by caller (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37717
diff
changeset
|
86 initstdio() |
31960
71dcd4a4fa2f
stdio: catch StdioError in dispatch.run and clean up appropriately
Bryan O'Sullivan <bryano@fb.com>
parents:
31958
diff
changeset
|
87 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
|
88 err = None |
71dcd4a4fa2f
stdio: catch StdioError in dispatch.run and clean up appropriately
Bryan O'Sullivan <bryano@fb.com>
parents:
31958
diff
changeset
|
89 try: |
38038
6f9ac3cb0987
dispatch: unify handling of None returned by a command function
Yuya Nishihara <yuya@tcha.org>
parents:
38037
diff
changeset
|
90 status = dispatch(req) |
34532
b09b3eaf9c96
py3: work around the scope of exception variable in dispatch.run()
Yuya Nishihara <yuya@tcha.org>
parents:
34486
diff
changeset
|
91 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
|
92 err = e |
31960
71dcd4a4fa2f
stdio: catch StdioError in dispatch.run and clean up appropriately
Bryan O'Sullivan <bryano@fb.com>
parents:
31958
diff
changeset
|
93 status = -1 |
38037
e9c588802529
dispatch: minor code refactor
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37988
diff
changeset
|
94 |
e9c588802529
dispatch: minor code refactor
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37988
diff
changeset
|
95 # In all cases we try to flush stdio streams. |
31960
71dcd4a4fa2f
stdio: catch StdioError in dispatch.run and clean up appropriately
Bryan O'Sullivan <bryano@fb.com>
parents:
31958
diff
changeset
|
96 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
|
97 try: |
32707
12941a782928
dispatch: do not close stdout and stderr, just flush() instead
Yuya Nishihara <yuya@tcha.org>
parents:
32674
diff
changeset
|
98 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
|
99 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
|
100 err = e |
31960
71dcd4a4fa2f
stdio: catch StdioError in dispatch.run and clean up appropriately
Bryan O'Sullivan <bryano@fb.com>
parents:
31958
diff
changeset
|
101 status = -1 |
38037
e9c588802529
dispatch: minor code refactor
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37988
diff
changeset
|
102 |
31960
71dcd4a4fa2f
stdio: catch StdioError in dispatch.run and clean up appropriately
Bryan O'Sullivan <bryano@fb.com>
parents:
31958
diff
changeset
|
103 if util.safehasattr(req.ui, 'ferr'): |
35653
48fe4f56a3b4
dispatch: handle IOError when writing to stderr
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35470
diff
changeset
|
104 try: |
48fe4f56a3b4
dispatch: handle IOError when writing to stderr
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35470
diff
changeset
|
105 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:
35470
diff
changeset
|
106 req.ui.ferr.write('abort: %s\n' % |
48fe4f56a3b4
dispatch: handle IOError when writing to stderr
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35470
diff
changeset
|
107 encoding.strtolocal(err.strerror)) |
48fe4f56a3b4
dispatch: handle IOError when writing to stderr
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35470
diff
changeset
|
108 req.ui.ferr.flush() |
48fe4f56a3b4
dispatch: handle IOError when writing to stderr
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35470
diff
changeset
|
109 # 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:
35470
diff
changeset
|
110 # change the status code and move on. |
48fe4f56a3b4
dispatch: handle IOError when writing to stderr
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35470
diff
changeset
|
111 except IOError: |
48fe4f56a3b4
dispatch: handle IOError when writing to stderr
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35470
diff
changeset
|
112 status = -1 |
36666
e8c361316803
py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents:
36665
diff
changeset
|
113 |
e8c361316803
py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents:
36665
diff
changeset
|
114 _silencestdio() |
31960
71dcd4a4fa2f
stdio: catch StdioError in dispatch.run and clean up appropriately
Bryan O'Sullivan <bryano@fb.com>
parents:
31958
diff
changeset
|
115 sys.exit(status & 255) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
116 |
36665
c263c684da91
py3: conditionalize initialization of stdio flags
Yuya Nishihara <yuya@tcha.org>
parents:
36533
diff
changeset
|
117 if pycompat.ispy3: |
37988
dc1ed7fe33e4
sshserver: do setbinary() by caller (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37717
diff
changeset
|
118 def initstdio(): |
36665
c263c684da91
py3: conditionalize initialization of stdio flags
Yuya Nishihara <yuya@tcha.org>
parents:
36533
diff
changeset
|
119 pass |
36666
e8c361316803
py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents:
36665
diff
changeset
|
120 |
e8c361316803
py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents:
36665
diff
changeset
|
121 def _silencestdio(): |
e8c361316803
py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents:
36665
diff
changeset
|
122 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:
36665
diff
changeset
|
123 # Check if the file is okay |
e8c361316803
py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents:
36665
diff
changeset
|
124 try: |
e8c361316803
py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents:
36665
diff
changeset
|
125 fp.flush() |
e8c361316803
py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents:
36665
diff
changeset
|
126 continue |
e8c361316803
py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents:
36665
diff
changeset
|
127 except IOError: |
e8c361316803
py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents:
36665
diff
changeset
|
128 pass |
e8c361316803
py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents:
36665
diff
changeset
|
129 # 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:
36665
diff
changeset
|
130 # message emitted by the interpreter finalizer. Be careful to |
37122
d4a2e0d5d042
procutil: bulk-replace util.std* to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37087
diff
changeset
|
131 # not close procutil.stdout, which may be a fdopen-ed file object |
d4a2e0d5d042
procutil: bulk-replace util.std* to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37087
diff
changeset
|
132 # and its close() actually closes the underlying file descriptor. |
36666
e8c361316803
py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents:
36665
diff
changeset
|
133 try: |
e8c361316803
py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents:
36665
diff
changeset
|
134 fp.close() |
e8c361316803
py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents:
36665
diff
changeset
|
135 except IOError: |
e8c361316803
py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents:
36665
diff
changeset
|
136 pass |
36665
c263c684da91
py3: conditionalize initialization of stdio flags
Yuya Nishihara <yuya@tcha.org>
parents:
36533
diff
changeset
|
137 else: |
37988
dc1ed7fe33e4
sshserver: do setbinary() by caller (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37717
diff
changeset
|
138 def initstdio(): |
36665
c263c684da91
py3: conditionalize initialization of stdio flags
Yuya Nishihara <yuya@tcha.org>
parents:
36533
diff
changeset
|
139 for fp in (sys.stdin, sys.stdout, sys.stderr): |
37123
a8a902d7176e
procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37122
diff
changeset
|
140 procutil.setbinary(fp) |
34533
163fa0aea71e
dispatch: move initialization of sys.std* files
Yuya Nishihara <yuya@tcha.org>
parents:
34532
diff
changeset
|
141 |
36666
e8c361316803
py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents:
36665
diff
changeset
|
142 def _silencestdio(): |
e8c361316803
py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents:
36665
diff
changeset
|
143 pass |
e8c361316803
py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents:
36665
diff
changeset
|
144 |
24221
4e240d6ab898
dispatch: offer near-edit-distance suggestions for {file,rev}set functions
Augie Fackler <augie@google.com>
parents:
24163
diff
changeset
|
145 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
|
146 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
|
147 # 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
|
148 # 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
|
149 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
|
150 |
27623
b3376fba4ab9
dispatch: report similar names consistently
Bryan O'Sullivan <bos@serpentine.com>
parents:
27615
diff
changeset
|
151 def _reportsimilar(write, similar): |
b3376fba4ab9
dispatch: report similar names consistently
Bryan O'Sullivan <bos@serpentine.com>
parents:
27615
diff
changeset
|
152 if len(similar) == 1: |
b3376fba4ab9
dispatch: report similar names consistently
Bryan O'Sullivan <bos@serpentine.com>
parents:
27615
diff
changeset
|
153 write(_("(did you mean %s?)\n") % similar[0]) |
b3376fba4ab9
dispatch: report similar names consistently
Bryan O'Sullivan <bos@serpentine.com>
parents:
27615
diff
changeset
|
154 elif similar: |
b3376fba4ab9
dispatch: report similar names consistently
Bryan O'Sullivan <bos@serpentine.com>
parents:
27615
diff
changeset
|
155 ss = ", ".join(sorted(similar)) |
b3376fba4ab9
dispatch: report similar names consistently
Bryan O'Sullivan <bos@serpentine.com>
parents:
27615
diff
changeset
|
156 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
|
157 |
24039
2ee35b6ee4fb
dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents:
23871
diff
changeset
|
158 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
|
159 similar = [] |
4e240d6ab898
dispatch: offer near-edit-distance suggestions for {file,rev}set functions
Augie Fackler <augie@google.com>
parents:
24163
diff
changeset
|
160 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
|
161 # 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
|
162 similar = _getsimilar(inst.symbols, inst.function) |
24039
2ee35b6ee4fb
dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents:
23871
diff
changeset
|
163 if len(inst.args) > 1: |
2ee35b6ee4fb
dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents:
23871
diff
changeset
|
164 write(_("hg: parse error at %s: %s\n") % |
36533
8b662717c53f
py3: use bytestr() to coerce position carried by ParseError to string
Yuya Nishihara <yuya@tcha.org>
parents:
36162
diff
changeset
|
165 (pycompat.bytestr(inst.args[1]), inst.args[0])) |
36752
389b950f5190
py3: use startswith() instead of slicing to detect leading whitespace
Yuya Nishihara <yuya@tcha.org>
parents:
36743
diff
changeset
|
166 if inst.args[0].startswith(' '): |
24039
2ee35b6ee4fb
dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents:
23871
diff
changeset
|
167 write(_("unexpected leading whitespace\n")) |
2ee35b6ee4fb
dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents:
23871
diff
changeset
|
168 else: |
2ee35b6ee4fb
dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents:
23871
diff
changeset
|
169 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
|
170 _reportsimilar(write, similar) |
28515
491eabd0df79
dispatch: extract common logic for handling ParseError
Jun Wu <quark@fb.com>
parents:
28447
diff
changeset
|
171 if inst.hint: |
491eabd0df79
dispatch: extract common logic for handling ParseError
Jun Wu <quark@fb.com>
parents:
28447
diff
changeset
|
172 write(_("(%s)\n") % inst.hint) |
24039
2ee35b6ee4fb
dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents:
23871
diff
changeset
|
173 |
31499
3c77414a0f9c
dispatch: consolidate formatting of arguments
Augie Fackler <augie@google.com>
parents:
31498
diff
changeset
|
174 def _formatargs(args): |
37123
a8a902d7176e
procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37122
diff
changeset
|
175 return ' '.join(procutil.shellquote(a) for a in args) |
31499
3c77414a0f9c
dispatch: consolidate formatting of arguments
Augie Fackler <augie@google.com>
parents:
31498
diff
changeset
|
176 |
14438
08bfec2ef031
dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents:
14286
diff
changeset
|
177 def dispatch(req): |
38038
6f9ac3cb0987
dispatch: unify handling of None returned by a command function
Yuya Nishihara <yuya@tcha.org>
parents:
38037
diff
changeset
|
178 """run the command specified in req.args; returns an integer status code""" |
14615
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
179 if req.ferr: |
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
180 ferr = req.ferr |
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
181 elif req.ui: |
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
182 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
|
183 else: |
37122
d4a2e0d5d042
procutil: bulk-replace util.std* to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37087
diff
changeset
|
184 ferr = procutil.stderr |
14615
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
185 |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
186 try: |
14439
80c599eee3f3
dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents:
14438
diff
changeset
|
187 if not req.ui: |
30564
d83ca854fa21
ui: factor out ui.load() to create a ui without loading configs (API)
Yuya Nishihara <yuya@tcha.org>
parents:
30529
diff
changeset
|
188 req.ui = uimod.ui.load() |
35233
6e6d0a5b88e6
dispatch: replace _earlyreq*() with new fancyopts-based parser
Yuya Nishihara <yuya@tcha.org>
parents:
35232
diff
changeset
|
189 req.earlyoptions.update(_earlyparseopts(req.ui, req.args)) |
6e6d0a5b88e6
dispatch: replace _earlyreq*() with new fancyopts-based parser
Yuya Nishihara <yuya@tcha.org>
parents:
35232
diff
changeset
|
190 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
|
191 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
|
192 |
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
193 # 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
|
194 if req.fin: |
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
195 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
|
196 if req.fout: |
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
197 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
|
198 if req.ferr: |
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
199 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
|
200 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
|
201 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
|
202 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
|
203 ferr.write(_("(%s)\n") % inst.hint) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
204 return -1 |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25329
diff
changeset
|
205 except error.ParseError as inst: |
24039
2ee35b6ee4fb
dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents:
23871
diff
changeset
|
206 _formatparse(ferr.write, inst) |
9470
ba75830d17a9
dispatch: catch ConfigError while constructing ui
Martin Geisler <mg@lazybytes.net>
parents:
8936
diff
changeset
|
207 return -1 |
14615
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
208 |
31499
3c77414a0f9c
dispatch: consolidate formatting of arguments
Augie Fackler <augie@google.com>
parents:
31498
diff
changeset
|
209 msg = _formatargs(req.args) |
30995
22fbca1d11ed
mercurial: switch to util.timer for all interval timings
Simon Farnsworth <simonfar@fb.com>
parents:
30954
diff
changeset
|
210 starttime = util.timer() |
38064
48853a927757
dispatch: fix exit code of unhandled exception recorded in blackbox log
Yuya Nishihara <yuya@tcha.org>
parents:
38038
diff
changeset
|
211 ret = 1 # default of Python exit code on unhandled exception |
19229
41e39a0299cb
blackbox: fix recording exit codes (issue3938)
Durham Goode <durham@fb.com>
parents:
19099
diff
changeset
|
212 try: |
38038
6f9ac3cb0987
dispatch: unify handling of None returned by a command function
Yuya Nishihara <yuya@tcha.org>
parents:
38037
diff
changeset
|
213 ret = _runcatch(req) or 0 |
32379
9c023179e8d0
error: add hint to ProgrammingError
Yuya Nishihara <yuya@tcha.org>
parents:
32331
diff
changeset
|
214 except error.ProgrammingError as inst: |
38809
afc4ad706f9c
dispatch: making all hg abortions be output with a specific label
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents:
38535
diff
changeset
|
215 req.ui.error(_('** ProgrammingError: %s\n') % inst) |
32379
9c023179e8d0
error: add hint to ProgrammingError
Yuya Nishihara <yuya@tcha.org>
parents:
32331
diff
changeset
|
216 if inst.hint: |
38809
afc4ad706f9c
dispatch: making all hg abortions be output with a specific label
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents:
38535
diff
changeset
|
217 req.ui.error(_('** (%s)\n') % inst.hint) |
32379
9c023179e8d0
error: add hint to ProgrammingError
Yuya Nishihara <yuya@tcha.org>
parents:
32331
diff
changeset
|
218 raise |
32165
1208b74841ff
dispatch: take over SignalInterrupt handling from scmutil
Jun Wu <quark@fb.com>
parents:
32054
diff
changeset
|
219 except KeyboardInterrupt as inst: |
28520
84cc72c5771e
dispatch: catch KeyboardInterrupt more broadly
Yuya Nishihara <yuya@tcha.org>
parents:
28515
diff
changeset
|
220 try: |
32165
1208b74841ff
dispatch: take over SignalInterrupt handling from scmutil
Jun Wu <quark@fb.com>
parents:
32054
diff
changeset
|
221 if isinstance(inst, error.SignalInterrupt): |
1208b74841ff
dispatch: take over SignalInterrupt handling from scmutil
Jun Wu <quark@fb.com>
parents:
32054
diff
changeset
|
222 msg = _("killed!\n") |
1208b74841ff
dispatch: take over SignalInterrupt handling from scmutil
Jun Wu <quark@fb.com>
parents:
32054
diff
changeset
|
223 else: |
1208b74841ff
dispatch: take over SignalInterrupt handling from scmutil
Jun Wu <quark@fb.com>
parents:
32054
diff
changeset
|
224 msg = _("interrupted!\n") |
38809
afc4ad706f9c
dispatch: making all hg abortions be output with a specific label
Rodrigo Damazio Bovendorp <rdamazio@google.com>
parents:
38535
diff
changeset
|
225 req.ui.error(msg) |
32044
cde72a195f32
dispatch: ignore further SIGPIPE while handling KeyboardInterrupt
Yuya Nishihara <yuya@tcha.org>
parents:
32041
diff
changeset
|
226 except error.SignalInterrupt: |
cde72a195f32
dispatch: ignore further SIGPIPE while handling KeyboardInterrupt
Yuya Nishihara <yuya@tcha.org>
parents:
32041
diff
changeset
|
227 # 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
|
228 # 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
|
229 pass |
28520
84cc72c5771e
dispatch: catch KeyboardInterrupt more broadly
Yuya Nishihara <yuya@tcha.org>
parents:
28515
diff
changeset
|
230 except IOError as inst: |
84cc72c5771e
dispatch: catch KeyboardInterrupt more broadly
Yuya Nishihara <yuya@tcha.org>
parents:
28515
diff
changeset
|
231 if inst.errno != errno.EPIPE: |
84cc72c5771e
dispatch: catch KeyboardInterrupt more broadly
Yuya Nishihara <yuya@tcha.org>
parents:
28515
diff
changeset
|
232 raise |
84cc72c5771e
dispatch: catch KeyboardInterrupt more broadly
Yuya Nishihara <yuya@tcha.org>
parents:
28515
diff
changeset
|
233 ret = -1 |
19229
41e39a0299cb
blackbox: fix recording exit codes (issue3938)
Durham Goode <durham@fb.com>
parents:
19099
diff
changeset
|
234 finally: |
30995
22fbca1d11ed
mercurial: switch to util.timer for all interval timings
Simon Farnsworth <simonfar@fb.com>
parents:
30954
diff
changeset
|
235 duration = util.timer() - starttime |
28534
293adbaa14a7
dispatch: flush ui before returning from dispatch
Jun Wu <quark@fb.com>
parents:
28520
diff
changeset
|
236 req.ui.flush() |
30996
e92daf156d5c
ui: provide a mechanism to track and log blocked time
Simon Farnsworth <simonfar@fb.com>
parents:
30995
diff
changeset
|
237 if req.ui.logblockedtimes: |
e92daf156d5c
ui: provide a mechanism to track and log blocked time
Simon Farnsworth <simonfar@fb.com>
parents:
30995
diff
changeset
|
238 req.ui._blockedtimes['command_duration'] = duration * 1000 |
35363
08f28f58f863
py3: handle keyword arguments correctly in dispatch.py
Pulkit Goyal <7895pulkit@gmail.com>
parents:
35234
diff
changeset
|
239 req.ui.log('uiblocked', 'ui blocked ms', |
08f28f58f863
py3: handle keyword arguments correctly in dispatch.py
Pulkit Goyal <7895pulkit@gmail.com>
parents:
35234
diff
changeset
|
240 **pycompat.strkwargs(req.ui._blockedtimes)) |
32183
c3dcec6cbc1b
py3: use %d instead of %s for integers
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32165
diff
changeset
|
241 req.ui.log("commandfinish", "%s exited %d after %0.2f seconds\n", |
38065
c3fd9a0f8277
dispatch: mask negative exit code recorded in blackbox log
Yuya Nishihara <yuya@tcha.org>
parents:
38064
diff
changeset
|
242 msg, ret & 255, duration) |
31956
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31634
diff
changeset
|
243 try: |
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31634
diff
changeset
|
244 req._runexithandlers() |
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31634
diff
changeset
|
245 except: # exiting, so no re-raises |
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31634
diff
changeset
|
246 ret = ret or -1 |
28520
84cc72c5771e
dispatch: catch KeyboardInterrupt more broadly
Yuya Nishihara <yuya@tcha.org>
parents:
28515
diff
changeset
|
247 return ret |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
248 |
14439
80c599eee3f3
dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents:
14438
diff
changeset
|
249 def _runcatch(req): |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
250 def catchterm(*args): |
7644
182b7114d35a
error: move SignalInterrupt
Matt Mackall <mpm@selenic.com>
parents:
7643
diff
changeset
|
251 raise error.SignalInterrupt |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
252 |
14439
80c599eee3f3
dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents:
14438
diff
changeset
|
253 ui = req.ui |
10952
6c2c766afefe
dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents:
10793
diff
changeset
|
254 try: |
6c2c766afefe
dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents:
10793
diff
changeset
|
255 for name in 'SIGBREAK', 'SIGHUP', 'SIGTERM': |
6c2c766afefe
dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents:
10793
diff
changeset
|
256 num = getattr(signal, name, None) |
6c2c766afefe
dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents:
10793
diff
changeset
|
257 if num: |
6c2c766afefe
dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents:
10793
diff
changeset
|
258 signal.signal(num, catchterm) |
6c2c766afefe
dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents:
10793
diff
changeset
|
259 except ValueError: |
6c2c766afefe
dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents:
10793
diff
changeset
|
260 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
|
261 |
29773
39149b6036e6
dispatch: split global error handling out so it can be reused
Jun Wu <quark@fb.com>
parents:
29132
diff
changeset
|
262 def _runcatchfunc(): |
32050
77eaf9539499
dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents:
30681
diff
changeset
|
263 realcmd = None |
77eaf9539499
dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents:
30681
diff
changeset
|
264 try: |
77eaf9539499
dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents:
30681
diff
changeset
|
265 cmdargs = fancyopts.fancyopts(req.args[:], commands.globalopts, {}) |
77eaf9539499
dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents:
30681
diff
changeset
|
266 cmd = cmdargs[0] |
77eaf9539499
dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents:
30681
diff
changeset
|
267 aliases, entry = cmdutil.findcmd(cmd, commands.table, False) |
77eaf9539499
dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents:
30681
diff
changeset
|
268 realcmd = aliases[0] |
77eaf9539499
dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents:
30681
diff
changeset
|
269 except (error.UnknownCommand, error.AmbiguousCommand, |
77eaf9539499
dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents:
30681
diff
changeset
|
270 IndexError, getopt.GetoptError): |
77eaf9539499
dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents:
30681
diff
changeset
|
271 # 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:
30681
diff
changeset
|
272 # 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:
30681
diff
changeset
|
273 # 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:
30681
diff
changeset
|
274 # 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:
30681
diff
changeset
|
275 pass |
77eaf9539499
dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents:
30681
diff
changeset
|
276 if realcmd == 'serve' and '--stdio' in cmdargs: |
77eaf9539499
dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents:
30681
diff
changeset
|
277 # 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:
30681
diff
changeset
|
278 # 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:
30681
diff
changeset
|
279 # 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:
30681
diff
changeset
|
280 # 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:
30681
diff
changeset
|
281 # any repo name that starts with '--' to prevent |
77eaf9539499
dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents:
30681
diff
changeset
|
282 # shenanigans wherein a user does something like pass |
77eaf9539499
dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents:
30681
diff
changeset
|
283 # --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:
30681
diff
changeset
|
284 # name. This used to actually run the debugger. |
77eaf9539499
dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents:
30681
diff
changeset
|
285 if (len(req.args) != 4 or |
77eaf9539499
dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents:
30681
diff
changeset
|
286 req.args[0] != '-R' or |
77eaf9539499
dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents:
30681
diff
changeset
|
287 req.args[1].startswith('--') or |
77eaf9539499
dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents:
30681
diff
changeset
|
288 req.args[2] != 'serve' or |
77eaf9539499
dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents:
30681
diff
changeset
|
289 req.args[3] != '--stdio'): |
77eaf9539499
dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents:
30681
diff
changeset
|
290 raise error.Abort( |
38143
b0144fc8b681
py3: use stringutil.pprint() to prevent b'' prefixes in output
Pulkit Goyal <7895pulkit@gmail.com>
parents:
38067
diff
changeset
|
291 _('potentially unsafe serve --stdio invocation: %s') % |
b0144fc8b681
py3: use stringutil.pprint() to prevent b'' prefixes in output
Pulkit Goyal <7895pulkit@gmail.com>
parents:
38067
diff
changeset
|
292 (stringutil.pprint(req.args),)) |
32050
77eaf9539499
dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents:
30681
diff
changeset
|
293 |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
294 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
|
295 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
|
296 debugtrace = { |
34486
a57c938e7ac8
style: never use a space before a colon or comma
Alex Gaynor <agaynor@mozilla.com>
parents:
34313
diff
changeset
|
297 '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
|
298 } |
472fa3b782b1
dispatch: add ability to specify a custom pdb module as a debugger
Sean Farley <sean.michael.farley@gmail.com>
parents:
19639
diff
changeset
|
299 debugmortem = { |
34486
a57c938e7ac8
style: never use a space before a colon or comma
Alex Gaynor <agaynor@mozilla.com>
parents:
34313
diff
changeset
|
300 '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
|
301 } |
19639
09573ad59f7b
dispatch: move command line --config argument parsing to _runcatch()
Sean Farley <sean.michael.farley@gmail.com>
parents:
19229
diff
changeset
|
302 |
09573ad59f7b
dispatch: move command line --config argument parsing to _runcatch()
Sean Farley <sean.michael.farley@gmail.com>
parents:
19229
diff
changeset
|
303 # 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
|
304 # (e.g. to change trust settings for reading .hg/hgrc) |
35233
6e6d0a5b88e6
dispatch: replace _earlyreq*() with new fancyopts-based parser
Yuya Nishihara <yuya@tcha.org>
parents:
35232
diff
changeset
|
305 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
|
306 |
09573ad59f7b
dispatch: move command line --config argument parsing to _runcatch()
Sean Farley <sean.michael.farley@gmail.com>
parents:
19229
diff
changeset
|
307 if req.repo: |
09573ad59f7b
dispatch: move command line --config argument parsing to _runcatch()
Sean Farley <sean.michael.farley@gmail.com>
parents:
19229
diff
changeset
|
308 # 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
|
309 # the repo ui |
20796
131f7fe06e9e
check-code: check for argument passing py2.6ism
Matt Mackall <mpm@selenic.com>
parents:
20788
diff
changeset
|
310 for sec, name, val in cfgs: |
131f7fe06e9e
check-code: check for argument passing py2.6ism
Matt Mackall <mpm@selenic.com>
parents:
20788
diff
changeset
|
311 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
|
312 |
25833
8243e999f22b
debugger: mark developer-only option
Matt Mackall <mpm@selenic.com>
parents:
25660
diff
changeset
|
313 # 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
|
314 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
|
315 debugmod = pdb |
20122
8f4a226c840c
dispatch: turn off custom debugger for HGPLAIN mode
Sean Farley <sean.michael.farley@gmail.com>
parents:
19640
diff
changeset
|
316 if not debugger or ui.plain(): |
25833
8243e999f22b
debugger: mark developer-only option
Matt Mackall <mpm@selenic.com>
parents:
25660
diff
changeset
|
317 # 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
|
318 debugger = 'pdb' |
35233
6e6d0a5b88e6
dispatch: replace _earlyreq*() with new fancyopts-based parser
Yuya Nishihara <yuya@tcha.org>
parents:
35232
diff
changeset
|
319 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
|
320 # 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
|
321 # 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
|
322 # debugging has been requested |
25329
101e84121c13
dispatch: disable demandimport for the --debugger option
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
25277
diff
changeset
|
323 with demandimport.deactivated(): |
101e84121c13
dispatch: disable demandimport for the --debugger option
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
25277
diff
changeset
|
324 try: |
101e84121c13
dispatch: disable demandimport for the --debugger option
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
25277
diff
changeset
|
325 debugmod = __import__(debugger) |
101e84121c13
dispatch: disable demandimport for the --debugger option
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
25277
diff
changeset
|
326 except ImportError: |
101e84121c13
dispatch: disable demandimport for the --debugger option
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
25277
diff
changeset
|
327 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
|
328 |
472fa3b782b1
dispatch: add ability to specify a custom pdb module as a debugger
Sean Farley <sean.michael.farley@gmail.com>
parents:
19639
diff
changeset
|
329 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
|
330 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
|
331 |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
332 # enter the debugger before command execution |
35233
6e6d0a5b88e6
dispatch: replace _earlyreq*() with new fancyopts-based parser
Yuya Nishihara <yuya@tcha.org>
parents:
35232
diff
changeset
|
333 if req.earlyoptions['debugger']: |
11495
6ee107782018
debugger: give a little intro before entering pdb
Mads Kiilerich <mads@kiilerich.com>
parents:
11494
diff
changeset
|
334 ui.warn(_("entering debugger - " |
6ee107782018
debugger: give a little intro before entering pdb
Mads Kiilerich <mads@kiilerich.com>
parents:
11494
diff
changeset
|
335 "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
|
336 |
472fa3b782b1
dispatch: add ability to specify a custom pdb module as a debugger
Sean Farley <sean.michael.farley@gmail.com>
parents:
19639
diff
changeset
|
337 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
|
338 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
|
339 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
|
340 "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
|
341 with demandimport.deactivated(): |
26216
e86d12404d69
dispatch: disable demandimport when invoking the debugger
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
26191
diff
changeset
|
342 debugtrace[debugger]() |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
343 try: |
14439
80c599eee3f3
dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents:
14438
diff
changeset
|
344 return _dispatch(req) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
345 finally: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
346 ui.flush() |
16705
c2d9ef43ff6c
check-code: ignore naked excepts with a "re-raise" comment
Brodie Rao <brodie@sf.io>
parents:
16686
diff
changeset
|
347 except: # re-raises |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
348 # enter the debugger when we hit an exception |
35233
6e6d0a5b88e6
dispatch: replace _earlyreq*() with new fancyopts-based parser
Yuya Nishihara <yuya@tcha.org>
parents:
35232
diff
changeset
|
349 if req.earlyoptions['debugger']: |
11494
2347513f562a
debugger: show traceback before entering pdb post-mortem
Mads Kiilerich <mads@kiilerich.com>
parents:
11330
diff
changeset
|
350 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
|
351 debugmortem[debugger](sys.exc_info()[2]) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
352 raise |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
353 |
32040
0fb78cb90ca7
dispatch: mark callcatch() as a private function
Yuya Nishihara <yuya@tcha.org>
parents:
31960
diff
changeset
|
354 return _callcatch(ui, _runcatchfunc) |
29773
39149b6036e6
dispatch: split global error handling out so it can be reused
Jun Wu <quark@fb.com>
parents:
29132
diff
changeset
|
355 |
32040
0fb78cb90ca7
dispatch: mark callcatch() as a private function
Yuya Nishihara <yuya@tcha.org>
parents:
31960
diff
changeset
|
356 def _callcatch(ui, func): |
30529
4338f87dbf6f
dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents:
30528
diff
changeset
|
357 """like scmutil.callcatch but handles more high-level exceptions about |
4338f87dbf6f
dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents:
30528
diff
changeset
|
358 config parsing and commands. besides, use handlecommandexception to handle |
4338f87dbf6f
dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents:
30528
diff
changeset
|
359 uncaught exceptions. |
29773
39149b6036e6
dispatch: split global error handling out so it can be reused
Jun Wu <quark@fb.com>
parents:
29132
diff
changeset
|
360 """ |
39149b6036e6
dispatch: split global error handling out so it can be reused
Jun Wu <quark@fb.com>
parents:
29132
diff
changeset
|
361 try: |
30529
4338f87dbf6f
dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents:
30528
diff
changeset
|
362 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
|
363 except error.AmbiguousCommand as inst: |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
364 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
|
365 (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
|
366 except error.CommandError as inst: |
7645
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
367 if inst.args[0]: |
31276
8089de5fab89
dispatch: add pagination of two more help cases
Augie Fackler <augie@google.com>
parents:
31209
diff
changeset
|
368 ui.pager('help') |
32643
3ce53a499334
dispatch: convert exception payload to bytes more carefully
Augie Fackler <raf@durin42.com>
parents:
32599
diff
changeset
|
369 msgbytes = pycompat.bytestr(inst.args[1]) |
3ce53a499334
dispatch: convert exception payload to bytes more carefully
Augie Fackler <raf@durin42.com>
parents:
32599
diff
changeset
|
370 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
|
371 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
|
372 else: |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
373 ui.warn(_("hg: %s\n") % inst.args[1]) |
38828
a9ff2b0c11dd
dispatch: show a short error message when invalid global option given
Martin von Zweigbergk <martinvonz@google.com>
parents:
38827
diff
changeset
|
374 ui.warn(_("(use 'hg help -v' for a list of global options)\n")) |
30529
4338f87dbf6f
dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents:
30528
diff
changeset
|
375 except error.ParseError as inst: |
4338f87dbf6f
dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents:
30528
diff
changeset
|
376 _formatparse(ui.warn, inst) |
4338f87dbf6f
dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents:
30528
diff
changeset
|
377 return -1 |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25329
diff
changeset
|
378 except error.UnknownCommand as inst: |
31080
ab20491b1760
dispatch: rearrange 'unknown command' code to better employ pager
Augie Fackler <augie@google.com>
parents:
31047
diff
changeset
|
379 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
|
380 try: |
de1e7099d100
dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents:
10282
diff
changeset
|
381 # 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
|
382 # (but don't check for extensions themselves) |
32599
1b90036f42f0
help: pass commands module by argument
Yuya Nishihara <yuya@tcha.org>
parents:
32418
diff
changeset
|
383 formatted = help.formattedhelp(ui, commands, inst.args[0], |
1b90036f42f0
help: pass commands module by argument
Yuya Nishihara <yuya@tcha.org>
parents:
32418
diff
changeset
|
384 unknowncmd=True) |
31080
ab20491b1760
dispatch: rearrange 'unknown command' code to better employ pager
Augie Fackler <augie@google.com>
parents:
31047
diff
changeset
|
385 ui.warn(nocmdmsg) |
ab20491b1760
dispatch: rearrange 'unknown command' code to better employ pager
Augie Fackler <augie@google.com>
parents:
31047
diff
changeset
|
386 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
|
387 except (error.UnknownCommand, error.Abort): |
24222
02d7b5cd373b
dispatch: offer suggestions of similar-named commands
Augie Fackler <augie@google.com>
parents:
24221
diff
changeset
|
388 suggested = False |
02d7b5cd373b
dispatch: offer suggestions of similar-named commands
Augie Fackler <augie@google.com>
parents:
24221
diff
changeset
|
389 if len(inst.args) == 2: |
02d7b5cd373b
dispatch: offer suggestions of similar-named commands
Augie Fackler <augie@google.com>
parents:
24221
diff
changeset
|
390 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
|
391 if sim: |
31080
ab20491b1760
dispatch: rearrange 'unknown command' code to better employ pager
Augie Fackler <augie@google.com>
parents:
31047
diff
changeset
|
392 ui.warn(nocmdmsg) |
27623
b3376fba4ab9
dispatch: report similar names consistently
Bryan O'Sullivan <bos@serpentine.com>
parents:
27615
diff
changeset
|
393 _reportsimilar(ui.warn, sim) |
24222
02d7b5cd373b
dispatch: offer suggestions of similar-named commands
Augie Fackler <augie@google.com>
parents:
24221
diff
changeset
|
394 suggested = True |
02d7b5cd373b
dispatch: offer suggestions of similar-named commands
Augie Fackler <augie@google.com>
parents:
24221
diff
changeset
|
395 if not suggested: |
31080
ab20491b1760
dispatch: rearrange 'unknown command' code to better employ pager
Augie Fackler <augie@google.com>
parents:
31047
diff
changeset
|
396 ui.warn(nocmdmsg) |
38827
5199c5b6fd29
dispatch: don't show list of commands on bogus command
Martin von Zweigbergk <martinvonz@google.com>
parents:
38809
diff
changeset
|
397 ui.warn(_("(use 'hg help' for a list of commands)\n")) |
30529
4338f87dbf6f
dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents:
30528
diff
changeset
|
398 except IOError: |
4338f87dbf6f
dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents:
30528
diff
changeset
|
399 raise |
7645
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
400 except KeyboardInterrupt: |
28520
84cc72c5771e
dispatch: catch KeyboardInterrupt more broadly
Yuya Nishihara <yuya@tcha.org>
parents:
28515
diff
changeset
|
401 raise |
30529
4338f87dbf6f
dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents:
30528
diff
changeset
|
402 except: # probably re-raises |
28784
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
403 if not handlecommandexception(ui): |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
404 raise |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
405 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
406 return -1 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
407 |
14265
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
408 def aliasargs(fn, givenargs): |
34104
5361771f9714
wrapfunction: use functools.partial if possible
Jun Wu <quark@fb.com>
parents:
34040
diff
changeset
|
409 args = [] |
5361771f9714
wrapfunction: use functools.partial if possible
Jun Wu <quark@fb.com>
parents:
34040
diff
changeset
|
410 # only care about alias 'args', ignore 'args' set by extensions.wrapfunction |
5361771f9714
wrapfunction: use functools.partial if possible
Jun Wu <quark@fb.com>
parents:
34040
diff
changeset
|
411 if not util.safehasattr(fn, '_origfunc'): |
5361771f9714
wrapfunction: use functools.partial if possible
Jun Wu <quark@fb.com>
parents:
34040
diff
changeset
|
412 args = getattr(fn, 'args', args) |
16294
795d591b6ef5
alias: abort on missing positional args (issue3331)
Matt Mackall <mpm@selenic.com>
parents:
16277
diff
changeset
|
413 if args: |
37123
a8a902d7176e
procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37122
diff
changeset
|
414 cmd = ' '.join(map(procutil.shellquote, args)) |
14265
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
415 |
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
416 nums = [] |
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
417 def replacer(m): |
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
418 num = int(m.group(1)) - 1 |
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
419 nums.append(num) |
16277
1c2aaf05f7d7
aliases: use empty string for missing position parameters (issue3331)
Matt Mackall <mpm@selenic.com>
parents:
15781
diff
changeset
|
420 if num < len(givenargs): |
1c2aaf05f7d7
aliases: use empty string for missing position parameters (issue3331)
Matt Mackall <mpm@selenic.com>
parents:
15781
diff
changeset
|
421 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
|
422 raise error.Abort(_('too few arguments for command alias')) |
31498
492c64afc54c
py3: make the regular expression bytes to prevent TypeError
Pulkit Goyal <7895pulkit@gmail.com>
parents:
31314
diff
changeset
|
423 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
|
424 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
|
425 if i not in nums] |
30681
caf7e1c5efe4
py3: have a bytes version of shlex.split()
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30657
diff
changeset
|
426 args = pycompat.shlexsplit(cmd) |
14265
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
427 return args + givenargs |
8655 | 428 |
22158
bc2132dfc0a4
alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents:
21961
diff
changeset
|
429 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
|
430 '''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
|
431 |
bc2132dfc0a4
alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents:
21961
diff
changeset
|
432 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
|
433 ''' |
bc2132dfc0a4
alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents:
21961
diff
changeset
|
434 # 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
|
435 # 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
|
436 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
|
437 replacemap['$0'] = name |
bc2132dfc0a4
alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents:
21961
diff
changeset
|
438 replacemap['$$'] = '$' |
bc2132dfc0a4
alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents:
21961
diff
changeset
|
439 replacemap['$@'] = ' '.join(args) |
bc2132dfc0a4
alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents:
21961
diff
changeset
|
440 # 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
|
441 # 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
|
442 # 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
|
443 # tokenize each argument into exactly one word. |
37123
a8a902d7176e
procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37122
diff
changeset
|
444 replacemap['"$@"'] = ' '.join(procutil.shellquote(arg) for arg in args) |
22158
bc2132dfc0a4
alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents:
21961
diff
changeset
|
445 # escape '\$' for regex |
35166
25c543944bc0
py3: add b'' to regular expressions which are raw strings
Pulkit Goyal <7895pulkit@gmail.com>
parents:
34781
diff
changeset
|
446 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
|
447 r = re.compile(regex) |
bc2132dfc0a4
alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents:
21961
diff
changeset
|
448 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
|
449 |
8655 | 450 class cmdalias(object): |
37137
6890b7e991a4
help: supporting both help and doc for aliases
Rodrigo Damazio <rdamazio@google.com>
parents:
37123
diff
changeset
|
451 def __init__(self, ui, name, definition, cmdtable, source): |
12039
18e1e7520b67
alias: make shadowing behavior more consistent (issue2054)
Brodie Rao <brodie@bitheap.org>
parents:
11712
diff
changeset
|
452 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
|
453 self.cmdname = '' |
8655 | 454 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
|
455 self.fn = None |
29087
ad1bdea43965
dispatch: defer environment variable resolution in alias commands (BC)
Jun Wu <quark@fb.com>
parents:
28861
diff
changeset
|
456 self.givenargs = [] |
8655 | 457 self.opts = [] |
458 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
|
459 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
|
460 self.unknowncmd = False |
28828
3640c1702c43
help: report source of aliases
timeless <timeless@mozdev.org>
parents:
28821
diff
changeset
|
461 self.source = source |
8655 | 462 |
463 try: | |
12039
18e1e7520b67
alias: make shadowing behavior more consistent (issue2054)
Brodie Rao <brodie@bitheap.org>
parents:
11712
diff
changeset
|
464 aliases, entry = cmdutil.findcmd(self.name, cmdtable) |
18e1e7520b67
alias: make shadowing behavior more consistent (issue2054)
Brodie Rao <brodie@bitheap.org>
parents:
11712
diff
changeset
|
465 for alias, e in cmdtable.iteritems(): |
18e1e7520b67
alias: make shadowing behavior more consistent (issue2054)
Brodie Rao <brodie@bitheap.org>
parents:
11712
diff
changeset
|
466 if e is entry: |
18e1e7520b67
alias: make shadowing behavior more consistent (issue2054)
Brodie Rao <brodie@bitheap.org>
parents:
11712
diff
changeset
|
467 self.cmd = alias |
18e1e7520b67
alias: make shadowing behavior more consistent (issue2054)
Brodie Rao <brodie@bitheap.org>
parents:
11712
diff
changeset
|
468 break |
8655 | 469 self.shadows = True |
470 except error.UnknownCommand: | |
471 self.shadows = False | |
472 | |
473 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
|
474 self.badalias = _("no definition for alias '%s'") % self.name |
8655 | 475 return |
476 | |
11524
24965bb270b7
dispatch: add shell aliases
Steve Losh <steve@stevelosh.com>
parents:
11495
diff
changeset
|
477 if self.definition.startswith('!'): |
37137
6890b7e991a4
help: supporting both help and doc for aliases
Rodrigo Damazio <rdamazio@google.com>
parents:
37123
diff
changeset
|
478 shdef = self.definition[1:] |
12536
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
479 self.shell = True |
11524
24965bb270b7
dispatch: add shell aliases
Steve Losh <steve@stevelosh.com>
parents:
11495
diff
changeset
|
480 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
|
481 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
|
482 def _checkvar(m): |
13392
777cef34a890
dispatch: support for $ escaping in shell-alias definition
Roman Sokolov <sokolov.r.v@gmail.com>
parents:
13382
diff
changeset
|
483 if m.groups()[0] == '$': |
777cef34a890
dispatch: support for $ escaping in shell-alias definition
Roman Sokolov <sokolov.r.v@gmail.com>
parents:
13382
diff
changeset
|
484 return m.group() |
777cef34a890
dispatch: support for $ escaping in shell-alias definition
Roman Sokolov <sokolov.r.v@gmail.com>
parents:
13382
diff
changeset
|
485 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
|
486 return m.group() |
f853873fc66d
aliases: provide more flexible ways to work with shell alias arguments
Steve Losh <steve@stevelosh.com>
parents:
11985
diff
changeset
|
487 else: |
14708
8083f4d00bd1
i18n: remove translation of debug messages
David Soria Parra <dsp@php.net>
parents:
14704
diff
changeset
|
488 ui.debug("No argument found for substitution " |
35470
7906354cbc68
debug: add newlines at the end of three locations that appear to need it
Kyle Lippincott <spectral@google.com>
parents:
35363
diff
changeset
|
489 "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
|
490 % (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
|
491 return '' |
37137
6890b7e991a4
help: supporting both help and doc for aliases
Rodrigo Damazio <rdamazio@google.com>
parents:
37123
diff
changeset
|
492 cmd = re.sub(br'\$(\d+|\$)', _checkvar, shdef) |
22158
bc2132dfc0a4
alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents:
21961
diff
changeset
|
493 cmd = aliasinterpolate(self.name, args, cmd) |
31209
3a03264de3eb
dispatch: set a blockedtag when running an external alias
Simon Farnsworth <simonfar@fb.com>
parents:
31190
diff
changeset
|
494 return ui.system(cmd, environ=env, |
3a03264de3eb
dispatch: set a blockedtag when running an external alias
Simon Farnsworth <simonfar@fb.com>
parents:
31190
diff
changeset
|
495 blockedtag='alias_%s' % self.name) |
11524
24965bb270b7
dispatch: add shell aliases
Steve Losh <steve@stevelosh.com>
parents:
11495
diff
changeset
|
496 self.fn = fn |
37137
6890b7e991a4
help: supporting both help and doc for aliases
Rodrigo Damazio <rdamazio@google.com>
parents:
37123
diff
changeset
|
497 self._populatehelp(ui, name, shdef, self.fn) |
11524
24965bb270b7
dispatch: add shell aliases
Steve Losh <steve@stevelosh.com>
parents:
11495
diff
changeset
|
498 return |
24965bb270b7
dispatch: add shell aliases
Steve Losh <steve@stevelosh.com>
parents:
11495
diff
changeset
|
499 |
21569
c5afb07c33d3
alias: handle shlex error in command aliases
Yuya Nishihara <yuya@tcha.org>
parents:
21556
diff
changeset
|
500 try: |
30681
caf7e1c5efe4
py3: have a bytes version of shlex.split()
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30657
diff
changeset
|
501 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
|
502 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
|
503 self.badalias = (_("error in definition for alias '%s': %s") |
37087
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36752
diff
changeset
|
504 % (self.name, stringutil.forcebytestr(inst))) |
21569
c5afb07c33d3
alias: handle shlex error in command aliases
Yuya Nishihara <yuya@tcha.org>
parents:
21556
diff
changeset
|
505 return |
35234
7ce0ba3a1c32
dispatch: replace _earlygetopt(strip=True) with new parser
Yuya Nishihara <yuya@tcha.org>
parents:
35233
diff
changeset
|
506 earlyopts, args = _earlysplitopts(args) |
7ce0ba3a1c32
dispatch: replace _earlygetopt(strip=True) with new parser
Yuya Nishihara <yuya@tcha.org>
parents:
35233
diff
changeset
|
507 if earlyopts: |
7ce0ba3a1c32
dispatch: replace _earlygetopt(strip=True) with new parser
Yuya Nishihara <yuya@tcha.org>
parents:
35233
diff
changeset
|
508 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:
35233
diff
changeset
|
509 "only be given on the command line") |
35982
f81df691efe7
py3: use pycompat.ziplist instead of zip
Pulkit Goyal <7895pulkit@gmail.com>
parents:
35939
diff
changeset
|
510 % (self.name, '/'.join(pycompat.ziplist(*earlyopts) |
f81df691efe7
py3: use pycompat.ziplist instead of zip
Pulkit Goyal <7895pulkit@gmail.com>
parents:
35939
diff
changeset
|
511 [0]))) |
35234
7ce0ba3a1c32
dispatch: replace _earlygetopt(strip=True) with new parser
Yuya Nishihara <yuya@tcha.org>
parents:
35233
diff
changeset
|
512 return |
12092
4982fa38e544
alias: print what command is being shadowed in debug message
Brodie Rao <brodie@bitheap.org>
parents:
12070
diff
changeset
|
513 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
|
514 self.givenargs = args |
8655 | 515 |
516 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
|
517 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
|
518 if len(tableentry) > 2: |
37137
6890b7e991a4
help: supporting both help and doc for aliases
Rodrigo Damazio <rdamazio@google.com>
parents:
37123
diff
changeset
|
519 self.fn, self.opts, cmdhelp = tableentry |
9993
8bce1e0d2801
alias: do not crash when aliased command has no usage help text
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9825
diff
changeset
|
520 else: |
8bce1e0d2801
alias: do not crash when aliased command has no usage help text
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9825
diff
changeset
|
521 self.fn, self.opts = tableentry |
37137
6890b7e991a4
help: supporting both help and doc for aliases
Rodrigo Damazio <rdamazio@google.com>
parents:
37123
diff
changeset
|
522 cmdhelp = None |
9993
8bce1e0d2801
alias: do not crash when aliased command has no usage help text
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9825
diff
changeset
|
523 |
37137
6890b7e991a4
help: supporting both help and doc for aliases
Rodrigo Damazio <rdamazio@google.com>
parents:
37123
diff
changeset
|
524 self._populatehelp(ui, name, cmd, self.fn, cmdhelp) |
9876
6e8a16dd3e30
alias: improve help text for command aliases
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
9875
diff
changeset
|
525 |
8655 | 526 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
|
527 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
|
528 % (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
|
529 self.unknowncmd = True |
8655 | 530 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
|
531 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
|
532 % (self.name, cmd)) |
8655 | 533 |
37137
6890b7e991a4
help: supporting both help and doc for aliases
Rodrigo Damazio <rdamazio@google.com>
parents:
37123
diff
changeset
|
534 def _populatehelp(self, ui, name, cmd, fn, defaulthelp=None): |
37142
aa55c5354b8f
alias: reject non-ascii characters in user help/doc strings
Yuya Nishihara <yuya@tcha.org>
parents:
37137
diff
changeset
|
535 # confine strings to be passed to i18n.gettext() |
aa55c5354b8f
alias: reject non-ascii characters in user help/doc strings
Yuya Nishihara <yuya@tcha.org>
parents:
37137
diff
changeset
|
536 cfg = {} |
aa55c5354b8f
alias: reject non-ascii characters in user help/doc strings
Yuya Nishihara <yuya@tcha.org>
parents:
37137
diff
changeset
|
537 for k in ('doc', 'help'): |
aa55c5354b8f
alias: reject non-ascii characters in user help/doc strings
Yuya Nishihara <yuya@tcha.org>
parents:
37137
diff
changeset
|
538 v = ui.config('alias', '%s:%s' % (name, k), None) |
aa55c5354b8f
alias: reject non-ascii characters in user help/doc strings
Yuya Nishihara <yuya@tcha.org>
parents:
37137
diff
changeset
|
539 if v is None: |
aa55c5354b8f
alias: reject non-ascii characters in user help/doc strings
Yuya Nishihara <yuya@tcha.org>
parents:
37137
diff
changeset
|
540 continue |
aa55c5354b8f
alias: reject non-ascii characters in user help/doc strings
Yuya Nishihara <yuya@tcha.org>
parents:
37137
diff
changeset
|
541 if not encoding.isasciistr(v): |
aa55c5354b8f
alias: reject non-ascii characters in user help/doc strings
Yuya Nishihara <yuya@tcha.org>
parents:
37137
diff
changeset
|
542 self.badalias = (_("non-ASCII character in alias definition " |
aa55c5354b8f
alias: reject non-ascii characters in user help/doc strings
Yuya Nishihara <yuya@tcha.org>
parents:
37137
diff
changeset
|
543 "'%s:%s'") % (name, k)) |
aa55c5354b8f
alias: reject non-ascii characters in user help/doc strings
Yuya Nishihara <yuya@tcha.org>
parents:
37137
diff
changeset
|
544 return |
aa55c5354b8f
alias: reject non-ascii characters in user help/doc strings
Yuya Nishihara <yuya@tcha.org>
parents:
37137
diff
changeset
|
545 cfg[k] = v |
aa55c5354b8f
alias: reject non-ascii characters in user help/doc strings
Yuya Nishihara <yuya@tcha.org>
parents:
37137
diff
changeset
|
546 |
aa55c5354b8f
alias: reject non-ascii characters in user help/doc strings
Yuya Nishihara <yuya@tcha.org>
parents:
37137
diff
changeset
|
547 self.help = cfg.get('help', defaulthelp or '') |
37137
6890b7e991a4
help: supporting both help and doc for aliases
Rodrigo Damazio <rdamazio@google.com>
parents:
37123
diff
changeset
|
548 if self.help and self.help.startswith("hg " + cmd): |
6890b7e991a4
help: supporting both help and doc for aliases
Rodrigo Damazio <rdamazio@google.com>
parents:
37123
diff
changeset
|
549 # drop prefix in old-style help lines so hg shows the alias |
6890b7e991a4
help: supporting both help and doc for aliases
Rodrigo Damazio <rdamazio@google.com>
parents:
37123
diff
changeset
|
550 self.help = self.help[4 + len(cmd):] |
6890b7e991a4
help: supporting both help and doc for aliases
Rodrigo Damazio <rdamazio@google.com>
parents:
37123
diff
changeset
|
551 |
37143
1d56c539794e
py3: bytes/unicode dance on __doc__ of cmdalias
Yuya Nishihara <yuya@tcha.org>
parents:
37142
diff
changeset
|
552 doc = cfg.get('doc', pycompat.getdoc(fn)) |
1d56c539794e
py3: bytes/unicode dance on __doc__ of cmdalias
Yuya Nishihara <yuya@tcha.org>
parents:
37142
diff
changeset
|
553 if doc is not None: |
1d56c539794e
py3: bytes/unicode dance on __doc__ of cmdalias
Yuya Nishihara <yuya@tcha.org>
parents:
37142
diff
changeset
|
554 doc = pycompat.sysstr(doc) |
1d56c539794e
py3: bytes/unicode dance on __doc__ of cmdalias
Yuya Nishihara <yuya@tcha.org>
parents:
37142
diff
changeset
|
555 self.__doc__ = doc |
37137
6890b7e991a4
help: supporting both help and doc for aliases
Rodrigo Damazio <rdamazio@google.com>
parents:
37123
diff
changeset
|
556 |
29087
ad1bdea43965
dispatch: defer environment variable resolution in alias commands (BC)
Jun Wu <quark@fb.com>
parents:
28861
diff
changeset
|
557 @property |
ad1bdea43965
dispatch: defer environment variable resolution in alias commands (BC)
Jun Wu <quark@fb.com>
parents:
28861
diff
changeset
|
558 def args(self): |
31634
2632df096fc0
dispatch: use pycompat.maplist() instead of map() to get a list
Pulkit Goyal <7895pulkit@gmail.com>
parents:
31509
diff
changeset
|
559 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
|
560 return aliasargs(self.fn, args) |
ad1bdea43965
dispatch: defer environment variable resolution in alias commands (BC)
Jun Wu <quark@fb.com>
parents:
28861
diff
changeset
|
561 |
28621
d856e85a8a7a
dispatch: make cmdalias forward command attributes to function
Yuya Nishihara <yuya@tcha.org>
parents:
28538
diff
changeset
|
562 def __getattr__(self, name): |
37716
dfc51a482031
registrar: replace "cmdtype" with an intent-based mechanism (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37143
diff
changeset
|
563 adefaults = {r'norepo': True, r'intents': set(), |
32207
89153b0d4881
py3: make adefaults keys str to be compatible with getattr
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32183
diff
changeset
|
564 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
|
565 if name not in adefaults: |
d856e85a8a7a
dispatch: make cmdalias forward command attributes to function
Yuya Nishihara <yuya@tcha.org>
parents:
28538
diff
changeset
|
566 raise AttributeError(name) |
d856e85a8a7a
dispatch: make cmdalias forward command attributes to function
Yuya Nishihara <yuya@tcha.org>
parents:
28538
diff
changeset
|
567 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
|
568 return adefaults[name] |
d856e85a8a7a
dispatch: make cmdalias forward command attributes to function
Yuya Nishihara <yuya@tcha.org>
parents:
28538
diff
changeset
|
569 return getattr(self.fn, name) |
d856e85a8a7a
dispatch: make cmdalias forward command attributes to function
Yuya Nishihara <yuya@tcha.org>
parents:
28538
diff
changeset
|
570 |
8655 | 571 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
|
572 if self.badalias: |
22164
efd65e51bc0b
alias: exit from bad definition by Abort
Yuya Nishihara <yuya@tcha.org>
parents:
22163
diff
changeset
|
573 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
|
574 if self.unknowncmd: |
10364
de1e7099d100
dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents:
10282
diff
changeset
|
575 try: |
de1e7099d100
dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents:
10282
diff
changeset
|
576 # 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
|
577 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
|
578 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
|
579 except error.UnknownCommand: |
de1e7099d100
dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents:
10282
diff
changeset
|
580 pass |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26421
diff
changeset
|
581 raise error.Abort(self.badalias, hint=hint) |
8655 | 582 if self.shadows: |
14704
b24d596fcd25
Backed out changeset 1ec8bd909ac3
Martin Geisler <mg@aragost.com>
parents:
14702
diff
changeset
|
583 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
|
584 (self.name, self.cmdname)) |
8655 | 585 |
29857
318e2b600b80
blackbox: also log alias expansions
Augie Fackler <augie@google.com>
parents:
29852
diff
changeset
|
586 ui.log('commandalias', "alias '%s' expands to '%s'\n", |
318e2b600b80
blackbox: also log alias expansions
Augie Fackler <augie@google.com>
parents:
29852
diff
changeset
|
587 self.name, self.definition) |
14950
144e97421f6b
dispatch: use safehasattr instead of hasattr
Augie Fackler <durin42@gmail.com>
parents:
14918
diff
changeset
|
588 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
|
589 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
|
590 else: |
12093
cd895084a4cd
alias: on --debug, print expansion when it has invalid arguments
Brodie Rao <brodie@bitheap.org>
parents:
12092
diff
changeset
|
591 try: |
21556
5e13507a3b4e
alias: fix loss of non-zero return code in command aliases
Yuya Nishihara <yuya@tcha.org>
parents:
20829
diff
changeset
|
592 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
|
593 except error.SignatureError: |
cd895084a4cd
alias: on --debug, print expansion when it has invalid arguments
Brodie Rao <brodie@bitheap.org>
parents:
12092
diff
changeset
|
594 args = ' '.join([self.cmdname] + self.args) |
14704
b24d596fcd25
Backed out changeset 1ec8bd909ac3
Martin Geisler <mg@aragost.com>
parents:
14702
diff
changeset
|
595 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
|
596 raise |
8655 | 597 |
34313
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34312
diff
changeset
|
598 class lazyaliasentry(object): |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34312
diff
changeset
|
599 """like a typical command entry (func, opts, help), but is lazy""" |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34312
diff
changeset
|
600 |
37137
6890b7e991a4
help: supporting both help and doc for aliases
Rodrigo Damazio <rdamazio@google.com>
parents:
37123
diff
changeset
|
601 def __init__(self, ui, name, definition, cmdtable, source): |
6890b7e991a4
help: supporting both help and doc for aliases
Rodrigo Damazio <rdamazio@google.com>
parents:
37123
diff
changeset
|
602 self.ui = ui |
34313
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34312
diff
changeset
|
603 self.name = name |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34312
diff
changeset
|
604 self.definition = definition |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34312
diff
changeset
|
605 self.cmdtable = cmdtable.copy() |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34312
diff
changeset
|
606 self.source = source |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34312
diff
changeset
|
607 |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34312
diff
changeset
|
608 @util.propertycache |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34312
diff
changeset
|
609 def _aliasdef(self): |
37137
6890b7e991a4
help: supporting both help and doc for aliases
Rodrigo Damazio <rdamazio@google.com>
parents:
37123
diff
changeset
|
610 return cmdalias(self.ui, self.name, self.definition, self.cmdtable, |
6890b7e991a4
help: supporting both help and doc for aliases
Rodrigo Damazio <rdamazio@google.com>
parents:
37123
diff
changeset
|
611 self.source) |
34313
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34312
diff
changeset
|
612 |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34312
diff
changeset
|
613 def __getitem__(self, n): |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34312
diff
changeset
|
614 aliasdef = self._aliasdef |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34312
diff
changeset
|
615 if n == 0: |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34312
diff
changeset
|
616 return aliasdef |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34312
diff
changeset
|
617 elif n == 1: |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34312
diff
changeset
|
618 return aliasdef.opts |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34312
diff
changeset
|
619 elif n == 2: |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34312
diff
changeset
|
620 return aliasdef.help |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34312
diff
changeset
|
621 else: |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34312
diff
changeset
|
622 raise IndexError |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34312
diff
changeset
|
623 |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34312
diff
changeset
|
624 def __iter__(self): |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34312
diff
changeset
|
625 for i in range(3): |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34312
diff
changeset
|
626 yield self[i] |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34312
diff
changeset
|
627 |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34312
diff
changeset
|
628 def __len__(self): |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34312
diff
changeset
|
629 return 3 |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34312
diff
changeset
|
630 |
8655 | 631 def addaliases(ui, cmdtable): |
632 # aliases are processed after extensions have been loaded, so they | |
633 # may use extension commands. Aliases can also use other alias definitions, | |
634 # but only if they have been defined prior to the current definition. | |
37137
6890b7e991a4
help: supporting both help and doc for aliases
Rodrigo Damazio <rdamazio@google.com>
parents:
37123
diff
changeset
|
635 for alias, definition in ui.configitems('alias', ignoresub=True): |
15019
f4b7be3f8430
dispatch: don't rewrap aliases that have the same definition
Idan Kamara <idankk86@gmail.com>
parents:
14992
diff
changeset
|
636 try: |
34313
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34312
diff
changeset
|
637 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
|
638 continue |
f4b7be3f8430
dispatch: don't rewrap aliases that have the same definition
Idan Kamara <idankk86@gmail.com>
parents:
14992
diff
changeset
|
639 except (KeyError, AttributeError): |
f4b7be3f8430
dispatch: don't rewrap aliases that have the same definition
Idan Kamara <idankk86@gmail.com>
parents:
14992
diff
changeset
|
640 # 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
|
641 pass |
f4b7be3f8430
dispatch: don't rewrap aliases that have the same definition
Idan Kamara <idankk86@gmail.com>
parents:
14992
diff
changeset
|
642 |
34312
0e48813cc106
alias: test duplicated definition earlier
Jun Wu <quark@fb.com>
parents:
34146
diff
changeset
|
643 source = ui.configsource('alias', alias) |
37137
6890b7e991a4
help: supporting both help and doc for aliases
Rodrigo Damazio <rdamazio@google.com>
parents:
37123
diff
changeset
|
644 entry = lazyaliasentry(ui, alias, definition, cmdtable, source) |
34313
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34312
diff
changeset
|
645 cmdtable[alias] = entry |
8655 | 646 |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
647 def _parse(ui, args): |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
648 options = {} |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
649 cmdoptions = {} |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
650 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
651 try: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
652 args = fancyopts.fancyopts(args, commands.globalopts, options) |
30581
541949a10a68
fancyopts: switch from fancyopts.getopt.* to getopt.*
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30564
diff
changeset
|
653 except getopt.GetoptError as inst: |
37087
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36752
diff
changeset
|
654 raise error.CommandError(None, stringutil.forcebytestr(inst)) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
655 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
656 if args: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
657 cmd, args = args[0], args[1:] |
9875
d6a95c5f6ff9
dispatch: minor refactoring
Henri Wiechers <hwiechers@gmail.com>
parents:
9825
diff
changeset
|
658 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
|
659 ui.configbool("ui", "strict")) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
660 cmd = aliases[0] |
14265
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
661 args = aliasargs(entry[0], args) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
662 defaults = ui.config("defaults", cmd) |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
663 if defaults: |
31509
9916b3d579a9
dispatch: use pycompat.maplist to allow summing with args
Augie Fackler <augie@google.com>
parents:
31507
diff
changeset
|
664 args = pycompat.maplist( |
9916b3d579a9
dispatch: use pycompat.maplist to allow summing with args
Augie Fackler <augie@google.com>
parents:
31507
diff
changeset
|
665 util.expandpath, pycompat.shlexsplit(defaults)) + args |
9875
d6a95c5f6ff9
dispatch: minor refactoring
Henri Wiechers <hwiechers@gmail.com>
parents:
9825
diff
changeset
|
666 c = list(entry[1]) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
667 else: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
668 cmd = None |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
669 c = [] |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
670 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
671 # combine global options into local |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
672 for o in commands.globalopts: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
673 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
|
674 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
675 try: |
29833
61a4cdc98307
dispatch: explicitly pass fancyopts optional arg as a keyword
Augie Fackler <augie@google.com>
parents:
29795
diff
changeset
|
676 args = fancyopts.fancyopts(args, c, cmdoptions, gnu=True) |
30581
541949a10a68
fancyopts: switch from fancyopts.getopt.* to getopt.*
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30564
diff
changeset
|
677 except getopt.GetoptError as inst: |
37087
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36752
diff
changeset
|
678 raise error.CommandError(cmd, stringutil.forcebytestr(inst)) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
679 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
680 # separate global options back out |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
681 for o in commands.globalopts: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
682 n = o[1] |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
683 options[n] = cmdoptions[n] |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
684 del cmdoptions[n] |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
685 |
9875
d6a95c5f6ff9
dispatch: minor refactoring
Henri Wiechers <hwiechers@gmail.com>
parents:
9825
diff
changeset
|
686 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
|
687 |
8137 | 688 def _parseconfig(ui, config): |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
689 """parse the --config options from the command line""" |
14753
10dcb3e7cb55
dispatch: return read config options
Idan Kamara <idankk86@gmail.com>
parents:
14752
diff
changeset
|
690 configs = [] |
10dcb3e7cb55
dispatch: return read config options
Idan Kamara <idankk86@gmail.com>
parents:
14752
diff
changeset
|
691 |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
692 for cfg in config: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
693 try: |
28081
a6344df5108e
dispatch: strip command line options like config file options
Tony Tung <ttung@fb.com>
parents:
27679
diff
changeset
|
694 name, value = [cfgelem.strip() |
a6344df5108e
dispatch: strip command line options like config file options
Tony Tung <ttung@fb.com>
parents:
27679
diff
changeset
|
695 for cfgelem in cfg.split('=', 1)] |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
696 section, name = name.split('.', 1) |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
697 if not section or not name: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
698 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
|
699 ui.setconfig(section, name, value, '--config') |
14753
10dcb3e7cb55
dispatch: return read config options
Idan Kamara <idankk86@gmail.com>
parents:
14752
diff
changeset
|
700 configs.append((section, name, value)) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
701 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
|
702 raise error.Abort(_('malformed --config option: %r ' |
36670
77f98867538f
py3: fix some unicode madness in global exception catcher
Yuya Nishihara <yuya@tcha.org>
parents:
36666
diff
changeset
|
703 '(use --config section.name=value)') |
77f98867538f
py3: fix some unicode madness in global exception catcher
Yuya Nishihara <yuya@tcha.org>
parents:
36666
diff
changeset
|
704 % pycompat.bytestr(cfg)) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
705 |
14753
10dcb3e7cb55
dispatch: return read config options
Idan Kamara <idankk86@gmail.com>
parents:
14752
diff
changeset
|
706 return configs |
10dcb3e7cb55
dispatch: return read config options
Idan Kamara <idankk86@gmail.com>
parents:
14752
diff
changeset
|
707 |
35233
6e6d0a5b88e6
dispatch: replace _earlyreq*() with new fancyopts-based parser
Yuya Nishihara <yuya@tcha.org>
parents:
35232
diff
changeset
|
708 def _earlyparseopts(ui, args): |
34996
c9740b69b9b7
dispatch: add HGPLAIN=+strictflags to restrict early parsing of global options
Yuya Nishihara <yuya@tcha.org>
parents:
34986
diff
changeset
|
709 options = {} |
c9740b69b9b7
dispatch: add HGPLAIN=+strictflags to restrict early parsing of global options
Yuya Nishihara <yuya@tcha.org>
parents:
34986
diff
changeset
|
710 fancyopts.fancyopts(args, commands.globalopts, options, |
35233
6e6d0a5b88e6
dispatch: replace _earlyreq*() with new fancyopts-based parser
Yuya Nishihara <yuya@tcha.org>
parents:
35232
diff
changeset
|
711 gnu=not ui.plain('strictflags'), early=True, |
35232
4edd2202f7d7
dispatch: alias --repo to --repository while parsing early options
Yuya Nishihara <yuya@tcha.org>
parents:
35197
diff
changeset
|
712 optaliases={'repository': ['repo']}) |
34996
c9740b69b9b7
dispatch: add HGPLAIN=+strictflags to restrict early parsing of global options
Yuya Nishihara <yuya@tcha.org>
parents:
34986
diff
changeset
|
713 return options |
c9740b69b9b7
dispatch: add HGPLAIN=+strictflags to restrict early parsing of global options
Yuya Nishihara <yuya@tcha.org>
parents:
34986
diff
changeset
|
714 |
35234
7ce0ba3a1c32
dispatch: replace _earlygetopt(strip=True) with new parser
Yuya Nishihara <yuya@tcha.org>
parents:
35233
diff
changeset
|
715 def _earlysplitopts(args): |
7ce0ba3a1c32
dispatch: replace _earlygetopt(strip=True) with new parser
Yuya Nishihara <yuya@tcha.org>
parents:
35233
diff
changeset
|
716 """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:
35233
diff
changeset
|
717 shortoptions = 'R:' |
7ce0ba3a1c32
dispatch: replace _earlygetopt(strip=True) with new parser
Yuya Nishihara <yuya@tcha.org>
parents:
35233
diff
changeset
|
718 # TODO: perhaps 'debugger' should be included |
7ce0ba3a1c32
dispatch: replace _earlygetopt(strip=True) with new parser
Yuya Nishihara <yuya@tcha.org>
parents:
35233
diff
changeset
|
719 longoptions = ['cwd=', 'repository=', 'repo=', 'config='] |
7ce0ba3a1c32
dispatch: replace _earlygetopt(strip=True) with new parser
Yuya Nishihara <yuya@tcha.org>
parents:
35233
diff
changeset
|
720 return fancyopts.earlygetopt(args, shortoptions, longoptions, |
7ce0ba3a1c32
dispatch: replace _earlygetopt(strip=True) with new parser
Yuya Nishihara <yuya@tcha.org>
parents:
35233
diff
changeset
|
721 gnu=True, keepsep=True) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
722 |
11330
713ae78bb583
provide pre- and post- hooks with parsed command line arguments.
Chad Dombrova <chadrik@gmail.com>
parents:
11305
diff
changeset
|
723 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
|
724 # 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
|
725 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
|
726 pats=cmdpats, opts=cmdoptions) |
29129
e6dfb0e4eeef
dispatch: add fail-* family of hooks
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
29114
diff
changeset
|
727 try: |
e6dfb0e4eeef
dispatch: add fail-* family of hooks
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
29114
diff
changeset
|
728 ret = _runcommand(ui, options, cmd, d) |
e6dfb0e4eeef
dispatch: add fail-* family of hooks
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
29114
diff
changeset
|
729 # run post-hook, passing command result |
e6dfb0e4eeef
dispatch: add fail-* family of hooks
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
29114
diff
changeset
|
730 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
|
731 result=ret, pats=cmdpats, opts=cmdoptions) |
e6dfb0e4eeef
dispatch: add fail-* family of hooks
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
29114
diff
changeset
|
732 except Exception: |
e6dfb0e4eeef
dispatch: add fail-* family of hooks
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
29114
diff
changeset
|
733 # run failure hook and re-raise |
e6dfb0e4eeef
dispatch: add fail-* family of hooks
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
29114
diff
changeset
|
734 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
|
735 pats=cmdpats, opts=cmdoptions) |
e6dfb0e4eeef
dispatch: add fail-* family of hooks
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
29114
diff
changeset
|
736 raise |
7819
14b703252f14
dispatch: extract command execution block into method
Bill Barry <after.fallout@gmail.com>
parents:
7772
diff
changeset
|
737 return ret |
14b703252f14
dispatch: extract command execution block into method
Bill Barry <after.fallout@gmail.com>
parents:
7772
diff
changeset
|
738 |
28263
59509c6724c7
dispatch: add wd parameter to _getlocal
Jun Wu <quark@fb.com>
parents:
28081
diff
changeset
|
739 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
|
740 """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
|
741 |
12536
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
742 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
|
743 """ |
28263
59509c6724c7
dispatch: add wd parameter to _getlocal
Jun Wu <quark@fb.com>
parents:
28081
diff
changeset
|
744 if wd is None: |
59509c6724c7
dispatch: add wd parameter to _getlocal
Jun Wu <quark@fb.com>
parents:
28081
diff
changeset
|
745 try: |
30509
fc0cfe6c87d7
py3: add os.getcwdb() to have bytes path
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30494
diff
changeset
|
746 wd = pycompat.getcwd() |
28263
59509c6724c7
dispatch: add wd parameter to _getlocal
Jun Wu <quark@fb.com>
parents:
28081
diff
changeset
|
747 except OSError as e: |
59509c6724c7
dispatch: add wd parameter to _getlocal
Jun Wu <quark@fb.com>
parents:
28081
diff
changeset
|
748 raise error.Abort(_("error getting current working directory: %s") % |
34040
d5b2beca16c0
python3: wrap all uses of <exception>.strerror with strtolocal
Augie Fackler <raf@durin42.com>
parents:
33618
diff
changeset
|
749 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
|
750 path = cmdutil.findrepo(wd) or "" |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
751 if not path: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
752 lui = ui |
9436 | 753 else: |
12636
c24215aa7e69
dispatch: remove superfluous try/except when reading local ui config
Brodie Rao <brodie@bitheap.org>
parents:
12633
diff
changeset
|
754 lui = ui.copy() |
12637
42ca7aef28d3
dispatch: properly handle relative path aliases used with -R (issue2376)
Brodie Rao <brodie@bitheap.org>
parents:
12636
diff
changeset
|
755 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
|
756 |
34985
d3d35a55e03b
dispatch: convert non-list option parsed by _earlygetopt() to string
Yuya Nishihara <yuya@tcha.org>
parents:
34984
diff
changeset
|
757 if rpath: |
d3d35a55e03b
dispatch: convert non-list option parsed by _earlygetopt() to string
Yuya Nishihara <yuya@tcha.org>
parents:
34984
diff
changeset
|
758 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
|
759 lui = ui.copy() |
12637
42ca7aef28d3
dispatch: properly handle relative path aliases used with -R (issue2376)
Brodie Rao <brodie@bitheap.org>
parents:
12636
diff
changeset
|
760 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
|
761 |
12536
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
762 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
|
763 |
29132
12769703d4ba
dispatch: always load extensions before running shell aliases (issue5230)
Jun Wu <quark@fb.com>
parents:
29129
diff
changeset
|
764 def _checkshellalias(lui, ui, args): |
12769703d4ba
dispatch: always load extensions before running shell aliases (issue5230)
Jun Wu <quark@fb.com>
parents:
29129
diff
changeset
|
765 """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
|
766 options = {} |
12748
d10369fefd01
alias: fail gracefully when invalid global options are given (issue2442)
Steve Losh <steve@stevelosh.com>
parents:
12637
diff
changeset
|
767 |
d10369fefd01
alias: fail gracefully when invalid global options are given (issue2442)
Steve Losh <steve@stevelosh.com>
parents:
12637
diff
changeset
|
768 try: |
d10369fefd01
alias: fail gracefully when invalid global options are given (issue2442)
Steve Losh <steve@stevelosh.com>
parents:
12637
diff
changeset
|
769 args = fancyopts.fancyopts(args, commands.globalopts, options) |
30581
541949a10a68
fancyopts: switch from fancyopts.getopt.* to getopt.*
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30564
diff
changeset
|
770 except getopt.GetoptError: |
12748
d10369fefd01
alias: fail gracefully when invalid global options are given (issue2442)
Steve Losh <steve@stevelosh.com>
parents:
12637
diff
changeset
|
771 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
|
772 |
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 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
|
774 return |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
775 |
29132
12769703d4ba
dispatch: always load extensions before running shell aliases (issue5230)
Jun Wu <quark@fb.com>
parents:
29129
diff
changeset
|
776 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
|
777 |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
778 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
|
779 try: |
29132
12769703d4ba
dispatch: always load extensions before running shell aliases (issue5230)
Jun Wu <quark@fb.com>
parents:
29129
diff
changeset
|
780 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
|
781 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
|
782 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
|
783 return |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
784 |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
785 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
|
786 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
|
787 |
14950
144e97421f6b
dispatch: use safehasattr instead of hasattr
Augie Fackler <durin42@gmail.com>
parents:
14918
diff
changeset
|
788 if cmd and util.safehasattr(fn, 'shell'): |
34986
02845f7441af
dispatch: verify result of early command parsing
Yuya Nishihara <yuya@tcha.org>
parents:
34985
diff
changeset
|
789 # shell alias shouldn't receive early options which are consumed by hg |
35234
7ce0ba3a1c32
dispatch: replace _earlygetopt(strip=True) with new parser
Yuya Nishihara <yuya@tcha.org>
parents:
35233
diff
changeset
|
790 _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
|
791 d = lambda: fn(ui, *args[1:]) |
16683 | 792 return lambda: runcommand(lui, None, cmd, args[:1], ui, options, d, |
793 [], {}) | |
12536
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
794 |
14439
80c599eee3f3
dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents:
14438
diff
changeset
|
795 def _dispatch(req): |
14438
08bfec2ef031
dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents:
14286
diff
changeset
|
796 args = req.args |
14439
80c599eee3f3
dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents:
14438
diff
changeset
|
797 ui = req.ui |
80c599eee3f3
dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents:
14438
diff
changeset
|
798 |
12536
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
799 # check for cwd |
35233
6e6d0a5b88e6
dispatch: replace _earlyreq*() with new fancyopts-based parser
Yuya Nishihara <yuya@tcha.org>
parents:
35232
diff
changeset
|
800 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
|
801 if cwd: |
34985
d3d35a55e03b
dispatch: convert non-list option parsed by _earlygetopt() to string
Yuya Nishihara <yuya@tcha.org>
parents:
34984
diff
changeset
|
802 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
|
803 |
35233
6e6d0a5b88e6
dispatch: replace _earlyreq*() with new fancyopts-based parser
Yuya Nishihara <yuya@tcha.org>
parents:
35232
diff
changeset
|
804 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
|
805 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
|
806 |
32331
bd872f64a8ba
cleanup: use set literals
Martin von Zweigbergk <martinvonz@google.com>
parents:
32207
diff
changeset
|
807 uis = {ui, lui} |
30953
69a3c6c8bf95
dispatch: move detection of profiling earlier during startup
Bryan O'Sullivan <bryano@fb.com>
parents:
30937
diff
changeset
|
808 |
69a3c6c8bf95
dispatch: move detection of profiling earlier during startup
Bryan O'Sullivan <bryano@fb.com>
parents:
30937
diff
changeset
|
809 if req.repo: |
69a3c6c8bf95
dispatch: move detection of profiling earlier during startup
Bryan O'Sullivan <bryano@fb.com>
parents:
30937
diff
changeset
|
810 uis.add(req.repo.ui) |
69a3c6c8bf95
dispatch: move detection of profiling earlier during startup
Bryan O'Sullivan <bryano@fb.com>
parents:
30937
diff
changeset
|
811 |
38535
b86664c81833
debug: process --debug flag earlier
Boris Feld <boris.feld@octobus.net>
parents:
38143
diff
changeset
|
812 if (req.earlyoptions['verbose'] or req.earlyoptions['debug'] |
b86664c81833
debug: process --debug flag earlier
Boris Feld <boris.feld@octobus.net>
parents:
38143
diff
changeset
|
813 or req.earlyoptions['quiet']): |
b86664c81833
debug: process --debug flag earlier
Boris Feld <boris.feld@octobus.net>
parents:
38143
diff
changeset
|
814 for opt in ('verbose', 'debug', 'quiet'): |
b86664c81833
debug: process --debug flag earlier
Boris Feld <boris.feld@octobus.net>
parents:
38143
diff
changeset
|
815 val = pycompat.bytestr(bool(req.earlyoptions[opt])) |
b86664c81833
debug: process --debug flag earlier
Boris Feld <boris.feld@octobus.net>
parents:
38143
diff
changeset
|
816 for ui_ in uis: |
b86664c81833
debug: process --debug flag earlier
Boris Feld <boris.feld@octobus.net>
parents:
38143
diff
changeset
|
817 ui_.setconfig('ui', opt, val, '--' + opt) |
b86664c81833
debug: process --debug flag earlier
Boris Feld <boris.feld@octobus.net>
parents:
38143
diff
changeset
|
818 |
35233
6e6d0a5b88e6
dispatch: replace _earlyreq*() with new fancyopts-based parser
Yuya Nishihara <yuya@tcha.org>
parents:
35232
diff
changeset
|
819 if req.earlyoptions['profile']: |
30953
69a3c6c8bf95
dispatch: move detection of profiling earlier during startup
Bryan O'Sullivan <bryano@fb.com>
parents:
30937
diff
changeset
|
820 for ui_ in uis: |
69a3c6c8bf95
dispatch: move detection of profiling earlier during startup
Bryan O'Sullivan <bryano@fb.com>
parents:
30937
diff
changeset
|
821 ui_.setconfig('profiling', 'enabled', 'true', '--profile') |
69a3c6c8bf95
dispatch: move detection of profiling earlier during startup
Bryan O'Sullivan <bryano@fb.com>
parents:
30937
diff
changeset
|
822 |
32808
eede022fc142
profile: drop maybeprofile
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32807
diff
changeset
|
823 profile = lui.configbool('profiling', 'enabled') |
eede022fc142
profile: drop maybeprofile
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32807
diff
changeset
|
824 with profiling.profile(lui, enabled=profile) as profiler: |
30954
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30953
diff
changeset
|
825 # Configure extensions in phases: uisetup, extsetup, cmdtable, and |
33065
ef46d432e2e4
dispatch: remove unused _loaded
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33064
diff
changeset
|
826 # reposetup |
30954
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30953
diff
changeset
|
827 extensions.loadall(lui) |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30953
diff
changeset
|
828 # Propagate any changes to lui.__class__ by extensions |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30953
diff
changeset
|
829 ui.__class__ = lui.__class__ |
5828
863e237b58fb
dispatch: allow extensions to provide setup code
Kirill Smelkov <kirr@mns.spb.ru>
parents:
5664
diff
changeset
|
830 |
30954
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30953
diff
changeset
|
831 # (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
|
832 |
30954
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30953
diff
changeset
|
833 # (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
|
834 |
30954
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30953
diff
changeset
|
835 addaliases(lui, commands.table) |
8655 | 836 |
30954
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30953
diff
changeset
|
837 # All aliases and commands are completely defined, now. |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30953
diff
changeset
|
838 # Check abbreviation/ambiguity of shell alias. |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30953
diff
changeset
|
839 shellaliasfn = _checkshellalias(lui, ui, args) |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30953
diff
changeset
|
840 if shellaliasfn: |
30010
b19c2679289c
dispatch: make hg --profile wrap reposetup
Arun Kulshreshtha <kulshrax@fb.com>
parents:
30009
diff
changeset
|
841 return shellaliasfn() |
22377
f98abe3146b2
dispatch: check shell alias again after loading extensions (issue4355)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22376
diff
changeset
|
842 |
30954
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30953
diff
changeset
|
843 # check for fallback encoding |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30953
diff
changeset
|
844 fallback = lui.config('ui', 'fallbackencoding') |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30953
diff
changeset
|
845 if fallback: |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30953
diff
changeset
|
846 encoding.fallbackencoding = fallback |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
847 |
30954
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30953
diff
changeset
|
848 fullargs = args |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30953
diff
changeset
|
849 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
|
850 |
34986
02845f7441af
dispatch: verify result of early command parsing
Yuya Nishihara <yuya@tcha.org>
parents:
34985
diff
changeset
|
851 if options["config"] != req.earlyoptions["config"]: |
30954
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30953
diff
changeset
|
852 raise error.Abort(_("option --config may not be abbreviated!")) |
34986
02845f7441af
dispatch: verify result of early command parsing
Yuya Nishihara <yuya@tcha.org>
parents:
34985
diff
changeset
|
853 if options["cwd"] != req.earlyoptions["cwd"]: |
30954
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30953
diff
changeset
|
854 raise error.Abort(_("option --cwd may not be abbreviated!")) |
34986
02845f7441af
dispatch: verify result of early command parsing
Yuya Nishihara <yuya@tcha.org>
parents:
34985
diff
changeset
|
855 if options["repository"] != req.earlyoptions["repository"]: |
30954
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30953
diff
changeset
|
856 raise error.Abort(_( |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30953
diff
changeset
|
857 "option -R has to be separated from other options (e.g. not " |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30953
diff
changeset
|
858 "-qR) and --repository may only be abbreviated as --repo!")) |
34982
d9aba3730d30
dispatch: abort if early boolean options can't be parsed
Yuya Nishihara <yuya@tcha.org>
parents:
34981
diff
changeset
|
859 if options["debugger"] != req.earlyoptions["debugger"]: |
d9aba3730d30
dispatch: abort if early boolean options can't be parsed
Yuya Nishihara <yuya@tcha.org>
parents:
34981
diff
changeset
|
860 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:
34981
diff
changeset
|
861 # 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
|
862 |
30954
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30953
diff
changeset
|
863 if options["encoding"]: |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30953
diff
changeset
|
864 encoding.encoding = options["encoding"] |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30953
diff
changeset
|
865 if options["encodingmode"]: |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30953
diff
changeset
|
866 encoding.encodingmode = options["encodingmode"] |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30953
diff
changeset
|
867 if options["time"]: |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30953
diff
changeset
|
868 def get_times(): |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30953
diff
changeset
|
869 t = os.times() |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30953
diff
changeset
|
870 if t[4] == 0.0: |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30953
diff
changeset
|
871 # Windows leaves this as zero, so use time.clock() |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30953
diff
changeset
|
872 t = (t[0], t[1], t[2], t[3], time.clock()) |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30953
diff
changeset
|
873 return t |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30953
diff
changeset
|
874 s = get_times() |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30953
diff
changeset
|
875 def print_time(): |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30953
diff
changeset
|
876 t = get_times() |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30953
diff
changeset
|
877 ui.warn( |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30953
diff
changeset
|
878 _("time: real %.3f secs (user %.3f+%.3f sys %.3f+%.3f)\n") % |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30953
diff
changeset
|
879 (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
|
880 ui.atexit(print_time) |
32807
545f69cd6042
profile: support --profile in alias and abbreviated version (--prof)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32707
diff
changeset
|
881 if options["profile"]: |
545f69cd6042
profile: support --profile in alias and abbreviated version (--prof)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32707
diff
changeset
|
882 profiler.start() |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
883 |
38535
b86664c81833
debug: process --debug flag earlier
Boris Feld <boris.feld@octobus.net>
parents:
38143
diff
changeset
|
884 # if abbreviated version of this were used, take them in account, now |
30954
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30953
diff
changeset
|
885 if options['verbose'] or options['debug'] or options['quiet']: |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30953
diff
changeset
|
886 for opt in ('verbose', 'debug', 'quiet'): |
38535
b86664c81833
debug: process --debug flag earlier
Boris Feld <boris.feld@octobus.net>
parents:
38143
diff
changeset
|
887 if options[opt] == req.earlyoptions[opt]: |
b86664c81833
debug: process --debug flag earlier
Boris Feld <boris.feld@octobus.net>
parents:
38143
diff
changeset
|
888 continue |
35938
a2b3b5c5a25a
py3: replace "if ispy3" by pycompat.bytestr()
Yuya Nishihara <yuya@tcha.org>
parents:
35653
diff
changeset
|
889 val = pycompat.bytestr(bool(options[opt])) |
30954
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30953
diff
changeset
|
890 for ui_ in uis: |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30953
diff
changeset
|
891 ui_.setconfig('ui', opt, val, '--' + opt) |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30953
diff
changeset
|
892 |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30953
diff
changeset
|
893 if options['traceback']: |
14752
99ace3cb7352
dispatch: set global options on the request repo.ui
Idan Kamara <idankk86@gmail.com>
parents:
14748
diff
changeset
|
894 for ui_ in uis: |
30954
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30953
diff
changeset
|
895 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
|
896 |
30954
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30953
diff
changeset
|
897 if options['noninteractive']: |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30953
diff
changeset
|
898 for ui_ in uis: |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30953
diff
changeset
|
899 ui_.setconfig('ui', 'interactive', 'off', '-y') |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
900 |
30954
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30953
diff
changeset
|
901 if cmdoptions.get('insecure', False): |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30953
diff
changeset
|
902 for ui_ in uis: |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30953
diff
changeset
|
903 ui_.insecureconnections = True |
13328
a939f08fae9c
url: add --insecure option to bypass verification of ssl certificates
Yuya Nishihara <yuya@tcha.org>
parents:
12932
diff
changeset
|
904 |
32125
f928d53b687c
dispatch: setup color before pager for correct console information on windows
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
32054
diff
changeset
|
905 # 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
|
906 # might cause incorrect console information |
31127
7fec37746417
color: add a 'ui.color' option to control color behavior
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31122
diff
changeset
|
907 coloropt = options['color'] |
31122
45be7590301d
color: move triggering of the initialisation logic in core
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31080
diff
changeset
|
908 for ui_ in uis: |
31127
7fec37746417
color: add a 'ui.color' option to control color behavior
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31122
diff
changeset
|
909 if coloropt: |
7fec37746417
color: add a 'ui.color' option to control color behavior
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31122
diff
changeset
|
910 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:
31122
diff
changeset
|
911 color.setup(ui_) |
31122
45be7590301d
color: move triggering of the initialisation logic in core
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31080
diff
changeset
|
912 |
37087
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36752
diff
changeset
|
913 if stringutil.parsebool(options['pager']): |
33618
cc047a733f69
ui: enable pager always for explicit --pager=on (issue5580)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33499
diff
changeset
|
914 # ui.pager() expects 'internal-always-' prefix in this case |
32125
f928d53b687c
dispatch: setup color before pager for correct console information on windows
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
32054
diff
changeset
|
915 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
|
916 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
|
917 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
|
918 ui_.disablepager() |
32125
f928d53b687c
dispatch: setup color before pager for correct console information on windows
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
32054
diff
changeset
|
919 |
30954
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30953
diff
changeset
|
920 if options['version']: |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30953
diff
changeset
|
921 return commands.version_(ui) |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30953
diff
changeset
|
922 if options['help']: |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30953
diff
changeset
|
923 return commands.help_(ui, cmd, command=cmd is not None) |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30953
diff
changeset
|
924 elif not cmd: |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30953
diff
changeset
|
925 return commands.help_(ui, 'shortlist') |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
926 |
30009
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29888
diff
changeset
|
927 repo = None |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29888
diff
changeset
|
928 cmdpats = args[:] |
30494
acd30a959980
dispatch: stop supporting non-use of @command
Augie Fackler <augie@google.com>
parents:
30482
diff
changeset
|
929 if not func.norepo: |
30009
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29888
diff
changeset
|
930 # 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:
29888
diff
changeset
|
931 if not rpath and not cwd: |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29888
diff
changeset
|
932 repo = req.repo |
14510
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
933 |
30009
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29888
diff
changeset
|
934 if repo: |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29888
diff
changeset
|
935 # set the descriptors of the repo ui to those of ui |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29888
diff
changeset
|
936 repo.ui.fin = ui.fin |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29888
diff
changeset
|
937 repo.ui.fout = ui.fout |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29888
diff
changeset
|
938 repo.ui.ferr = ui.ferr |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29888
diff
changeset
|
939 else: |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29888
diff
changeset
|
940 try: |
32418
71e735bd8170
dispatch: make request accept additional reposetups
Jun Wu <quark@fb.com>
parents:
32416
diff
changeset
|
941 repo = hg.repository(ui, path=path, |
37717
0664be4f0c1f
hg: pass command intents to repo/peer creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37716
diff
changeset
|
942 presetupfuncs=req.prereposetups, |
0664be4f0c1f
hg: pass command intents to repo/peer creation (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37716
diff
changeset
|
943 intents=func.intents) |
30009
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29888
diff
changeset
|
944 if not repo.local(): |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29888
diff
changeset
|
945 raise error.Abort(_("repository '%s' is not local") |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29888
diff
changeset
|
946 % path) |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29888
diff
changeset
|
947 repo.ui.setconfig("bundle", "mainreporoot", repo.root, |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29888
diff
changeset
|
948 'repo') |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29888
diff
changeset
|
949 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
|
950 raise |
30009
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29888
diff
changeset
|
951 except error.RepoError: |
34985
d3d35a55e03b
dispatch: convert non-list option parsed by _earlygetopt() to string
Yuya Nishihara <yuya@tcha.org>
parents:
34984
diff
changeset
|
952 if rpath: # invalid -R path |
30009
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29888
diff
changeset
|
953 raise |
30494
acd30a959980
dispatch: stop supporting non-use of @command
Augie Fackler <augie@google.com>
parents:
30482
diff
changeset
|
954 if not func.optionalrepo: |
acd30a959980
dispatch: stop supporting non-use of @command
Augie Fackler <augie@google.com>
parents:
30482
diff
changeset
|
955 if func.inferrepo and args and not path: |
30009
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29888
diff
changeset
|
956 # try to infer -R from command args |
35170
e6487522ef92
py3: use pycompat.maplist() instead of map()
Pulkit Goyal <7895pulkit@gmail.com>
parents:
35166
diff
changeset
|
957 repos = pycompat.maplist(cmdutil.findrepo, args) |
30009
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29888
diff
changeset
|
958 guess = repos[0] |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29888
diff
changeset
|
959 if guess and repos.count(guess) == len(repos): |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29888
diff
changeset
|
960 req.args = ['--repository', guess] + fullargs |
35233
6e6d0a5b88e6
dispatch: replace _earlyreq*() with new fancyopts-based parser
Yuya Nishihara <yuya@tcha.org>
parents:
35232
diff
changeset
|
961 req.earlyoptions['repository'] = guess |
30009
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29888
diff
changeset
|
962 return _dispatch(req) |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29888
diff
changeset
|
963 if not path: |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29888
diff
changeset
|
964 raise error.RepoError(_("no repository found in" |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29888
diff
changeset
|
965 " '%s' (.hg not found)") |
30528
20a42325fdef
py3: use pycompat.getcwd() instead of os.getcwd()
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30509
diff
changeset
|
966 % pycompat.getcwd()) |
30009
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29888
diff
changeset
|
967 raise |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29888
diff
changeset
|
968 if repo: |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29888
diff
changeset
|
969 ui = repo.ui |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29888
diff
changeset
|
970 if options['hidden']: |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29888
diff
changeset
|
971 repo = repo.unfiltered() |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29888
diff
changeset
|
972 args.insert(0, repo) |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29888
diff
changeset
|
973 elif rpath: |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29888
diff
changeset
|
974 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
|
975 |
31499
3c77414a0f9c
dispatch: consolidate formatting of arguments
Augie Fackler <augie@google.com>
parents:
31498
diff
changeset
|
976 msg = _formatargs(fullargs) |
30009
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29888
diff
changeset
|
977 ui.log("command", '%s\n', msg) |
30591
2d555d753f0e
py3: make keys of keyword arguments strings
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30581
diff
changeset
|
978 strcmdopt = pycompat.strkwargs(cmdoptions) |
2d555d753f0e
py3: make keys of keyword arguments strings
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30581
diff
changeset
|
979 d = lambda: util.checksignature(func)(ui, *args, **strcmdopt) |
30009
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29888
diff
changeset
|
980 try: |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29888
diff
changeset
|
981 return runcommand(lui, repo, cmd, fullargs, ui, options, d, |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29888
diff
changeset
|
982 cmdpats, cmdoptions) |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29888
diff
changeset
|
983 finally: |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29888
diff
changeset
|
984 if repo and repo != req.repo: |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29888
diff
changeset
|
985 repo.close() |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
986 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
987 def _runcommand(ui, options, cmd, cmdfunc): |
29795
e3501546f7e4
profiling: add a context manager that no-ops if profiling isn't enabled
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29794
diff
changeset
|
988 """Run a command function, possibly with profiling enabled.""" |
30010
b19c2679289c
dispatch: make hg --profile wrap reposetup
Arun Kulshreshtha <kulshrax@fb.com>
parents:
30009
diff
changeset
|
989 try: |
b19c2679289c
dispatch: make hg --profile wrap reposetup
Arun Kulshreshtha <kulshrax@fb.com>
parents:
30009
diff
changeset
|
990 return cmdfunc() |
b19c2679289c
dispatch: make hg --profile wrap reposetup
Arun Kulshreshtha <kulshrax@fb.com>
parents:
30009
diff
changeset
|
991 except error.SignatureError: |
b19c2679289c
dispatch: make hg --profile wrap reposetup
Arun Kulshreshtha <kulshrax@fb.com>
parents:
30009
diff
changeset
|
992 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
|
993 |
28821
d3369dc6c1d0
dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents:
28784
diff
changeset
|
994 def _exceptionwarning(ui): |
d3369dc6c1d0
dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents:
28784
diff
changeset
|
995 """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
|
996 |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
997 # 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
|
998 # 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
|
999 # 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
|
1000 # 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
|
1001 # '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
|
1002 # 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
|
1003 # version number and try updating. |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1004 ct = util.versiontuple(n=2) |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1005 worst = None, ct, '' |
33499
0407a51b9d8c
codemod: register core configitems using a script
Jun Wu <quark@fb.com>
parents:
33065
diff
changeset
|
1006 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
|
1007 for name, mod in extensions.extensions(): |
35939
d5457d94e1c9
py3: replace "if ispy3" by pycompat.sysbytes() or util.forcebytestr()
Yuya Nishihara <yuya@tcha.org>
parents:
35938
diff
changeset
|
1008 # '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:
35938
diff
changeset
|
1009 # to py3 and we don't want UnicodeException because of that. |
37087
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36752
diff
changeset
|
1010 testedwith = stringutil.forcebytestr(getattr(mod, 'testedwith', '')) |
28784
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1011 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
|
1012 if not testedwith.strip(): |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1013 # 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
|
1014 worst = name, 'unknown', report |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1015 break |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1016 |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1017 # Never blame on extensions bundled with Mercurial. |
29888
ed793f41e83f
extensions: use ismoduleinternal() thoroughly
Yuya Nishihara <yuya@tcha.org>
parents:
29857
diff
changeset
|
1018 if extensions.ismoduleinternal(mod): |
28784
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1019 continue |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1020 |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1021 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
|
1022 if ct in tested: |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1023 continue |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1024 |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1025 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
|
1026 nearest = max(lower or tested) |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1027 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
|
1028 worst = name, nearest, report |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1029 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
|
1030 name, testedwith, report = worst |
31189
49ad6bf63107
dispatch: allow testedwith to be bytes or str
Augie Fackler <raf@durin42.com>
parents:
31127
diff
changeset
|
1031 if not isinstance(testedwith, (bytes, str)): |
37087
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36752
diff
changeset
|
1032 testedwith = '.'.join([stringutil.forcebytestr(c) |
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36752
diff
changeset
|
1033 for c in testedwith]) |
28784
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1034 warning = (_('** Unknown exception encountered with ' |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1035 '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
|
1036 '** 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
|
1037 '** 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
|
1038 '** If that fixes the bug please report it to %s\n') |
38067
5046c906b25d
py3: convert the report to bytes
Pulkit Goyal <7895pulkit@gmail.com>
parents:
38065
diff
changeset
|
1039 % (name, testedwith, name, stringutil.forcebytestr(report))) |
28784
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1040 else: |
33499
0407a51b9d8c
codemod: register core configitems using a script
Jun Wu <quark@fb.com>
parents:
33065
diff
changeset
|
1041 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
|
1042 if bugtracker is None: |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1043 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
|
1044 warning = (_("** unknown exception encountered, " |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1045 "please report by visiting\n** ") + bugtracker + '\n') |
35939
d5457d94e1c9
py3: replace "if ispy3" by pycompat.sysbytes() or util.forcebytestr()
Yuya Nishihara <yuya@tcha.org>
parents:
35938
diff
changeset
|
1046 sysversion = pycompat.sysbytes(sys.version).replace('\n', '') |
31190
27e3b66ec7c5
dispatch: cope with sys.version being unicode on Python 3
Augie Fackler <raf@durin42.com>
parents:
31189
diff
changeset
|
1047 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
|
1048 (_("** 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
|
1049 util.version()) + |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1050 (_("** Extensions loaded: %s\n") % |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1051 ", ".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
|
1052 return warning |
d3369dc6c1d0
dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents:
28784
diff
changeset
|
1053 |
d3369dc6c1d0
dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents:
28784
diff
changeset
|
1054 def handlecommandexception(ui): |
d3369dc6c1d0
dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents:
28784
diff
changeset
|
1055 """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
|
1056 |
d3369dc6c1d0
dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents:
28784
diff
changeset
|
1057 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
|
1058 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
|
1059 """ |
d3369dc6c1d0
dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents:
28784
diff
changeset
|
1060 warning = _exceptionwarning(ui) |
36162
976a9fd706ed
py3: convert traceback representation to bytes when logging
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35982
diff
changeset
|
1061 ui.log("commandexception", "%s\n%s\n", warning, |
976a9fd706ed
py3: convert traceback representation to bytes when logging
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35982
diff
changeset
|
1062 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
|
1063 ui.warn(warning) |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1064 return False # re-raise the exception |