annotate mercurial/dispatch.py @ 52744:25b344f2aeef

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