Mercurial > hg
annotate mercurial/dispatch.py @ 43286:f8c114f20d2d
rust-cpython: require GIL to borrow immutable reference from PySharedRefCell
Since the inner value may be leaked, we probably need GIL to guarantee that
there's no data race.
inner(py).borrow() is replaced with inner_shared(py).borrow(), which basically
means any PySharedRefCell data should be accessed through PySharedRef wrapper.
author | Yuya Nishihara <yuya@tcha.org> |
---|---|
date | Sat, 21 Sep 2019 17:15:50 +0900 |
parents | 101ae8bbfa02 |
children | 9f70512ae2cf |
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 |
30576
541949a10a68
fancyopts: switch from fancyopts.getopt.* to getopt.*
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30559
diff
changeset
|
12 import getopt |
25932
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
13 import os |
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
14 import pdb |
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
15 import re |
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
16 import signal |
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
17 import sys |
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
18 import time |
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
19 import traceback |
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
20 |
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
21 |
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
22 from .i18n import _ |
43089
c59eb1560c44
py3: manually import getattr where it is needed
Gregory Szorc <gregory.szorc@gmail.com>
parents:
43080
diff
changeset
|
23 from .pycompat import getattr |
25932
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
24 |
39255
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
25 from hgdemandimport import tracing |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
26 |
25932
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
27 from . import ( |
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
28 cmdutil, |
30653
b2be4ccaff1d
color: load 'colortable' from extension using an 'extraloader'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
30586
diff
changeset
|
29 color, |
25932
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
30 commands, |
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
31 demandimport, |
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
32 encoding, |
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
33 error, |
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
34 extensions, |
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
35 fancyopts, |
31060
ab20491b1760
dispatch: rearrange 'unknown command' code to better employ pager
Augie Fackler <augie@google.com>
parents:
31027
diff
changeset
|
36 help, |
25932
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
37 hg, |
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
38 hook, |
29781
2654a0aac80d
profiling: move profiling code from dispatch.py (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29761
diff
changeset
|
39 profiling, |
30468
7f2b18c34c02
py3: use pycompat.sysargv in dispatch.run()
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30401
diff
changeset
|
40 pycompat, |
40414
444861dc1e55
help: displaying documented aliases by default
rdamazio@google.com
parents:
40402
diff
changeset
|
41 registrar, |
30520
4338f87dbf6f
dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents:
30519
diff
changeset
|
42 scmutil, |
25932
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
43 ui as uimod, |
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
44 util, |
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
45 ) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
46 |
37084
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36729
diff
changeset
|
47 from .utils import ( |
37119
d4a2e0d5d042
procutil: bulk-replace util.std* to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37084
diff
changeset
|
48 procutil, |
37084
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36729
diff
changeset
|
49 stringutil, |
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36729
diff
changeset
|
50 ) |
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36729
diff
changeset
|
51 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
52 |
14438
08bfec2ef031
dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents:
14286
diff
changeset
|
53 class request(object): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
54 def __init__( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
55 self, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
56 args, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
57 ui=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
58 repo=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
59 fin=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
60 fout=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
61 ferr=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
62 fmsg=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
63 prereposetups=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
64 ): |
14438
08bfec2ef031
dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents:
14286
diff
changeset
|
65 self.args = args |
14439
80c599eee3f3
dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents:
14438
diff
changeset
|
66 self.ui = ui |
14510
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
67 self.repo = repo |
14438
08bfec2ef031
dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents:
14286
diff
changeset
|
68 |
14613
ea8938d3a5aa
dispatch: add I/O descriptors to the request
Idan Kamara <idankk86@gmail.com>
parents:
14601
diff
changeset
|
69 # input/output/error streams |
ea8938d3a5aa
dispatch: add I/O descriptors to the request
Idan Kamara <idankk86@gmail.com>
parents:
14601
diff
changeset
|
70 self.fin = fin |
ea8938d3a5aa
dispatch: add I/O descriptors to the request
Idan Kamara <idankk86@gmail.com>
parents:
14601
diff
changeset
|
71 self.fout = fout |
ea8938d3a5aa
dispatch: add I/O descriptors to the request
Idan Kamara <idankk86@gmail.com>
parents:
14601
diff
changeset
|
72 self.ferr = ferr |
40587
5542bc9125c9
dispatch: pass around ui.fmsg channel
Yuya Nishihara <yuya@tcha.org>
parents:
40414
diff
changeset
|
73 # separate stream for status/error messages |
5542bc9125c9
dispatch: pass around ui.fmsg channel
Yuya Nishihara <yuya@tcha.org>
parents:
40414
diff
changeset
|
74 self.fmsg = fmsg |
14613
ea8938d3a5aa
dispatch: add I/O descriptors to the request
Idan Kamara <idankk86@gmail.com>
parents:
14601
diff
changeset
|
75 |
35224
6e6d0a5b88e6
dispatch: replace _earlyreq*() with new fancyopts-based parser
Yuya Nishihara <yuya@tcha.org>
parents:
35223
diff
changeset
|
76 # remember options pre-parsed by _earlyparseopts() |
35030
d9aba3730d30
dispatch: abort if early boolean options can't be parsed
Yuya Nishihara <yuya@tcha.org>
parents:
35029
diff
changeset
|
77 self.earlyoptions = {} |
d9aba3730d30
dispatch: abort if early boolean options can't be parsed
Yuya Nishihara <yuya@tcha.org>
parents:
35029
diff
changeset
|
78 |
32379
71e735bd8170
dispatch: make request accept additional reposetups
Jun Wu <quark@fb.com>
parents:
32377
diff
changeset
|
79 # reposetups which run before extensions, useful for chg to pre-fill |
71e735bd8170
dispatch: make request accept additional reposetups
Jun Wu <quark@fb.com>
parents:
32377
diff
changeset
|
80 # low-level repo state (for example, changelog) before extensions. |
71e735bd8170
dispatch: make request accept additional reposetups
Jun Wu <quark@fb.com>
parents:
32377
diff
changeset
|
81 self.prereposetups = prereposetups or [] |
71e735bd8170
dispatch: make request accept additional reposetups
Jun Wu <quark@fb.com>
parents:
32377
diff
changeset
|
82 |
40402
106adc261492
logtoprocess: sends the canonical command name to the subprocess
Boris Feld <boris.feld@octobus.net>
parents:
39818
diff
changeset
|
83 # store the parsed and canonical command |
106adc261492
logtoprocess: sends the canonical command name to the subprocess
Boris Feld <boris.feld@octobus.net>
parents:
39818
diff
changeset
|
84 self.canonical_command = None |
106adc261492
logtoprocess: sends the canonical command name to the subprocess
Boris Feld <boris.feld@octobus.net>
parents:
39818
diff
changeset
|
85 |
31956
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31629
diff
changeset
|
86 def _runexithandlers(self): |
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31629
diff
changeset
|
87 exc = None |
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31629
diff
changeset
|
88 handlers = self.ui._exithandlers |
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31629
diff
changeset
|
89 try: |
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31629
diff
changeset
|
90 while handlers: |
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31629
diff
changeset
|
91 func, args, kwargs = handlers.pop() |
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31629
diff
changeset
|
92 try: |
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31629
diff
changeset
|
93 func(*args, **kwargs) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
94 except: # re-raises below |
31956
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31629
diff
changeset
|
95 if exc is None: |
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31629
diff
changeset
|
96 exc = sys.exc_info()[1] |
43080
86e4daa2d54c
cleanup: mark some ui.(status|note|warn|write) calls as not needing i18n
Augie Fackler <augie@google.com>
parents:
43077
diff
changeset
|
97 self.ui.warnnoi18n(b'error in exit handlers:\n') |
31956
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31629
diff
changeset
|
98 self.ui.traceback(force=True) |
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31629
diff
changeset
|
99 finally: |
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31629
diff
changeset
|
100 if exc is not None: |
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31629
diff
changeset
|
101 raise exc |
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31629
diff
changeset
|
102 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
103 |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
104 def run(): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
105 b"run the command in sys.argv" |
37944
dc1ed7fe33e4
sshserver: do setbinary() by caller (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37717
diff
changeset
|
106 initstdio() |
43238
101ae8bbfa02
cleanup: hgdemandimport.tracing accepts strings, not bytes
Augie Fackler <augie@google.com>
parents:
43117
diff
changeset
|
107 with tracing.log('parse args into request'): |
39255
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
108 req = request(pycompat.sysargv[1:]) |
31960
71dcd4a4fa2f
stdio: catch StdioError in dispatch.run and clean up appropriately
Bryan O'Sullivan <bryano@fb.com>
parents:
31958
diff
changeset
|
109 err = None |
71dcd4a4fa2f
stdio: catch StdioError in dispatch.run and clean up appropriately
Bryan O'Sullivan <bryano@fb.com>
parents:
31958
diff
changeset
|
110 try: |
37995
6f9ac3cb0987
dispatch: unify handling of None returned by a command function
Yuya Nishihara <yuya@tcha.org>
parents:
37994
diff
changeset
|
111 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
|
112 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
|
113 err = e |
31960
71dcd4a4fa2f
stdio: catch StdioError in dispatch.run and clean up appropriately
Bryan O'Sullivan <bryano@fb.com>
parents:
31958
diff
changeset
|
114 status = -1 |
37994
e9c588802529
dispatch: minor code refactor
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37944
diff
changeset
|
115 |
e9c588802529
dispatch: minor code refactor
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37944
diff
changeset
|
116 # In all cases we try to flush stdio streams. |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
117 if util.safehasattr(req.ui, b'fout'): |
31960
71dcd4a4fa2f
stdio: catch StdioError in dispatch.run and clean up appropriately
Bryan O'Sullivan <bryano@fb.com>
parents:
31958
diff
changeset
|
118 try: |
32687
12941a782928
dispatch: do not close stdout and stderr, just flush() instead
Yuya Nishihara <yuya@tcha.org>
parents:
32652
diff
changeset
|
119 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
|
120 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
|
121 err = e |
31960
71dcd4a4fa2f
stdio: catch StdioError in dispatch.run and clean up appropriately
Bryan O'Sullivan <bryano@fb.com>
parents:
31958
diff
changeset
|
122 status = -1 |
37994
e9c588802529
dispatch: minor code refactor
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37944
diff
changeset
|
123 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
124 if util.safehasattr(req.ui, b'ferr'): |
35653
48fe4f56a3b4
dispatch: handle IOError when writing to stderr
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35466
diff
changeset
|
125 try: |
48fe4f56a3b4
dispatch: handle IOError when writing to stderr
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35466
diff
changeset
|
126 if err is not None and err.errno != errno.EPIPE: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
127 req.ui.ferr.write( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
128 b'abort: %s\n' % encoding.strtolocal(err.strerror) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
129 ) |
35653
48fe4f56a3b4
dispatch: handle IOError when writing to stderr
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35466
diff
changeset
|
130 req.ui.ferr.flush() |
48fe4f56a3b4
dispatch: handle IOError when writing to stderr
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35466
diff
changeset
|
131 # There's not much we can do about an I/O error here. So (possibly) |
48fe4f56a3b4
dispatch: handle IOError when writing to stderr
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35466
diff
changeset
|
132 # change the status code and move on. |
48fe4f56a3b4
dispatch: handle IOError when writing to stderr
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35466
diff
changeset
|
133 except IOError: |
48fe4f56a3b4
dispatch: handle IOError when writing to stderr
Gregory Szorc <gregory.szorc@gmail.com>
parents:
35466
diff
changeset
|
134 status = -1 |
36637
e8c361316803
py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents:
36636
diff
changeset
|
135 |
e8c361316803
py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents:
36636
diff
changeset
|
136 _silencestdio() |
31960
71dcd4a4fa2f
stdio: catch StdioError in dispatch.run and clean up appropriately
Bryan O'Sullivan <bryano@fb.com>
parents:
31958
diff
changeset
|
137 sys.exit(status & 255) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
138 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
139 |
36636
c263c684da91
py3: conditionalize initialization of stdio flags
Yuya Nishihara <yuya@tcha.org>
parents:
36503
diff
changeset
|
140 if pycompat.ispy3: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
141 |
37944
dc1ed7fe33e4
sshserver: do setbinary() by caller (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37717
diff
changeset
|
142 def initstdio(): |
36636
c263c684da91
py3: conditionalize initialization of stdio flags
Yuya Nishihara <yuya@tcha.org>
parents:
36503
diff
changeset
|
143 pass |
36637
e8c361316803
py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents:
36636
diff
changeset
|
144 |
e8c361316803
py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents:
36636
diff
changeset
|
145 def _silencestdio(): |
e8c361316803
py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents:
36636
diff
changeset
|
146 for fp in (sys.stdout, sys.stderr): |
e8c361316803
py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents:
36636
diff
changeset
|
147 # Check if the file is okay |
e8c361316803
py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents:
36636
diff
changeset
|
148 try: |
e8c361316803
py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents:
36636
diff
changeset
|
149 fp.flush() |
e8c361316803
py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents:
36636
diff
changeset
|
150 continue |
e8c361316803
py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents:
36636
diff
changeset
|
151 except IOError: |
e8c361316803
py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents:
36636
diff
changeset
|
152 pass |
e8c361316803
py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents:
36636
diff
changeset
|
153 # Otherwise mark it as closed to silence "Exception ignored in" |
e8c361316803
py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents:
36636
diff
changeset
|
154 # message emitted by the interpreter finalizer. Be careful to |
37119
d4a2e0d5d042
procutil: bulk-replace util.std* to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37084
diff
changeset
|
155 # 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:
37084
diff
changeset
|
156 # and its close() actually closes the underlying file descriptor. |
36637
e8c361316803
py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents:
36636
diff
changeset
|
157 try: |
e8c361316803
py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents:
36636
diff
changeset
|
158 fp.close() |
e8c361316803
py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents:
36636
diff
changeset
|
159 except IOError: |
e8c361316803
py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents:
36636
diff
changeset
|
160 pass |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
161 |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
162 |
36636
c263c684da91
py3: conditionalize initialization of stdio flags
Yuya Nishihara <yuya@tcha.org>
parents:
36503
diff
changeset
|
163 else: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
164 |
37944
dc1ed7fe33e4
sshserver: do setbinary() by caller (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37717
diff
changeset
|
165 def initstdio(): |
36636
c263c684da91
py3: conditionalize initialization of stdio flags
Yuya Nishihara <yuya@tcha.org>
parents:
36503
diff
changeset
|
166 for fp in (sys.stdin, sys.stdout, sys.stderr): |
37120
a8a902d7176e
procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37119
diff
changeset
|
167 procutil.setbinary(fp) |
34533
163fa0aea71e
dispatch: move initialization of sys.std* files
Yuya Nishihara <yuya@tcha.org>
parents:
34532
diff
changeset
|
168 |
36637
e8c361316803
py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents:
36636
diff
changeset
|
169 def _silencestdio(): |
e8c361316803
py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents:
36636
diff
changeset
|
170 pass |
e8c361316803
py3: silence the final IOError by closing stdout/err slightly early
Yuya Nishihara <yuya@tcha.org>
parents:
36636
diff
changeset
|
171 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
172 |
24221
4e240d6ab898
dispatch: offer near-edit-distance suggestions for {file,rev}set functions
Augie Fackler <augie@google.com>
parents:
24163
diff
changeset
|
173 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
|
174 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
|
175 # 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
|
176 # 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
|
177 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
|
178 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
179 |
27623
b3376fba4ab9
dispatch: report similar names consistently
Bryan O'Sullivan <bos@serpentine.com>
parents:
27615
diff
changeset
|
180 def _reportsimilar(write, similar): |
b3376fba4ab9
dispatch: report similar names consistently
Bryan O'Sullivan <bos@serpentine.com>
parents:
27615
diff
changeset
|
181 if len(similar) == 1: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
182 write(_(b"(did you mean %s?)\n") % similar[0]) |
27623
b3376fba4ab9
dispatch: report similar names consistently
Bryan O'Sullivan <bos@serpentine.com>
parents:
27615
diff
changeset
|
183 elif similar: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
184 ss = b", ".join(sorted(similar)) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
185 write(_(b"(did you mean one of %s?)\n") % ss) |
27623
b3376fba4ab9
dispatch: report similar names consistently
Bryan O'Sullivan <bos@serpentine.com>
parents:
27615
diff
changeset
|
186 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
187 |
24039
2ee35b6ee4fb
dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents:
23871
diff
changeset
|
188 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
|
189 similar = [] |
4e240d6ab898
dispatch: offer near-edit-distance suggestions for {file,rev}set functions
Augie Fackler <augie@google.com>
parents:
24163
diff
changeset
|
190 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
|
191 # 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
|
192 similar = _getsimilar(inst.symbols, inst.function) |
24039
2ee35b6ee4fb
dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents:
23871
diff
changeset
|
193 if len(inst.args) > 1: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
194 write( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
195 _(b"hg: parse error at %s: %s\n") |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
196 % (pycompat.bytestr(inst.args[1]), inst.args[0]) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
197 ) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
198 if inst.args[0].startswith(b' '): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
199 write(_(b"unexpected leading whitespace\n")) |
24039
2ee35b6ee4fb
dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents:
23871
diff
changeset
|
200 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
201 write(_(b"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
|
202 _reportsimilar(write, similar) |
28515
491eabd0df79
dispatch: extract common logic for handling ParseError
Jun Wu <quark@fb.com>
parents:
28447
diff
changeset
|
203 if inst.hint: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
204 write(_(b"(%s)\n") % inst.hint) |
24039
2ee35b6ee4fb
dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents:
23871
diff
changeset
|
205 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
206 |
31492
3c77414a0f9c
dispatch: consolidate formatting of arguments
Augie Fackler <augie@google.com>
parents:
31491
diff
changeset
|
207 def _formatargs(args): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
208 return b' '.join(procutil.shellquote(a) for a in args) |
31492
3c77414a0f9c
dispatch: consolidate formatting of arguments
Augie Fackler <augie@google.com>
parents:
31491
diff
changeset
|
209 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
210 |
14438
08bfec2ef031
dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents:
14286
diff
changeset
|
211 def dispatch(req): |
37995
6f9ac3cb0987
dispatch: unify handling of None returned by a command function
Yuya Nishihara <yuya@tcha.org>
parents:
37994
diff
changeset
|
212 """run the command specified in req.args; returns an integer status code""" |
43238
101ae8bbfa02
cleanup: hgdemandimport.tracing accepts strings, not bytes
Augie Fackler <augie@google.com>
parents:
43117
diff
changeset
|
213 with tracing.log('dispatch.dispatch'): |
39255
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
214 if req.ferr: |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
215 ferr = req.ferr |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
216 elif req.ui: |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
217 ferr = req.ui.ferr |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
218 else: |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
219 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
|
220 |
39255
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
221 try: |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
222 if not req.ui: |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
223 req.ui = uimod.ui.load() |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
224 req.earlyoptions.update(_earlyparseopts(req.ui, req.args)) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
225 if req.earlyoptions[b'traceback']: |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
226 req.ui.setconfig(b'ui', b'traceback', b'on', b'--traceback') |
14615
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
227 |
39255
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
228 # set ui streams from the request |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
229 if req.fin: |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
230 req.ui.fin = req.fin |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
231 if req.fout: |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
232 req.ui.fout = req.fout |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
233 if req.ferr: |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
234 req.ui.ferr = req.ferr |
40587
5542bc9125c9
dispatch: pass around ui.fmsg channel
Yuya Nishihara <yuya@tcha.org>
parents:
40414
diff
changeset
|
235 if req.fmsg: |
5542bc9125c9
dispatch: pass around ui.fmsg channel
Yuya Nishihara <yuya@tcha.org>
parents:
40414
diff
changeset
|
236 req.ui.fmsg = req.fmsg |
39255
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
237 except error.Abort as inst: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
238 ferr.write(_(b"abort: %s\n") % inst) |
39255
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
239 if inst.hint: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
240 ferr.write(_(b"(%s)\n") % inst.hint) |
39255
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
241 return -1 |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
242 except error.ParseError as inst: |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
243 _formatparse(ferr.write, inst) |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
244 return -1 |
14615
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
245 |
39255
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
246 msg = _formatargs(req.args) |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
247 starttime = util.timer() |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
248 ret = 1 # default of Python exit code on unhandled exception |
28520
84cc72c5771e
dispatch: catch KeyboardInterrupt more broadly
Yuya Nishihara <yuya@tcha.org>
parents:
28515
diff
changeset
|
249 try: |
39255
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
250 ret = _runcatch(req) or 0 |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
251 except error.ProgrammingError as inst: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
252 req.ui.error(_(b'** ProgrammingError: %s\n') % inst) |
39255
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
253 if inst.hint: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
254 req.ui.error(_(b'** (%s)\n') % inst.hint) |
39255
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
255 raise |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
256 except KeyboardInterrupt as inst: |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
257 try: |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
258 if isinstance(inst, error.SignalInterrupt): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
259 msg = _(b"killed!\n") |
39255
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
260 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
261 msg = _(b"interrupted!\n") |
39255
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
262 req.ui.error(msg) |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
263 except error.SignalInterrupt: |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
264 # maybe pager would quit without consuming all the output, and |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
265 # SIGPIPE was raised. we cannot print anything in this case. |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
266 pass |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
267 except IOError as inst: |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
268 if inst.errno != errno.EPIPE: |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
269 raise |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
270 ret = -1 |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
271 finally: |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
272 duration = util.timer() - starttime |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
273 req.ui.flush() |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
274 if req.ui.logblockedtimes: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
275 req.ui._blockedtimes[b'command_duration'] = duration * 1000 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
276 req.ui.log( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
277 b'uiblocked', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
278 b'ui blocked ms\n', |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
279 **pycompat.strkwargs(req.ui._blockedtimes) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
280 ) |
40651
1243295fcc3a
logtoprocess: update commandfinish options arguments
Boris Feld <boris.feld@octobus.net>
parents:
40587
diff
changeset
|
281 return_code = ret & 255 |
1243295fcc3a
logtoprocess: update commandfinish options arguments
Boris Feld <boris.feld@octobus.net>
parents:
40587
diff
changeset
|
282 req.ui.log( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
283 b"commandfinish", |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
284 b"%s exited %d after %0.2f seconds\n", |
40651
1243295fcc3a
logtoprocess: update commandfinish options arguments
Boris Feld <boris.feld@octobus.net>
parents:
40587
diff
changeset
|
285 msg, |
1243295fcc3a
logtoprocess: update commandfinish options arguments
Boris Feld <boris.feld@octobus.net>
parents:
40587
diff
changeset
|
286 return_code, |
1243295fcc3a
logtoprocess: update commandfinish options arguments
Boris Feld <boris.feld@octobus.net>
parents:
40587
diff
changeset
|
287 duration, |
1243295fcc3a
logtoprocess: update commandfinish options arguments
Boris Feld <boris.feld@octobus.net>
parents:
40587
diff
changeset
|
288 return_code=return_code, |
1243295fcc3a
logtoprocess: update commandfinish options arguments
Boris Feld <boris.feld@octobus.net>
parents:
40587
diff
changeset
|
289 duration=duration, |
1243295fcc3a
logtoprocess: update commandfinish options arguments
Boris Feld <boris.feld@octobus.net>
parents:
40587
diff
changeset
|
290 canonical_command=req.canonical_command, |
1243295fcc3a
logtoprocess: update commandfinish options arguments
Boris Feld <boris.feld@octobus.net>
parents:
40587
diff
changeset
|
291 ) |
39255
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
292 try: |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
293 req._runexithandlers() |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
294 except: # exiting, so no re-raises |
39255
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
295 ret = ret or -1 |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
296 return ret |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
297 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
298 |
14439
80c599eee3f3
dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents:
14438
diff
changeset
|
299 def _runcatch(req): |
43238
101ae8bbfa02
cleanup: hgdemandimport.tracing accepts strings, not bytes
Augie Fackler <augie@google.com>
parents:
43117
diff
changeset
|
300 with tracing.log('dispatch._runcatch'): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
301 |
39255
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
302 def catchterm(*args): |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
303 raise error.SignalInterrupt |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
304 |
39255
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
305 ui = req.ui |
32050
77eaf9539499
dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents:
30678
diff
changeset
|
306 try: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
307 for name in b'SIGBREAK', b'SIGHUP', b'SIGTERM': |
39255
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
308 num = getattr(signal, name, None) |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
309 if num: |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
310 signal.signal(num, catchterm) |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
311 except ValueError: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
312 pass # happens if called in a thread |
32050
77eaf9539499
dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents:
30678
diff
changeset
|
313 |
39255
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
314 def _runcatchfunc(): |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
315 realcmd = None |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
316 try: |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
317 cmdargs = fancyopts.fancyopts( |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
318 req.args[:], commands.globalopts, {} |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
319 ) |
39255
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
320 cmd = cmdargs[0] |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
321 aliases, entry = cmdutil.findcmd(cmd, commands.table, False) |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
322 realcmd = aliases[0] |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
323 except ( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
324 error.UnknownCommand, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
325 error.AmbiguousCommand, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
326 IndexError, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
327 getopt.GetoptError, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
328 ): |
39255
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
329 # Don't handle this here. We know the command is |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
330 # invalid, but all we're worried about for now is that |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
331 # it's not a command that server operators expect to |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
332 # be safe to offer to users in a sandbox. |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
333 pass |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
334 if realcmd == b'serve' and b'--stdio' in cmdargs: |
39255
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
335 # We want to constrain 'hg serve --stdio' instances pretty |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
336 # closely, as many shared-ssh access tools want to grant |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
337 # access to run *only* 'hg -R $repo serve --stdio'. We |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
338 # restrict to exactly that set of arguments, and prohibit |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
339 # any repo name that starts with '--' to prevent |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
340 # shenanigans wherein a user does something like pass |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
341 # --debugger or --config=ui.debugger=1 as a repo |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
342 # name. This used to actually run the debugger. |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
343 if ( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
344 len(req.args) != 4 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
345 or req.args[0] != b'-R' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
346 or req.args[1].startswith(b'--') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
347 or req.args[2] != b'serve' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
348 or req.args[3] != b'--stdio' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
349 ): |
39255
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
350 raise error.Abort( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
351 _(b'potentially unsafe serve --stdio invocation: %s') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
352 % (stringutil.pprint(req.args),) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
353 ) |
19639
09573ad59f7b
dispatch: move command line --config argument parsing to _runcatch()
Sean Farley <sean.michael.farley@gmail.com>
parents:
19229
diff
changeset
|
354 |
39255
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
355 try: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
356 debugger = b'pdb' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
357 debugtrace = {b'pdb': pdb.set_trace} |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
358 debugmortem = {b'pdb': pdb.post_mortem} |
19639
09573ad59f7b
dispatch: move command line --config argument parsing to _runcatch()
Sean Farley <sean.michael.farley@gmail.com>
parents:
19229
diff
changeset
|
359 |
39255
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
360 # read --config before doing anything else |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
361 # (e.g. to change trust settings for reading .hg/hgrc) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
362 cfgs = _parseconfig(req.ui, req.earlyoptions[b'config']) |
39255
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
363 |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
364 if req.repo: |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
365 # copy configs that were passed on the cmdline (--config) to |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
366 # the repo ui |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
367 for sec, name, val in cfgs: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
368 req.repo.ui.setconfig( |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
369 sec, name, val, source=b'--config' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
370 ) |
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
|
371 |
39255
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
372 # developer config: ui.debugger |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
373 debugger = ui.config(b"ui", b"debugger") |
39255
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
374 debugmod = pdb |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
375 if not debugger or ui.plain(): |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
376 # if we are in HGPLAIN mode, then disable custom debugging |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
377 debugger = b'pdb' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
378 elif req.earlyoptions[b'debugger']: |
39255
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
379 # This import can be slow for fancy debuggers, so only |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
380 # do it when absolutely necessary, i.e. when actual |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
381 # debugging has been requested |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
382 with demandimport.deactivated(): |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
383 try: |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
384 debugmod = __import__(debugger) |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
385 except ImportError: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
386 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
|
387 |
39255
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
388 debugtrace[debugger] = debugmod.set_trace |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
389 debugmortem[debugger] = debugmod.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
|
390 |
39255
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
391 # enter the debugger before command execution |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
392 if req.earlyoptions[b'debugger']: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
393 ui.warn( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
394 _( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
395 b"entering debugger - " |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
396 b"type c to continue starting hg or h for help\n" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
397 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
398 ) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
399 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
400 if ( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
401 debugger != b'pdb' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
402 and debugtrace[debugger] == debugtrace[b'pdb'] |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
403 ): |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
404 ui.warn( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
405 _( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
406 b"%s debugger specified " |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
407 b"but its module was not found\n" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
408 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
409 % debugger |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
410 ) |
39255
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
411 with demandimport.deactivated(): |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
412 debugtrace[debugger]() |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
413 try: |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
414 return _dispatch(req) |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
415 finally: |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
416 ui.flush() |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
417 except: # re-raises |
39255
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
418 # enter the debugger when we hit an exception |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
419 if req.earlyoptions[b'debugger']: |
39255
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
420 traceback.print_exc() |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
421 debugmortem[debugger](sys.exc_info()[2]) |
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
422 raise |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
423 |
39255
4019b4542e61
dispatch: have dispatch.dispatch and dispatch._runcatch emit trace events
Augie Fackler <augie@google.com>
parents:
38788
diff
changeset
|
424 return _callcatch(ui, _runcatchfunc) |
29761
39149b6036e6
dispatch: split global error handling out so it can be reused
Jun Wu <quark@fb.com>
parents:
29132
diff
changeset
|
425 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
426 |
32040
0fb78cb90ca7
dispatch: mark callcatch() as a private function
Yuya Nishihara <yuya@tcha.org>
parents:
31960
diff
changeset
|
427 def _callcatch(ui, func): |
30520
4338f87dbf6f
dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents:
30519
diff
changeset
|
428 """like scmutil.callcatch but handles more high-level exceptions about |
4338f87dbf6f
dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents:
30519
diff
changeset
|
429 config parsing and commands. besides, use handlecommandexception to handle |
4338f87dbf6f
dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents:
30519
diff
changeset
|
430 uncaught exceptions. |
29761
39149b6036e6
dispatch: split global error handling out so it can be reused
Jun Wu <quark@fb.com>
parents:
29132
diff
changeset
|
431 """ |
39149b6036e6
dispatch: split global error handling out so it can be reused
Jun Wu <quark@fb.com>
parents:
29132
diff
changeset
|
432 try: |
30520
4338f87dbf6f
dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents:
30519
diff
changeset
|
433 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
|
434 except error.AmbiguousCommand as inst: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
435 ui.warn( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
436 _(b"hg: command '%s' is ambiguous:\n %s\n") |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
437 % (inst.args[0], b" ".join(inst.args[1])) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
438 ) |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25329
diff
changeset
|
439 except error.CommandError as inst: |
7645
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
440 if inst.args[0]: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
441 ui.pager(b'help') |
32620
3ce53a499334
dispatch: convert exception payload to bytes more carefully
Augie Fackler <raf@durin42.com>
parents:
32566
diff
changeset
|
442 msgbytes = pycompat.bytestr(inst.args[1]) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
443 ui.warn(_(b"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
|
444 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
|
445 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
446 ui.warn(_(b"hg: %s\n") % inst.args[1]) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
447 ui.warn(_(b"(use 'hg help -v' for a list of global options)\n")) |
30520
4338f87dbf6f
dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents:
30519
diff
changeset
|
448 except error.ParseError as inst: |
4338f87dbf6f
dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents:
30519
diff
changeset
|
449 _formatparse(ui.warn, inst) |
4338f87dbf6f
dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents:
30519
diff
changeset
|
450 return -1 |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25329
diff
changeset
|
451 except error.UnknownCommand as inst: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
452 nocmdmsg = _(b"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
|
453 try: |
de1e7099d100
dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents:
10282
diff
changeset
|
454 # 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
|
455 # (but don't check for extensions themselves) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
456 formatted = help.formattedhelp( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
457 ui, commands, inst.args[0], unknowncmd=True |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
458 ) |
31060
ab20491b1760
dispatch: rearrange 'unknown command' code to better employ pager
Augie Fackler <augie@google.com>
parents:
31027
diff
changeset
|
459 ui.warn(nocmdmsg) |
ab20491b1760
dispatch: rearrange 'unknown command' code to better employ pager
Augie Fackler <augie@google.com>
parents:
31027
diff
changeset
|
460 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
|
461 except (error.UnknownCommand, error.Abort): |
24222
02d7b5cd373b
dispatch: offer suggestions of similar-named commands
Augie Fackler <augie@google.com>
parents:
24221
diff
changeset
|
462 suggested = False |
02d7b5cd373b
dispatch: offer suggestions of similar-named commands
Augie Fackler <augie@google.com>
parents:
24221
diff
changeset
|
463 if len(inst.args) == 2: |
02d7b5cd373b
dispatch: offer suggestions of similar-named commands
Augie Fackler <augie@google.com>
parents:
24221
diff
changeset
|
464 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
|
465 if sim: |
31060
ab20491b1760
dispatch: rearrange 'unknown command' code to better employ pager
Augie Fackler <augie@google.com>
parents:
31027
diff
changeset
|
466 ui.warn(nocmdmsg) |
27623
b3376fba4ab9
dispatch: report similar names consistently
Bryan O'Sullivan <bos@serpentine.com>
parents:
27615
diff
changeset
|
467 _reportsimilar(ui.warn, sim) |
24222
02d7b5cd373b
dispatch: offer suggestions of similar-named commands
Augie Fackler <augie@google.com>
parents:
24221
diff
changeset
|
468 suggested = True |
02d7b5cd373b
dispatch: offer suggestions of similar-named commands
Augie Fackler <augie@google.com>
parents:
24221
diff
changeset
|
469 if not suggested: |
31060
ab20491b1760
dispatch: rearrange 'unknown command' code to better employ pager
Augie Fackler <augie@google.com>
parents:
31027
diff
changeset
|
470 ui.warn(nocmdmsg) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
471 ui.warn(_(b"(use 'hg help' for a list of commands)\n")) |
30520
4338f87dbf6f
dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents:
30519
diff
changeset
|
472 except IOError: |
4338f87dbf6f
dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents:
30519
diff
changeset
|
473 raise |
7645
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
474 except KeyboardInterrupt: |
28520
84cc72c5771e
dispatch: catch KeyboardInterrupt more broadly
Yuya Nishihara <yuya@tcha.org>
parents:
28515
diff
changeset
|
475 raise |
30520
4338f87dbf6f
dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents:
30519
diff
changeset
|
476 except: # probably re-raises |
28784
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
477 if not handlecommandexception(ui): |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
478 raise |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
479 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
480 return -1 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
481 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
482 |
14265
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
483 def aliasargs(fn, givenargs): |
34087
5361771f9714
wrapfunction: use functools.partial if possible
Jun Wu <quark@fb.com>
parents:
34022
diff
changeset
|
484 args = [] |
5361771f9714
wrapfunction: use functools.partial if possible
Jun Wu <quark@fb.com>
parents:
34022
diff
changeset
|
485 # only care about alias 'args', ignore 'args' set by extensions.wrapfunction |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
486 if not util.safehasattr(fn, b'_origfunc'): |
34087
5361771f9714
wrapfunction: use functools.partial if possible
Jun Wu <quark@fb.com>
parents:
34022
diff
changeset
|
487 args = getattr(fn, 'args', args) |
16294
795d591b6ef5
alias: abort on missing positional args (issue3331)
Matt Mackall <mpm@selenic.com>
parents:
16277
diff
changeset
|
488 if args: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
489 cmd = b' '.join(map(procutil.shellquote, args)) |
14265
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
490 |
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
491 nums = [] |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
492 |
14265
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
493 def replacer(m): |
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
494 num = int(m.group(1)) - 1 |
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
495 nums.append(num) |
16277
1c2aaf05f7d7
aliases: use empty string for missing position parameters (issue3331)
Matt Mackall <mpm@selenic.com>
parents:
15781
diff
changeset
|
496 if num < len(givenargs): |
1c2aaf05f7d7
aliases: use empty string for missing position parameters (issue3331)
Matt Mackall <mpm@selenic.com>
parents:
15781
diff
changeset
|
497 return givenargs[num] |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
498 raise error.Abort(_(b'too few arguments for command alias')) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
499 |
31491
492c64afc54c
py3: make the regular expression bytes to prevent TypeError
Pulkit Goyal <7895pulkit@gmail.com>
parents:
31305
diff
changeset
|
500 cmd = re.sub(br'\$(\d+|\$)', replacer, cmd) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
501 givenargs = [x for i, x in enumerate(givenargs) if i not in nums] |
30678
caf7e1c5efe4
py3: have a bytes version of shlex.split()
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30653
diff
changeset
|
502 args = pycompat.shlexsplit(cmd) |
14265
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
503 return args + givenargs |
8655 | 504 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
505 |
22158
bc2132dfc0a4
alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents:
21961
diff
changeset
|
506 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
|
507 '''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
|
508 |
bc2132dfc0a4
alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents:
21961
diff
changeset
|
509 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
|
510 ''' |
bc2132dfc0a4
alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents:
21961
diff
changeset
|
511 # 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
|
512 # built to match prefix + patterns. |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
513 replacemap = dict((b'$%d' % (i + 1), arg) for i, arg in enumerate(args)) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
514 replacemap[b'$0'] = name |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
515 replacemap[b'$$'] = b'$' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
516 replacemap[b'$@'] = b' '.join(args) |
22158
bc2132dfc0a4
alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents:
21961
diff
changeset
|
517 # 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
|
518 # 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
|
519 # 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
|
520 # tokenize each argument into exactly one word. |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
521 replacemap[b'"$@"'] = b' '.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
|
522 # escape '\$' for regex |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
523 regex = b'|'.join(replacemap.keys()).replace(b'$', br'\$') |
22158
bc2132dfc0a4
alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents:
21961
diff
changeset
|
524 r = re.compile(regex) |
bc2132dfc0a4
alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents:
21961
diff
changeset
|
525 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
|
526 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
527 |
8655 | 528 class cmdalias(object): |
37134
6890b7e991a4
help: supporting both help and doc for aliases
Rodrigo Damazio <rdamazio@google.com>
parents:
37120
diff
changeset
|
529 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
|
530 self.name = self.cmd = name |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
531 self.cmdname = b'' |
8655 | 532 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
|
533 self.fn = None |
29087
ad1bdea43965
dispatch: defer environment variable resolution in alias commands (BC)
Jun Wu <quark@fb.com>
parents:
28861
diff
changeset
|
534 self.givenargs = [] |
8655 | 535 self.opts = [] |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
536 self.help = b'' |
22160
645457f73aa6
alias: keep error message in "badalias" so that help can see it
Yuya Nishihara <yuya@tcha.org>
parents:
22158
diff
changeset
|
537 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
|
538 self.unknowncmd = False |
28828
3640c1702c43
help: report source of aliases
timeless <timeless@mozdev.org>
parents:
28821
diff
changeset
|
539 self.source = source |
8655 | 540 |
541 try: | |
12039
18e1e7520b67
alias: make shadowing behavior more consistent (issue2054)
Brodie Rao <brodie@bitheap.org>
parents:
11712
diff
changeset
|
542 aliases, entry = cmdutil.findcmd(self.name, cmdtable) |
43106
d783f945a701
py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents:
43089
diff
changeset
|
543 for alias, e in pycompat.iteritems(cmdtable): |
12039
18e1e7520b67
alias: make shadowing behavior more consistent (issue2054)
Brodie Rao <brodie@bitheap.org>
parents:
11712
diff
changeset
|
544 if e is entry: |
18e1e7520b67
alias: make shadowing behavior more consistent (issue2054)
Brodie Rao <brodie@bitheap.org>
parents:
11712
diff
changeset
|
545 self.cmd = alias |
18e1e7520b67
alias: make shadowing behavior more consistent (issue2054)
Brodie Rao <brodie@bitheap.org>
parents:
11712
diff
changeset
|
546 break |
8655 | 547 self.shadows = True |
548 except error.UnknownCommand: | |
549 self.shadows = False | |
550 | |
551 if not self.definition: | |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
552 self.badalias = _(b"no definition for alias '%s'") % self.name |
8655 | 553 return |
554 | |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
555 if self.definition.startswith(b'!'): |
37134
6890b7e991a4
help: supporting both help and doc for aliases
Rodrigo Damazio <rdamazio@google.com>
parents:
37120
diff
changeset
|
556 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
|
557 self.shell = True |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
558 |
11524
24965bb270b7
dispatch: add shell aliases
Steve Losh <steve@stevelosh.com>
parents:
11495
diff
changeset
|
559 def fn(ui, *args): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
560 env = {b'HG_ARGS': b' '.join((self.name,) + args)} |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
561 |
11989
f853873fc66d
aliases: provide more flexible ways to work with shell alias arguments
Steve Losh <steve@stevelosh.com>
parents:
11985
diff
changeset
|
562 def _checkvar(m): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
563 if m.groups()[0] == b'$': |
13392
777cef34a890
dispatch: support for $ escaping in shell-alias definition
Roman Sokolov <sokolov.r.v@gmail.com>
parents:
13382
diff
changeset
|
564 return m.group() |
777cef34a890
dispatch: support for $ escaping in shell-alias definition
Roman Sokolov <sokolov.r.v@gmail.com>
parents:
13382
diff
changeset
|
565 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
|
566 return m.group() |
f853873fc66d
aliases: provide more flexible ways to work with shell alias arguments
Steve Losh <steve@stevelosh.com>
parents:
11985
diff
changeset
|
567 else: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
568 ui.debug( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
569 b"No argument found for substitution " |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
570 b"of %i variable in alias '%s' definition.\n" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
571 % (int(m.groups()[0]), self.name) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
572 ) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
573 return b'' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
574 |
37134
6890b7e991a4
help: supporting both help and doc for aliases
Rodrigo Damazio <rdamazio@google.com>
parents:
37120
diff
changeset
|
575 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
|
576 cmd = aliasinterpolate(self.name, args, cmd) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
577 return ui.system( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
578 cmd, environ=env, blockedtag=b'alias_%s' % self.name |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
579 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
580 |
11524
24965bb270b7
dispatch: add shell aliases
Steve Losh <steve@stevelosh.com>
parents:
11495
diff
changeset
|
581 self.fn = fn |
40414
444861dc1e55
help: displaying documented aliases by default
rdamazio@google.com
parents:
40402
diff
changeset
|
582 self.alias = True |
37134
6890b7e991a4
help: supporting both help and doc for aliases
Rodrigo Damazio <rdamazio@google.com>
parents:
37120
diff
changeset
|
583 self._populatehelp(ui, name, shdef, self.fn) |
11524
24965bb270b7
dispatch: add shell aliases
Steve Losh <steve@stevelosh.com>
parents:
11495
diff
changeset
|
584 return |
24965bb270b7
dispatch: add shell aliases
Steve Losh <steve@stevelosh.com>
parents:
11495
diff
changeset
|
585 |
21569
c5afb07c33d3
alias: handle shlex error in command aliases
Yuya Nishihara <yuya@tcha.org>
parents:
21556
diff
changeset
|
586 try: |
30678
caf7e1c5efe4
py3: have a bytes version of shlex.split()
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30653
diff
changeset
|
587 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
|
588 except ValueError as inst: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
589 self.badalias = _(b"error in definition for alias '%s': %s") % ( |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
590 self.name, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
591 stringutil.forcebytestr(inst), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
592 ) |
21569
c5afb07c33d3
alias: handle shlex error in command aliases
Yuya Nishihara <yuya@tcha.org>
parents:
21556
diff
changeset
|
593 return |
35225
7ce0ba3a1c32
dispatch: replace _earlygetopt(strip=True) with new parser
Yuya Nishihara <yuya@tcha.org>
parents:
35224
diff
changeset
|
594 earlyopts, args = _earlysplitopts(args) |
7ce0ba3a1c32
dispatch: replace _earlygetopt(strip=True) with new parser
Yuya Nishihara <yuya@tcha.org>
parents:
35224
diff
changeset
|
595 if earlyopts: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
596 self.badalias = _( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
597 b"error in definition for alias '%s': %s may " |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
598 b"only be given on the command line" |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
599 ) % (self.name, b'/'.join(pycompat.ziplist(*earlyopts)[0])) |
35225
7ce0ba3a1c32
dispatch: replace _earlygetopt(strip=True) with new parser
Yuya Nishihara <yuya@tcha.org>
parents:
35224
diff
changeset
|
600 return |
12092
4982fa38e544
alias: print what command is being shadowed in debug message
Brodie Rao <brodie@bitheap.org>
parents:
12070
diff
changeset
|
601 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
|
602 self.givenargs = args |
8655 | 603 |
604 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
|
605 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
|
606 if len(tableentry) > 2: |
37134
6890b7e991a4
help: supporting both help and doc for aliases
Rodrigo Damazio <rdamazio@google.com>
parents:
37120
diff
changeset
|
607 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
|
608 else: |
8bce1e0d2801
alias: do not crash when aliased command has no usage help text
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9825
diff
changeset
|
609 self.fn, self.opts = tableentry |
37134
6890b7e991a4
help: supporting both help and doc for aliases
Rodrigo Damazio <rdamazio@google.com>
parents:
37120
diff
changeset
|
610 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
|
611 |
40414
444861dc1e55
help: displaying documented aliases by default
rdamazio@google.com
parents:
40402
diff
changeset
|
612 self.alias = True |
37134
6890b7e991a4
help: supporting both help and doc for aliases
Rodrigo Damazio <rdamazio@google.com>
parents:
37120
diff
changeset
|
613 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
|
614 |
8655 | 615 except error.UnknownCommand: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
616 self.badalias = _( |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
617 b"alias '%s' resolves to unknown command '%s'" |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
618 ) % (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
|
619 self.unknowncmd = True |
8655 | 620 except error.AmbiguousCommand: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
621 self.badalias = _( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
622 b"alias '%s' resolves to ambiguous command '%s'" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
623 ) % (self.name, cmd) |
8655 | 624 |
37134
6890b7e991a4
help: supporting both help and doc for aliases
Rodrigo Damazio <rdamazio@google.com>
parents:
37120
diff
changeset
|
625 def _populatehelp(self, ui, name, cmd, fn, defaulthelp=None): |
37139
aa55c5354b8f
alias: reject non-ascii characters in user help/doc strings
Yuya Nishihara <yuya@tcha.org>
parents:
37134
diff
changeset
|
626 # 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:
37134
diff
changeset
|
627 cfg = {} |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
628 for k in (b'doc', b'help', b'category'): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
629 v = ui.config(b'alias', b'%s:%s' % (name, k), None) |
37139
aa55c5354b8f
alias: reject non-ascii characters in user help/doc strings
Yuya Nishihara <yuya@tcha.org>
parents:
37134
diff
changeset
|
630 if v is None: |
aa55c5354b8f
alias: reject non-ascii characters in user help/doc strings
Yuya Nishihara <yuya@tcha.org>
parents:
37134
diff
changeset
|
631 continue |
aa55c5354b8f
alias: reject non-ascii characters in user help/doc strings
Yuya Nishihara <yuya@tcha.org>
parents:
37134
diff
changeset
|
632 if not encoding.isasciistr(v): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
633 self.badalias = _( |
43117
8ff1ecfadcd1
cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents:
43106
diff
changeset
|
634 b"non-ASCII character in alias definition '%s:%s'" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
635 ) % (name, k) |
37139
aa55c5354b8f
alias: reject non-ascii characters in user help/doc strings
Yuya Nishihara <yuya@tcha.org>
parents:
37134
diff
changeset
|
636 return |
aa55c5354b8f
alias: reject non-ascii characters in user help/doc strings
Yuya Nishihara <yuya@tcha.org>
parents:
37134
diff
changeset
|
637 cfg[k] = v |
aa55c5354b8f
alias: reject non-ascii characters in user help/doc strings
Yuya Nishihara <yuya@tcha.org>
parents:
37134
diff
changeset
|
638 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
639 self.help = cfg.get(b'help', defaulthelp or b'') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
640 if self.help and self.help.startswith(b"hg " + cmd): |
37134
6890b7e991a4
help: supporting both help and doc for aliases
Rodrigo Damazio <rdamazio@google.com>
parents:
37120
diff
changeset
|
641 # drop prefix in old-style help lines so hg shows the alias |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
642 self.help = self.help[4 + len(cmd) :] |
37134
6890b7e991a4
help: supporting both help and doc for aliases
Rodrigo Damazio <rdamazio@google.com>
parents:
37120
diff
changeset
|
643 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
644 self.owndoc = b'doc' in cfg |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
645 doc = cfg.get(b'doc', pycompat.getdoc(fn)) |
37140
1d56c539794e
py3: bytes/unicode dance on __doc__ of cmdalias
Yuya Nishihara <yuya@tcha.org>
parents:
37139
diff
changeset
|
646 if doc is not None: |
1d56c539794e
py3: bytes/unicode dance on __doc__ of cmdalias
Yuya Nishihara <yuya@tcha.org>
parents:
37139
diff
changeset
|
647 doc = pycompat.sysstr(doc) |
1d56c539794e
py3: bytes/unicode dance on __doc__ of cmdalias
Yuya Nishihara <yuya@tcha.org>
parents:
37139
diff
changeset
|
648 self.__doc__ = doc |
37134
6890b7e991a4
help: supporting both help and doc for aliases
Rodrigo Damazio <rdamazio@google.com>
parents:
37120
diff
changeset
|
649 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
650 self.helpcategory = cfg.get( |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
651 b'category', registrar.command.CATEGORY_NONE |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
652 ) |
40414
444861dc1e55
help: displaying documented aliases by default
rdamazio@google.com
parents:
40402
diff
changeset
|
653 |
29087
ad1bdea43965
dispatch: defer environment variable resolution in alias commands (BC)
Jun Wu <quark@fb.com>
parents:
28861
diff
changeset
|
654 @property |
ad1bdea43965
dispatch: defer environment variable resolution in alias commands (BC)
Jun Wu <quark@fb.com>
parents:
28861
diff
changeset
|
655 def args(self): |
31629
2632df096fc0
dispatch: use pycompat.maplist() instead of map() to get a list
Pulkit Goyal <7895pulkit@gmail.com>
parents:
31502
diff
changeset
|
656 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
|
657 return aliasargs(self.fn, args) |
ad1bdea43965
dispatch: defer environment variable resolution in alias commands (BC)
Jun Wu <quark@fb.com>
parents:
28861
diff
changeset
|
658 |
28621
d856e85a8a7a
dispatch: make cmdalias forward command attributes to function
Yuya Nishihara <yuya@tcha.org>
parents:
28538
diff
changeset
|
659 def __getattr__(self, name): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
660 adefaults = { |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
661 r'norepo': True, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
662 r'intents': set(), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
663 r'optionalrepo': False, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
664 r'inferrepo': False, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
665 } |
28621
d856e85a8a7a
dispatch: make cmdalias forward command attributes to function
Yuya Nishihara <yuya@tcha.org>
parents:
28538
diff
changeset
|
666 if name not in adefaults: |
d856e85a8a7a
dispatch: make cmdalias forward command attributes to function
Yuya Nishihara <yuya@tcha.org>
parents:
28538
diff
changeset
|
667 raise AttributeError(name) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
668 if self.badalias or util.safehasattr(self, b'shell'): |
28621
d856e85a8a7a
dispatch: make cmdalias forward command attributes to function
Yuya Nishihara <yuya@tcha.org>
parents:
28538
diff
changeset
|
669 return adefaults[name] |
d856e85a8a7a
dispatch: make cmdalias forward command attributes to function
Yuya Nishihara <yuya@tcha.org>
parents:
28538
diff
changeset
|
670 return getattr(self.fn, name) |
d856e85a8a7a
dispatch: make cmdalias forward command attributes to function
Yuya Nishihara <yuya@tcha.org>
parents:
28538
diff
changeset
|
671 |
8655 | 672 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
|
673 if self.badalias: |
22164
efd65e51bc0b
alias: exit from bad definition by Abort
Yuya Nishihara <yuya@tcha.org>
parents:
22163
diff
changeset
|
674 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
|
675 if self.unknowncmd: |
10364
de1e7099d100
dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents:
10282
diff
changeset
|
676 try: |
de1e7099d100
dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents:
10282
diff
changeset
|
677 # 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
|
678 cmd, ext = extensions.disabledcmd(ui, self.cmdname)[:2] |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
679 hint = _(b"'%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
|
680 except error.UnknownCommand: |
de1e7099d100
dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents:
10282
diff
changeset
|
681 pass |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26421
diff
changeset
|
682 raise error.Abort(self.badalias, hint=hint) |
8655 | 683 if self.shadows: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
684 ui.debug( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
685 b"alias '%s' shadows command '%s'\n" % (self.name, self.cmdname) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
686 ) |
8655 | 687 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
688 ui.log( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
689 b'commandalias', |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
690 b"alias '%s' expands to '%s'\n", |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
691 self.name, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
692 self.definition, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
693 ) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
694 if util.safehasattr(self, b'shell'): |
11989
f853873fc66d
aliases: provide more flexible ways to work with shell alias arguments
Steve Losh <steve@stevelosh.com>
parents:
11985
diff
changeset
|
695 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
|
696 else: |
12093
cd895084a4cd
alias: on --debug, print expansion when it has invalid arguments
Brodie Rao <brodie@bitheap.org>
parents:
12092
diff
changeset
|
697 try: |
21556
5e13507a3b4e
alias: fix loss of non-zero return code in command aliases
Yuya Nishihara <yuya@tcha.org>
parents:
20829
diff
changeset
|
698 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
|
699 except error.SignatureError: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
700 args = b' '.join([self.cmdname] + self.args) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
701 ui.debug(b"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
|
702 raise |
8655 | 703 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
704 |
34306
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
705 class lazyaliasentry(object): |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
706 """like a typical command entry (func, opts, help), but is lazy""" |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
707 |
37134
6890b7e991a4
help: supporting both help and doc for aliases
Rodrigo Damazio <rdamazio@google.com>
parents:
37120
diff
changeset
|
708 def __init__(self, ui, name, definition, cmdtable, source): |
6890b7e991a4
help: supporting both help and doc for aliases
Rodrigo Damazio <rdamazio@google.com>
parents:
37120
diff
changeset
|
709 self.ui = ui |
34306
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
710 self.name = name |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
711 self.definition = definition |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
712 self.cmdtable = cmdtable.copy() |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
713 self.source = source |
40414
444861dc1e55
help: displaying documented aliases by default
rdamazio@google.com
parents:
40402
diff
changeset
|
714 self.alias = True |
34306
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
715 |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
716 @util.propertycache |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
717 def _aliasdef(self): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
718 return cmdalias( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
719 self.ui, self.name, self.definition, self.cmdtable, self.source |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
720 ) |
34306
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
721 |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
722 def __getitem__(self, n): |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
723 aliasdef = self._aliasdef |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
724 if n == 0: |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
725 return aliasdef |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
726 elif n == 1: |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
727 return aliasdef.opts |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
728 elif n == 2: |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
729 return aliasdef.help |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
730 else: |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
731 raise IndexError |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
732 |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
733 def __iter__(self): |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
734 for i in range(3): |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
735 yield self[i] |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
736 |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
737 def __len__(self): |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
738 return 3 |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
739 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
740 |
8655 | 741 def addaliases(ui, cmdtable): |
742 # aliases are processed after extensions have been loaded, so they | |
743 # may use extension commands. Aliases can also use other alias definitions, | |
744 # but only if they have been defined prior to the current definition. | |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
745 for alias, definition in ui.configitems(b'alias', ignoresub=True): |
15019
f4b7be3f8430
dispatch: don't rewrap aliases that have the same definition
Idan Kamara <idankk86@gmail.com>
parents:
14992
diff
changeset
|
746 try: |
34306
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
747 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
|
748 continue |
f4b7be3f8430
dispatch: don't rewrap aliases that have the same definition
Idan Kamara <idankk86@gmail.com>
parents:
14992
diff
changeset
|
749 except (KeyError, AttributeError): |
f4b7be3f8430
dispatch: don't rewrap aliases that have the same definition
Idan Kamara <idankk86@gmail.com>
parents:
14992
diff
changeset
|
750 # 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
|
751 pass |
f4b7be3f8430
dispatch: don't rewrap aliases that have the same definition
Idan Kamara <idankk86@gmail.com>
parents:
14992
diff
changeset
|
752 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
753 source = ui.configsource(b'alias', alias) |
37134
6890b7e991a4
help: supporting both help and doc for aliases
Rodrigo Damazio <rdamazio@google.com>
parents:
37120
diff
changeset
|
754 entry = lazyaliasentry(ui, alias, definition, cmdtable, source) |
34306
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
755 cmdtable[alias] = entry |
8655 | 756 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
757 |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
758 def _parse(ui, args): |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
759 options = {} |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
760 cmdoptions = {} |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
761 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
762 try: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
763 args = fancyopts.fancyopts(args, commands.globalopts, options) |
30576
541949a10a68
fancyopts: switch from fancyopts.getopt.* to getopt.*
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30559
diff
changeset
|
764 except getopt.GetoptError as inst: |
37084
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36729
diff
changeset
|
765 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
|
766 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
767 if args: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
768 cmd, args = args[0], args[1:] |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
769 aliases, entry = cmdutil.findcmd( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
770 cmd, commands.table, ui.configbool(b"ui", b"strict") |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
771 ) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
772 cmd = aliases[0] |
14265
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
773 args = aliasargs(entry[0], args) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
774 defaults = ui.config(b"defaults", cmd) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
775 if defaults: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
776 args = ( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
777 pycompat.maplist(util.expandpath, pycompat.shlexsplit(defaults)) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
778 + args |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
779 ) |
9875
d6a95c5f6ff9
dispatch: minor refactoring
Henri Wiechers <hwiechers@gmail.com>
parents:
9825
diff
changeset
|
780 c = list(entry[1]) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
781 else: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
782 cmd = None |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
783 c = [] |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
784 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
785 # combine global options into local |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
786 for o in commands.globalopts: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
787 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
|
788 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
789 try: |
29822
61a4cdc98307
dispatch: explicitly pass fancyopts optional arg as a keyword
Augie Fackler <augie@google.com>
parents:
29784
diff
changeset
|
790 args = fancyopts.fancyopts(args, c, cmdoptions, gnu=True) |
30576
541949a10a68
fancyopts: switch from fancyopts.getopt.* to getopt.*
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30559
diff
changeset
|
791 except getopt.GetoptError as inst: |
37084
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36729
diff
changeset
|
792 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
|
793 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
794 # separate global options back out |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
795 for o in commands.globalopts: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
796 n = o[1] |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
797 options[n] = cmdoptions[n] |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
798 del cmdoptions[n] |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
799 |
9875
d6a95c5f6ff9
dispatch: minor refactoring
Henri Wiechers <hwiechers@gmail.com>
parents:
9825
diff
changeset
|
800 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
|
801 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
802 |
8137 | 803 def _parseconfig(ui, config): |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
804 """parse the --config options from the command line""" |
14753
10dcb3e7cb55
dispatch: return read config options
Idan Kamara <idankk86@gmail.com>
parents:
14752
diff
changeset
|
805 configs = [] |
10dcb3e7cb55
dispatch: return read config options
Idan Kamara <idankk86@gmail.com>
parents:
14752
diff
changeset
|
806 |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
807 for cfg in config: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
808 try: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
809 name, value = [cfgelem.strip() for cfgelem in cfg.split(b'=', 1)] |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
810 section, name = name.split(b'.', 1) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
811 if not section or not name: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
812 raise IndexError |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
813 ui.setconfig(section, name, value, b'--config') |
14753
10dcb3e7cb55
dispatch: return read config options
Idan Kamara <idankk86@gmail.com>
parents:
14752
diff
changeset
|
814 configs.append((section, name, value)) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
815 except (IndexError, ValueError): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
816 raise error.Abort( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
817 _( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
818 b'malformed --config option: %r ' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
819 b'(use --config section.name=value)' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
820 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
821 % pycompat.bytestr(cfg) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
822 ) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
823 |
14753
10dcb3e7cb55
dispatch: return read config options
Idan Kamara <idankk86@gmail.com>
parents:
14752
diff
changeset
|
824 return configs |
10dcb3e7cb55
dispatch: return read config options
Idan Kamara <idankk86@gmail.com>
parents:
14752
diff
changeset
|
825 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
826 |
35224
6e6d0a5b88e6
dispatch: replace _earlyreq*() with new fancyopts-based parser
Yuya Nishihara <yuya@tcha.org>
parents:
35223
diff
changeset
|
827 def _earlyparseopts(ui, args): |
35170
c9740b69b9b7
dispatch: add HGPLAIN=+strictflags to restrict early parsing of global options
Yuya Nishihara <yuya@tcha.org>
parents:
35034
diff
changeset
|
828 options = {} |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
829 fancyopts.fancyopts( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
830 args, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
831 commands.globalopts, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
832 options, |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
833 gnu=not ui.plain(b'strictflags'), |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
834 early=True, |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
835 optaliases={b'repository': [b'repo']}, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
836 ) |
35170
c9740b69b9b7
dispatch: add HGPLAIN=+strictflags to restrict early parsing of global options
Yuya Nishihara <yuya@tcha.org>
parents:
35034
diff
changeset
|
837 return options |
c9740b69b9b7
dispatch: add HGPLAIN=+strictflags to restrict early parsing of global options
Yuya Nishihara <yuya@tcha.org>
parents:
35034
diff
changeset
|
838 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
839 |
35225
7ce0ba3a1c32
dispatch: replace _earlygetopt(strip=True) with new parser
Yuya Nishihara <yuya@tcha.org>
parents:
35224
diff
changeset
|
840 def _earlysplitopts(args): |
7ce0ba3a1c32
dispatch: replace _earlygetopt(strip=True) with new parser
Yuya Nishihara <yuya@tcha.org>
parents:
35224
diff
changeset
|
841 """Split args into a list of possible early options and remainder args""" |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
842 shortoptions = b'R:' |
35225
7ce0ba3a1c32
dispatch: replace _earlygetopt(strip=True) with new parser
Yuya Nishihara <yuya@tcha.org>
parents:
35224
diff
changeset
|
843 # TODO: perhaps 'debugger' should be included |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
844 longoptions = [b'cwd=', b'repository=', b'repo=', b'config='] |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
845 return fancyopts.earlygetopt( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
846 args, shortoptions, longoptions, gnu=True, keepsep=True |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
847 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
848 |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
849 |
11330
713ae78bb583
provide pre- and post- hooks with parsed command line arguments.
Chad Dombrova <chadrik@gmail.com>
parents:
11305
diff
changeset
|
850 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
|
851 # run pre-hook, and abort if it fails |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
852 hook.hook( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
853 lui, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
854 repo, |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
855 b"pre-%s" % cmd, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
856 True, |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
857 args=b" ".join(fullargs), |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
858 pats=cmdpats, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
859 opts=cmdoptions, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
860 ) |
29129
e6dfb0e4eeef
dispatch: add fail-* family of hooks
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
29114
diff
changeset
|
861 try: |
e6dfb0e4eeef
dispatch: add fail-* family of hooks
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
29114
diff
changeset
|
862 ret = _runcommand(ui, options, cmd, d) |
e6dfb0e4eeef
dispatch: add fail-* family of hooks
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
29114
diff
changeset
|
863 # run post-hook, passing command result |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
864 hook.hook( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
865 lui, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
866 repo, |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
867 b"post-%s" % cmd, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
868 False, |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
869 args=b" ".join(fullargs), |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
870 result=ret, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
871 pats=cmdpats, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
872 opts=cmdoptions, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
873 ) |
29129
e6dfb0e4eeef
dispatch: add fail-* family of hooks
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
29114
diff
changeset
|
874 except Exception: |
e6dfb0e4eeef
dispatch: add fail-* family of hooks
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
29114
diff
changeset
|
875 # run failure hook and re-raise |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
876 hook.hook( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
877 lui, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
878 repo, |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
879 b"fail-%s" % cmd, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
880 False, |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
881 args=b" ".join(fullargs), |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
882 pats=cmdpats, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
883 opts=cmdoptions, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
884 ) |
29129
e6dfb0e4eeef
dispatch: add fail-* family of hooks
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
29114
diff
changeset
|
885 raise |
7819
14b703252f14
dispatch: extract command execution block into method
Bill Barry <after.fallout@gmail.com>
parents:
7772
diff
changeset
|
886 return ret |
14b703252f14
dispatch: extract command execution block into method
Bill Barry <after.fallout@gmail.com>
parents:
7772
diff
changeset
|
887 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
888 |
28263
59509c6724c7
dispatch: add wd parameter to _getlocal
Jun Wu <quark@fb.com>
parents:
28081
diff
changeset
|
889 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
|
890 """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
|
891 |
12536
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
892 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
|
893 """ |
28263
59509c6724c7
dispatch: add wd parameter to _getlocal
Jun Wu <quark@fb.com>
parents:
28081
diff
changeset
|
894 if wd is None: |
59509c6724c7
dispatch: add wd parameter to _getlocal
Jun Wu <quark@fb.com>
parents:
28081
diff
changeset
|
895 try: |
39818
24e493ec2229
py3: rename pycompat.getcwd() to encoding.getcwd() (API)
Matt Harbison <matt_harbison@yahoo.com>
parents:
39512
diff
changeset
|
896 wd = encoding.getcwd() |
28263
59509c6724c7
dispatch: add wd parameter to _getlocal
Jun Wu <quark@fb.com>
parents:
28081
diff
changeset
|
897 except OSError as e: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
898 raise error.Abort( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
899 _(b"error getting current working directory: %s") |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
900 % encoding.strtolocal(e.strerror) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
901 ) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
902 path = cmdutil.findrepo(wd) or b"" |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
903 if not path: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
904 lui = ui |
9436 | 905 else: |
12636
c24215aa7e69
dispatch: remove superfluous try/except when reading local ui config
Brodie Rao <brodie@bitheap.org>
parents:
12633
diff
changeset
|
906 lui = ui.copy() |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
907 lui.readconfig(os.path.join(path, b".hg", b"hgrc"), path) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
908 |
35033
d3d35a55e03b
dispatch: convert non-list option parsed by _earlygetopt() to string
Yuya Nishihara <yuya@tcha.org>
parents:
35032
diff
changeset
|
909 if rpath: |
d3d35a55e03b
dispatch: convert non-list option parsed by _earlygetopt() to string
Yuya Nishihara <yuya@tcha.org>
parents:
35032
diff
changeset
|
910 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
|
911 lui = ui.copy() |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
912 lui.readconfig(os.path.join(path, b".hg", b"hgrc"), path) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
913 |
12536
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
914 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
|
915 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
916 |
29132
12769703d4ba
dispatch: always load extensions before running shell aliases (issue5230)
Jun Wu <quark@fb.com>
parents:
29129
diff
changeset
|
917 def _checkshellalias(lui, ui, args): |
12769703d4ba
dispatch: always load extensions before running shell aliases (issue5230)
Jun Wu <quark@fb.com>
parents:
29129
diff
changeset
|
918 """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
|
919 options = {} |
12748
d10369fefd01
alias: fail gracefully when invalid global options are given (issue2442)
Steve Losh <steve@stevelosh.com>
parents:
12637
diff
changeset
|
920 |
d10369fefd01
alias: fail gracefully when invalid global options are given (issue2442)
Steve Losh <steve@stevelosh.com>
parents:
12637
diff
changeset
|
921 try: |
d10369fefd01
alias: fail gracefully when invalid global options are given (issue2442)
Steve Losh <steve@stevelosh.com>
parents:
12637
diff
changeset
|
922 args = fancyopts.fancyopts(args, commands.globalopts, options) |
30576
541949a10a68
fancyopts: switch from fancyopts.getopt.* to getopt.*
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30559
diff
changeset
|
923 except getopt.GetoptError: |
12748
d10369fefd01
alias: fail gracefully when invalid global options are given (issue2442)
Steve Losh <steve@stevelosh.com>
parents:
12637
diff
changeset
|
924 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
|
925 |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
926 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
|
927 return |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
928 |
29132
12769703d4ba
dispatch: always load extensions before running shell aliases (issue5230)
Jun Wu <quark@fb.com>
parents:
29129
diff
changeset
|
929 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
|
930 |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
931 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
|
932 try: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
933 strict = ui.configbool(b"ui", b"strict") |
22377
f98abe3146b2
dispatch: check shell alias again after loading extensions (issue4355)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22376
diff
changeset
|
934 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
|
935 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
|
936 return |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
937 |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
938 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
|
939 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
|
940 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
941 if cmd and util.safehasattr(fn, b'shell'): |
35034
02845f7441af
dispatch: verify result of early command parsing
Yuya Nishihara <yuya@tcha.org>
parents:
35033
diff
changeset
|
942 # shell alias shouldn't receive early options which are consumed by hg |
35225
7ce0ba3a1c32
dispatch: replace _earlygetopt(strip=True) with new parser
Yuya Nishihara <yuya@tcha.org>
parents:
35224
diff
changeset
|
943 _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
|
944 d = lambda: fn(ui, *args[1:]) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
945 return lambda: runcommand( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
946 lui, None, cmd, args[:1], ui, options, d, [], {} |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
947 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
948 |
12536
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
949 |
14439
80c599eee3f3
dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents:
14438
diff
changeset
|
950 def _dispatch(req): |
14438
08bfec2ef031
dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents:
14286
diff
changeset
|
951 args = req.args |
14439
80c599eee3f3
dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents:
14438
diff
changeset
|
952 ui = req.ui |
80c599eee3f3
dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents:
14438
diff
changeset
|
953 |
12536
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
954 # check for cwd |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
955 cwd = req.earlyoptions[b'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
|
956 if cwd: |
35033
d3d35a55e03b
dispatch: convert non-list option parsed by _earlygetopt() to string
Yuya Nishihara <yuya@tcha.org>
parents:
35032
diff
changeset
|
957 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
|
958 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
959 rpath = req.earlyoptions[b'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
|
960 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
|
961 |
32291
bd872f64a8ba
cleanup: use set literals
Martin von Zweigbergk <martinvonz@google.com>
parents:
32158
diff
changeset
|
962 uis = {ui, lui} |
30933
69a3c6c8bf95
dispatch: move detection of profiling earlier during startup
Bryan O'Sullivan <bryano@fb.com>
parents:
30917
diff
changeset
|
963 |
69a3c6c8bf95
dispatch: move detection of profiling earlier during startup
Bryan O'Sullivan <bryano@fb.com>
parents:
30917
diff
changeset
|
964 if req.repo: |
69a3c6c8bf95
dispatch: move detection of profiling earlier during startup
Bryan O'Sullivan <bryano@fb.com>
parents:
30917
diff
changeset
|
965 uis.add(req.repo.ui) |
69a3c6c8bf95
dispatch: move detection of profiling earlier during startup
Bryan O'Sullivan <bryano@fb.com>
parents:
30917
diff
changeset
|
966 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
967 if ( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
968 req.earlyoptions[b'verbose'] |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
969 or req.earlyoptions[b'debug'] |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
970 or req.earlyoptions[b'quiet'] |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
971 ): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
972 for opt in (b'verbose', b'debug', b'quiet'): |
38534
b86664c81833
debug: process --debug flag earlier
Boris Feld <boris.feld@octobus.net>
parents:
38110
diff
changeset
|
973 val = pycompat.bytestr(bool(req.earlyoptions[opt])) |
b86664c81833
debug: process --debug flag earlier
Boris Feld <boris.feld@octobus.net>
parents:
38110
diff
changeset
|
974 for ui_ in uis: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
975 ui_.setconfig(b'ui', opt, val, b'--' + opt) |
38534
b86664c81833
debug: process --debug flag earlier
Boris Feld <boris.feld@octobus.net>
parents:
38110
diff
changeset
|
976 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
977 if req.earlyoptions[b'profile']: |
30933
69a3c6c8bf95
dispatch: move detection of profiling earlier during startup
Bryan O'Sullivan <bryano@fb.com>
parents:
30917
diff
changeset
|
978 for ui_ in uis: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
979 ui_.setconfig(b'profiling', b'enabled', b'true', b'--profile') |
30933
69a3c6c8bf95
dispatch: move detection of profiling earlier during startup
Bryan O'Sullivan <bryano@fb.com>
parents:
30917
diff
changeset
|
980 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
981 profile = lui.configbool(b'profiling', b'enabled') |
32788
eede022fc142
profile: drop maybeprofile
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32787
diff
changeset
|
982 with profiling.profile(lui, enabled=profile) as profiler: |
30934
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
983 # Configure extensions in phases: uisetup, extsetup, cmdtable, and |
33053
ef46d432e2e4
dispatch: remove unused _loaded
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33052
diff
changeset
|
984 # reposetup |
30934
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
985 extensions.loadall(lui) |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
986 # Propagate any changes to lui.__class__ by extensions |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
987 ui.__class__ = lui.__class__ |
5828
863e237b58fb
dispatch: allow extensions to provide setup code
Kirill Smelkov <kirr@mns.spb.ru>
parents:
5664
diff
changeset
|
988 |
30934
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
989 # (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
|
990 |
30934
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
991 # (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
|
992 |
30934
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
993 addaliases(lui, commands.table) |
8655 | 994 |
30934
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
995 # All aliases and commands are completely defined, now. |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
996 # Check abbreviation/ambiguity of shell alias. |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
997 shellaliasfn = _checkshellalias(lui, ui, args) |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
998 if shellaliasfn: |
40729
c93d046d4300
extensions: add "uipopulate" hook, called per instance, not per process
Yuya Nishihara <yuya@tcha.org>
parents:
40651
diff
changeset
|
999 # no additional configs will be set, set up the ui instances |
c93d046d4300
extensions: add "uipopulate" hook, called per instance, not per process
Yuya Nishihara <yuya@tcha.org>
parents:
40651
diff
changeset
|
1000 for ui_ in uis: |
c93d046d4300
extensions: add "uipopulate" hook, called per instance, not per process
Yuya Nishihara <yuya@tcha.org>
parents:
40651
diff
changeset
|
1001 extensions.populateui(ui_) |
30006
b19c2679289c
dispatch: make hg --profile wrap reposetup
Arun Kulshreshtha <kulshrax@fb.com>
parents:
30005
diff
changeset
|
1002 return shellaliasfn() |
22377
f98abe3146b2
dispatch: check shell alias again after loading extensions (issue4355)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22376
diff
changeset
|
1003 |
30934
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
1004 # check for fallback encoding |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1005 fallback = lui.config(b'ui', b'fallbackencoding') |
30934
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
1006 if fallback: |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
1007 encoding.fallbackencoding = fallback |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
1008 |
30934
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
1009 fullargs = args |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
1010 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
|
1011 |
40402
106adc261492
logtoprocess: sends the canonical command name to the subprocess
Boris Feld <boris.feld@octobus.net>
parents:
39818
diff
changeset
|
1012 # store the canonical command name in request object for later access |
106adc261492
logtoprocess: sends the canonical command name to the subprocess
Boris Feld <boris.feld@octobus.net>
parents:
39818
diff
changeset
|
1013 req.canonical_command = cmd |
106adc261492
logtoprocess: sends the canonical command name to the subprocess
Boris Feld <boris.feld@octobus.net>
parents:
39818
diff
changeset
|
1014 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1015 if options[b"config"] != req.earlyoptions[b"config"]: |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1016 raise error.Abort(_(b"option --config may not be abbreviated!")) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1017 if options[b"cwd"] != req.earlyoptions[b"cwd"]: |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1018 raise error.Abort(_(b"option --cwd may not be abbreviated!")) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1019 if options[b"repository"] != req.earlyoptions[b"repository"]: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
1020 raise error.Abort( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
1021 _( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1022 b"option -R has to be separated from other options (e.g. not " |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1023 b"-qR) and --repository may only be abbreviated as --repo!" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
1024 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
1025 ) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1026 if options[b"debugger"] != req.earlyoptions[b"debugger"]: |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1027 raise error.Abort(_(b"option --debugger may not be abbreviated!")) |
35030
d9aba3730d30
dispatch: abort if early boolean options can't be parsed
Yuya Nishihara <yuya@tcha.org>
parents:
35029
diff
changeset
|
1028 # 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
|
1029 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1030 if options[b"encoding"]: |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1031 encoding.encoding = options[b"encoding"] |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1032 if options[b"encodingmode"]: |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1033 encoding.encodingmode = options[b"encodingmode"] |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1034 if options[b"time"]: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
1035 |
30934
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
1036 def get_times(): |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
1037 t = os.times() |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
1038 if t[4] == 0.0: |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
1039 # Windows leaves this as zero, so use time.clock() |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
1040 t = (t[0], t[1], t[2], t[3], time.clock()) |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
1041 return t |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
1042 |
30934
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
1043 s = get_times() |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
1044 |
30934
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
1045 def print_time(): |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
1046 t = get_times() |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
1047 ui.warn( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1048 _(b"time: real %.3f secs (user %.3f+%.3f sys %.3f+%.3f)\n") |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
1049 % ( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
1050 t[4] - s[4], |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
1051 t[0] - s[0], |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
1052 t[2] - s[2], |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
1053 t[1] - s[1], |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
1054 t[3] - s[3], |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
1055 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
1056 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
1057 |
31958
de5c9d0e02ea
atexit: switch to home-grown implementation
Bryan O'Sullivan <bryano@fb.com>
parents:
31956
diff
changeset
|
1058 ui.atexit(print_time) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1059 if options[b"profile"]: |
32787
545f69cd6042
profile: support --profile in alias and abbreviated version (--prof)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32687
diff
changeset
|
1060 profiler.start() |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
1061 |
38534
b86664c81833
debug: process --debug flag earlier
Boris Feld <boris.feld@octobus.net>
parents:
38110
diff
changeset
|
1062 # if abbreviated version of this were used, take them in account, now |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1063 if options[b'verbose'] or options[b'debug'] or options[b'quiet']: |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1064 for opt in (b'verbose', b'debug', b'quiet'): |
38534
b86664c81833
debug: process --debug flag earlier
Boris Feld <boris.feld@octobus.net>
parents:
38110
diff
changeset
|
1065 if options[opt] == req.earlyoptions[opt]: |
b86664c81833
debug: process --debug flag earlier
Boris Feld <boris.feld@octobus.net>
parents:
38110
diff
changeset
|
1066 continue |
35898
a2b3b5c5a25a
py3: replace "if ispy3" by pycompat.bytestr()
Yuya Nishihara <yuya@tcha.org>
parents:
35653
diff
changeset
|
1067 val = pycompat.bytestr(bool(options[opt])) |
30934
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
1068 for ui_ in uis: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1069 ui_.setconfig(b'ui', opt, val, b'--' + opt) |
30934
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
1070 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1071 if options[b'traceback']: |
14752
99ace3cb7352
dispatch: set global options on the request repo.ui
Idan Kamara <idankk86@gmail.com>
parents:
14748
diff
changeset
|
1072 for ui_ in uis: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1073 ui_.setconfig(b'ui', b'traceback', b'on', b'--traceback') |
14992
188936b334b1
dispatch: make sure global options on the command line take precedence
Idan Kamara <idankk86@gmail.com>
parents:
14914
diff
changeset
|
1074 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1075 if options[b'noninteractive']: |
30934
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
1076 for ui_ in uis: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1077 ui_.setconfig(b'ui', b'interactive', b'off', b'-y') |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
1078 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1079 if cmdoptions.get(b'insecure', False): |
30934
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
1080 for ui_ in uis: |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
1081 ui_.insecureconnections = True |
13328
a939f08fae9c
url: add --insecure option to bypass verification of ssl certificates
Yuya Nishihara <yuya@tcha.org>
parents:
12932
diff
changeset
|
1082 |
32383
f928d53b687c
dispatch: setup color before pager for correct console information on windows
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
32054
diff
changeset
|
1083 # 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
|
1084 # might cause incorrect console information |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1085 coloropt = options[b'color'] |
31105
45be7590301d
color: move triggering of the initialisation logic in core
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31060
diff
changeset
|
1086 for ui_ in uis: |
31110
7fec37746417
color: add a 'ui.color' option to control color behavior
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31105
diff
changeset
|
1087 if coloropt: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1088 ui_.setconfig(b'ui', b'color', coloropt, b'--color') |
31110
7fec37746417
color: add a 'ui.color' option to control color behavior
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31105
diff
changeset
|
1089 color.setup(ui_) |
31105
45be7590301d
color: move triggering of the initialisation logic in core
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31060
diff
changeset
|
1090 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1091 if stringutil.parsebool(options[b'pager']): |
33620
cc047a733f69
ui: enable pager always for explicit --pager=on (issue5580)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33499
diff
changeset
|
1092 # ui.pager() expects 'internal-always-' prefix in this case |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1093 ui.pager(b'internal-always-' + cmd) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1094 elif options[b'pager'] != b'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
|
1095 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
|
1096 ui_.disablepager() |
32383
f928d53b687c
dispatch: setup color before pager for correct console information on windows
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
32054
diff
changeset
|
1097 |
40729
c93d046d4300
extensions: add "uipopulate" hook, called per instance, not per process
Yuya Nishihara <yuya@tcha.org>
parents:
40651
diff
changeset
|
1098 # configs are fully loaded, set up the ui instances |
c93d046d4300
extensions: add "uipopulate" hook, called per instance, not per process
Yuya Nishihara <yuya@tcha.org>
parents:
40651
diff
changeset
|
1099 for ui_ in uis: |
c93d046d4300
extensions: add "uipopulate" hook, called per instance, not per process
Yuya Nishihara <yuya@tcha.org>
parents:
40651
diff
changeset
|
1100 extensions.populateui(ui_) |
c93d046d4300
extensions: add "uipopulate" hook, called per instance, not per process
Yuya Nishihara <yuya@tcha.org>
parents:
40651
diff
changeset
|
1101 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1102 if options[b'version']: |
30934
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
1103 return commands.version_(ui) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1104 if options[b'help']: |
30934
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
1105 return commands.help_(ui, cmd, command=cmd is not None) |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
1106 elif not cmd: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1107 return commands.help_(ui, b'shortlist') |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
1108 |
30005
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
1109 repo = None |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
1110 cmdpats = args[:] |
30485
acd30a959980
dispatch: stop supporting non-use of @command
Augie Fackler <augie@google.com>
parents:
30473
diff
changeset
|
1111 if not func.norepo: |
30005
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
1112 # use the repo from the request only if we don't have -R |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
1113 if not rpath and not cwd: |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
1114 repo = req.repo |
14510
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
1115 |
30005
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
1116 if repo: |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
1117 # set the descriptors of the repo ui to those of ui |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
1118 repo.ui.fin = ui.fin |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
1119 repo.ui.fout = ui.fout |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
1120 repo.ui.ferr = ui.ferr |
40587
5542bc9125c9
dispatch: pass around ui.fmsg channel
Yuya Nishihara <yuya@tcha.org>
parents:
40414
diff
changeset
|
1121 repo.ui.fmsg = ui.fmsg |
30005
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
1122 else: |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
1123 try: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
1124 repo = hg.repository( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
1125 ui, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
1126 path=path, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
1127 presetupfuncs=req.prereposetups, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
1128 intents=func.intents, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
1129 ) |
30005
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
1130 if not repo.local(): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
1131 raise error.Abort( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1132 _(b"repository '%s' is not local") % path |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
1133 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
1134 repo.ui.setconfig( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1135 b"bundle", b"mainreporoot", repo.root, b'repo' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
1136 ) |
30005
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
1137 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
|
1138 raise |
30005
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
1139 except error.RepoError: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
1140 if rpath: # invalid -R path |
30005
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
1141 raise |
30485
acd30a959980
dispatch: stop supporting non-use of @command
Augie Fackler <augie@google.com>
parents:
30473
diff
changeset
|
1142 if not func.optionalrepo: |
acd30a959980
dispatch: stop supporting non-use of @command
Augie Fackler <augie@google.com>
parents:
30473
diff
changeset
|
1143 if func.inferrepo and args and not path: |
30005
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
1144 # try to infer -R from command args |
35149
e6487522ef92
py3: use pycompat.maplist() instead of map()
Pulkit Goyal <7895pulkit@gmail.com>
parents:
35145
diff
changeset
|
1145 repos = pycompat.maplist(cmdutil.findrepo, args) |
30005
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
1146 guess = repos[0] |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
1147 if guess and repos.count(guess) == len(repos): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1148 req.args = [b'--repository', guess] + fullargs |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1149 req.earlyoptions[b'repository'] = guess |
30005
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
1150 return _dispatch(req) |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
1151 if not path: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
1152 raise error.RepoError( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
1153 _( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1154 b"no repository found in" |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1155 b" '%s' (.hg not found)" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
1156 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
1157 % encoding.getcwd() |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
1158 ) |
30005
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
1159 raise |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
1160 if repo: |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
1161 ui = repo.ui |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1162 if options[b'hidden']: |
30005
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
1163 repo = repo.unfiltered() |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
1164 args.insert(0, repo) |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
1165 elif rpath: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1166 ui.warn(_(b"warning: --repository ignored\n")) |
7388
5751631246de
dispatch: generalize signature checking for extension command wrapping
Matt Mackall <mpm@selenic.com>
parents:
7280
diff
changeset
|
1167 |
31492
3c77414a0f9c
dispatch: consolidate formatting of arguments
Augie Fackler <augie@google.com>
parents:
31491
diff
changeset
|
1168 msg = _formatargs(fullargs) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1169 ui.log(b"command", b'%s\n', msg) |
30586
2d555d753f0e
py3: make keys of keyword arguments strings
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30576
diff
changeset
|
1170 strcmdopt = pycompat.strkwargs(cmdoptions) |
2d555d753f0e
py3: make keys of keyword arguments strings
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30576
diff
changeset
|
1171 d = lambda: util.checksignature(func)(ui, *args, **strcmdopt) |
30005
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
1172 try: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
1173 return runcommand( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
1174 lui, repo, cmd, fullargs, ui, options, d, cmdpats, cmdoptions |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
1175 ) |
30005
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
1176 finally: |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
1177 if repo and repo != req.repo: |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
1178 repo.close() |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
1179 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
1180 |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
1181 def _runcommand(ui, options, cmd, cmdfunc): |
29784
e3501546f7e4
profiling: add a context manager that no-ops if profiling isn't enabled
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29783
diff
changeset
|
1182 """Run a command function, possibly with profiling enabled.""" |
30006
b19c2679289c
dispatch: make hg --profile wrap reposetup
Arun Kulshreshtha <kulshrax@fb.com>
parents:
30005
diff
changeset
|
1183 try: |
43238
101ae8bbfa02
cleanup: hgdemandimport.tracing accepts strings, not bytes
Augie Fackler <augie@google.com>
parents:
43117
diff
changeset
|
1184 with tracing.log("Running %s command" % cmd): |
39512
ec0a2601bc76
tracing: trace command function execution
Boris Feld <boris.feld@octobus.net>
parents:
39255
diff
changeset
|
1185 return cmdfunc() |
30006
b19c2679289c
dispatch: make hg --profile wrap reposetup
Arun Kulshreshtha <kulshrax@fb.com>
parents:
30005
diff
changeset
|
1186 except error.SignatureError: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1187 raise error.CommandError(cmd, _(b'invalid arguments')) |
28784
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1188 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
1189 |
28821
d3369dc6c1d0
dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents:
28784
diff
changeset
|
1190 def _exceptionwarning(ui): |
d3369dc6c1d0
dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents:
28784
diff
changeset
|
1191 """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
|
1192 |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1193 # 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
|
1194 # 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
|
1195 # 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
|
1196 # 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
|
1197 # '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
|
1198 # 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
|
1199 # version number and try updating. |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1200 ct = util.versiontuple(n=2) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1201 worst = None, ct, b'' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1202 if ui.config(b'ui', b'supportcontact') is None: |
28784
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1203 for name, mod in extensions.extensions(): |
35899
d5457d94e1c9
py3: replace "if ispy3" by pycompat.sysbytes() or util.forcebytestr()
Yuya Nishihara <yuya@tcha.org>
parents:
35898
diff
changeset
|
1204 # 'testedwith' should be bytes, but not all extensions are ported |
d5457d94e1c9
py3: replace "if ispy3" by pycompat.sysbytes() or util.forcebytestr()
Yuya Nishihara <yuya@tcha.org>
parents:
35898
diff
changeset
|
1205 # to py3 and we don't want UnicodeException because of that. |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1206 testedwith = stringutil.forcebytestr( |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1207 getattr(mod, 'testedwith', b'') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1208 ) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1209 report = getattr(mod, 'buglink', _(b'the extension author.')) |
28784
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1210 if not testedwith.strip(): |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1211 # We found an untested extension. It's likely the culprit. |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1212 worst = name, b'unknown', report |
28784
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1213 break |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1214 |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1215 # Never blame on extensions bundled with Mercurial. |
29884
ed793f41e83f
extensions: use ismoduleinternal() thoroughly
Yuya Nishihara <yuya@tcha.org>
parents:
29846
diff
changeset
|
1216 if extensions.ismoduleinternal(mod): |
28784
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1217 continue |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1218 |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1219 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
|
1220 if ct in tested: |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1221 continue |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1222 |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1223 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
|
1224 nearest = max(lower or tested) |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1225 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
|
1226 worst = name, nearest, report |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1227 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
|
1228 name, testedwith, report = worst |
31179
49ad6bf63107
dispatch: allow testedwith to be bytes or str
Augie Fackler <raf@durin42.com>
parents:
31110
diff
changeset
|
1229 if not isinstance(testedwith, (bytes, str)): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1230 testedwith = b'.'.join( |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
1231 [stringutil.forcebytestr(c) for c in testedwith] |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
1232 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
1233 warning = _( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1234 b'** Unknown exception encountered with ' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1235 b'possibly-broken third-party extension %s\n' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1236 b'** which supports versions %s of Mercurial.\n' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1237 b'** Please disable %s and try your action again.\n' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1238 b'** If that fixes the bug please report it to %s\n' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
1239 ) % (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
|
1240 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1241 bugtracker = ui.config(b'ui', b'supportcontact') |
28784
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1242 if bugtracker is None: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1243 bugtracker = _(b"https://mercurial-scm.org/wiki/BugTracker") |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
1244 warning = ( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
1245 _( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1246 b"** unknown exception encountered, " |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1247 b"please report by visiting\n** " |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
1248 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
1249 + bugtracker |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1250 + b'\n' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
1251 ) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1252 sysversion = pycompat.sysbytes(sys.version).replace(b'\n', b'') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
1253 warning += ( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1254 (_(b"** Python %s\n") % sysversion) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1255 + (_(b"** Mercurial Distributed SCM (version %s)\n") % util.version()) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
1256 + ( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1257 _(b"** Extensions loaded: %s\n") |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1258 % b", ".join([x[0] for x in extensions.extensions()]) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
1259 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
1260 ) |
28821
d3369dc6c1d0
dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents:
28784
diff
changeset
|
1261 return warning |
d3369dc6c1d0
dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents:
28784
diff
changeset
|
1262 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
1263 |
28821
d3369dc6c1d0
dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents:
28784
diff
changeset
|
1264 def handlecommandexception(ui): |
d3369dc6c1d0
dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents:
28784
diff
changeset
|
1265 """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
|
1266 |
d3369dc6c1d0
dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents:
28784
diff
changeset
|
1267 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
|
1268 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
|
1269 """ |
d3369dc6c1d0
dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents:
28784
diff
changeset
|
1270 warning = _exceptionwarning(ui) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
1271 ui.log( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1272 b"commandexception", |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
1273 b"%s\n%s\n", |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
1274 warning, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
1275 pycompat.sysbytes(traceback.format_exc()), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41193
diff
changeset
|
1276 ) |
28784
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1277 ui.warn(warning) |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1278 return False # re-raise the exception |