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