Mercurial > hg
annotate mercurial/dispatch.py @ 35030:d9aba3730d30 stable
dispatch: abort if early boolean options can't be parsed
Perhaps we'll need to restrict the parsing rules of --debugger and --profile,
where this patch will help us know why the --debugger option doesn't work.
I have another series to extend this feature to --config/--cwd/-R, but even
with that, shell aliases can be used to get around the restriction.
author | Yuya Nishihara <yuya@tcha.org> |
---|---|
date | Sat, 11 Nov 2017 14:02:41 +0900 |
parents | e16f68c4abe3 |
children | e273b6671827 |
rev | line source |
---|---|
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
1 # dispatch.py - command dispatching for mercurial |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
2 # |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
3 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com> |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
4 # |
8225
46293a0c7e9f
updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents:
8206
diff
changeset
|
5 # This software may be used and distributed according to the terms of the |
10263 | 6 # GNU General Public License version 2 or any later version. |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
7 |
27615
4030d3b79953
dispatch: use print function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27516
diff
changeset
|
8 from __future__ import absolute_import, print_function |
25932
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
9 |
24221
4e240d6ab898
dispatch: offer near-edit-distance suggestions for {file,rev}set functions
Augie Fackler <augie@google.com>
parents:
24163
diff
changeset
|
10 import difflib |
25932
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
11 import errno |
30576
541949a10a68
fancyopts: switch from fancyopts.getopt.* to getopt.*
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30559
diff
changeset
|
12 import getopt |
25932
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
13 import os |
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
14 import pdb |
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
15 import re |
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
16 import signal |
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
17 import sys |
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
18 import time |
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
19 import traceback |
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
20 |
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
21 |
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
22 from .i18n import _ |
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
23 |
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
24 from . import ( |
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
25 cmdutil, |
30653
b2be4ccaff1d
color: load 'colortable' from extension using an 'extraloader'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
30586
diff
changeset
|
26 color, |
25932
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
27 commands, |
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
28 demandimport, |
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
29 encoding, |
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
30 error, |
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
31 extensions, |
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
32 fancyopts, |
31060
ab20491b1760
dispatch: rearrange 'unknown command' code to better employ pager
Augie Fackler <augie@google.com>
parents:
31027
diff
changeset
|
33 help, |
25932
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
34 hg, |
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
35 hook, |
29781
2654a0aac80d
profiling: move profiling code from dispatch.py (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
29761
diff
changeset
|
36 profiling, |
30468
7f2b18c34c02
py3: use pycompat.sysargv in dispatch.run()
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30401
diff
changeset
|
37 pycompat, |
34781
fe987d0b9e1e
registrar: add support for storing the type of command in func object
Pulkit Goyal <7895pulkit@gmail.com>
parents:
34638
diff
changeset
|
38 registrar, |
30520
4338f87dbf6f
dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents:
30519
diff
changeset
|
39 scmutil, |
25932
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
40 ui as uimod, |
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
41 util, |
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
42 ) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
43 |
34781
fe987d0b9e1e
registrar: add support for storing the type of command in func object
Pulkit Goyal <7895pulkit@gmail.com>
parents:
34638
diff
changeset
|
44 unrecoverablewrite = registrar.command.unrecoverablewrite |
fe987d0b9e1e
registrar: add support for storing the type of command in func object
Pulkit Goyal <7895pulkit@gmail.com>
parents:
34638
diff
changeset
|
45 |
14438
08bfec2ef031
dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents:
14286
diff
changeset
|
46 class request(object): |
16683 | 47 def __init__(self, args, ui=None, repo=None, fin=None, fout=None, |
32379
71e735bd8170
dispatch: make request accept additional reposetups
Jun Wu <quark@fb.com>
parents:
32377
diff
changeset
|
48 ferr=None, prereposetups=None): |
14438
08bfec2ef031
dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents:
14286
diff
changeset
|
49 self.args = args |
14439
80c599eee3f3
dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents:
14438
diff
changeset
|
50 self.ui = ui |
14510
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
51 self.repo = repo |
14438
08bfec2ef031
dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents:
14286
diff
changeset
|
52 |
14613
ea8938d3a5aa
dispatch: add I/O descriptors to the request
Idan Kamara <idankk86@gmail.com>
parents:
14601
diff
changeset
|
53 # input/output/error streams |
ea8938d3a5aa
dispatch: add I/O descriptors to the request
Idan Kamara <idankk86@gmail.com>
parents:
14601
diff
changeset
|
54 self.fin = fin |
ea8938d3a5aa
dispatch: add I/O descriptors to the request
Idan Kamara <idankk86@gmail.com>
parents:
14601
diff
changeset
|
55 self.fout = fout |
ea8938d3a5aa
dispatch: add I/O descriptors to the request
Idan Kamara <idankk86@gmail.com>
parents:
14601
diff
changeset
|
56 self.ferr = ferr |
ea8938d3a5aa
dispatch: add I/O descriptors to the request
Idan Kamara <idankk86@gmail.com>
parents:
14601
diff
changeset
|
57 |
35030
d9aba3730d30
dispatch: abort if early boolean options can't be parsed
Yuya Nishihara <yuya@tcha.org>
parents:
35029
diff
changeset
|
58 # remember options pre-parsed by _earlyreqopt*() |
d9aba3730d30
dispatch: abort if early boolean options can't be parsed
Yuya Nishihara <yuya@tcha.org>
parents:
35029
diff
changeset
|
59 self.earlyoptions = {} |
d9aba3730d30
dispatch: abort if early boolean options can't be parsed
Yuya Nishihara <yuya@tcha.org>
parents:
35029
diff
changeset
|
60 |
32379
71e735bd8170
dispatch: make request accept additional reposetups
Jun Wu <quark@fb.com>
parents:
32377
diff
changeset
|
61 # reposetups which run before extensions, useful for chg to pre-fill |
71e735bd8170
dispatch: make request accept additional reposetups
Jun Wu <quark@fb.com>
parents:
32377
diff
changeset
|
62 # low-level repo state (for example, changelog) before extensions. |
71e735bd8170
dispatch: make request accept additional reposetups
Jun Wu <quark@fb.com>
parents:
32377
diff
changeset
|
63 self.prereposetups = prereposetups or [] |
71e735bd8170
dispatch: make request accept additional reposetups
Jun Wu <quark@fb.com>
parents:
32377
diff
changeset
|
64 |
31956
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31629
diff
changeset
|
65 def _runexithandlers(self): |
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31629
diff
changeset
|
66 exc = None |
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31629
diff
changeset
|
67 handlers = self.ui._exithandlers |
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31629
diff
changeset
|
68 try: |
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31629
diff
changeset
|
69 while handlers: |
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31629
diff
changeset
|
70 func, args, kwargs = handlers.pop() |
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31629
diff
changeset
|
71 try: |
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31629
diff
changeset
|
72 func(*args, **kwargs) |
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31629
diff
changeset
|
73 except: # re-raises below |
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31629
diff
changeset
|
74 if exc is None: |
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31629
diff
changeset
|
75 exc = sys.exc_info()[1] |
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31629
diff
changeset
|
76 self.ui.warn(('error in exit handlers:\n')) |
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31629
diff
changeset
|
77 self.ui.traceback(force=True) |
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31629
diff
changeset
|
78 finally: |
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31629
diff
changeset
|
79 if exc is not None: |
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31629
diff
changeset
|
80 raise exc |
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31629
diff
changeset
|
81 |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
82 def run(): |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
83 "run the command in sys.argv" |
34533
163fa0aea71e
dispatch: move initialization of sys.std* files
Yuya Nishihara <yuya@tcha.org>
parents:
34532
diff
changeset
|
84 _initstdio() |
31960
71dcd4a4fa2f
stdio: catch StdioError in dispatch.run and clean up appropriately
Bryan O'Sullivan <bryano@fb.com>
parents:
31958
diff
changeset
|
85 req = request(pycompat.sysargv[1:]) |
71dcd4a4fa2f
stdio: catch StdioError in dispatch.run and clean up appropriately
Bryan O'Sullivan <bryano@fb.com>
parents:
31958
diff
changeset
|
86 err = None |
71dcd4a4fa2f
stdio: catch StdioError in dispatch.run and clean up appropriately
Bryan O'Sullivan <bryano@fb.com>
parents:
31958
diff
changeset
|
87 try: |
71dcd4a4fa2f
stdio: catch StdioError in dispatch.run and clean up appropriately
Bryan O'Sullivan <bryano@fb.com>
parents:
31958
diff
changeset
|
88 status = (dispatch(req) or 0) & 255 |
34532
b09b3eaf9c96
py3: work around the scope of exception variable in dispatch.run()
Yuya Nishihara <yuya@tcha.org>
parents:
34486
diff
changeset
|
89 except error.StdioError as e: |
b09b3eaf9c96
py3: work around the scope of exception variable in dispatch.run()
Yuya Nishihara <yuya@tcha.org>
parents:
34486
diff
changeset
|
90 err = e |
31960
71dcd4a4fa2f
stdio: catch StdioError in dispatch.run and clean up appropriately
Bryan O'Sullivan <bryano@fb.com>
parents:
31958
diff
changeset
|
91 status = -1 |
71dcd4a4fa2f
stdio: catch StdioError in dispatch.run and clean up appropriately
Bryan O'Sullivan <bryano@fb.com>
parents:
31958
diff
changeset
|
92 if util.safehasattr(req.ui, 'fout'): |
71dcd4a4fa2f
stdio: catch StdioError in dispatch.run and clean up appropriately
Bryan O'Sullivan <bryano@fb.com>
parents:
31958
diff
changeset
|
93 try: |
32687
12941a782928
dispatch: do not close stdout and stderr, just flush() instead
Yuya Nishihara <yuya@tcha.org>
parents:
32652
diff
changeset
|
94 req.ui.fout.flush() |
34532
b09b3eaf9c96
py3: work around the scope of exception variable in dispatch.run()
Yuya Nishihara <yuya@tcha.org>
parents:
34486
diff
changeset
|
95 except IOError as e: |
b09b3eaf9c96
py3: work around the scope of exception variable in dispatch.run()
Yuya Nishihara <yuya@tcha.org>
parents:
34486
diff
changeset
|
96 err = e |
31960
71dcd4a4fa2f
stdio: catch StdioError in dispatch.run and clean up appropriately
Bryan O'Sullivan <bryano@fb.com>
parents:
31958
diff
changeset
|
97 status = -1 |
71dcd4a4fa2f
stdio: catch StdioError in dispatch.run and clean up appropriately
Bryan O'Sullivan <bryano@fb.com>
parents:
31958
diff
changeset
|
98 if util.safehasattr(req.ui, 'ferr'): |
71dcd4a4fa2f
stdio: catch StdioError in dispatch.run and clean up appropriately
Bryan O'Sullivan <bryano@fb.com>
parents:
31958
diff
changeset
|
99 if err is not None and err.errno != errno.EPIPE: |
34022
d5b2beca16c0
python3: wrap all uses of <exception>.strerror with strtolocal
Augie Fackler <raf@durin42.com>
parents:
33620
diff
changeset
|
100 req.ui.ferr.write('abort: %s\n' % |
d5b2beca16c0
python3: wrap all uses of <exception>.strerror with strtolocal
Augie Fackler <raf@durin42.com>
parents:
33620
diff
changeset
|
101 encoding.strtolocal(err.strerror)) |
32687
12941a782928
dispatch: do not close stdout and stderr, just flush() instead
Yuya Nishihara <yuya@tcha.org>
parents:
32652
diff
changeset
|
102 req.ui.ferr.flush() |
31960
71dcd4a4fa2f
stdio: catch StdioError in dispatch.run and clean up appropriately
Bryan O'Sullivan <bryano@fb.com>
parents:
31958
diff
changeset
|
103 sys.exit(status & 255) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
104 |
34533
163fa0aea71e
dispatch: move initialization of sys.std* files
Yuya Nishihara <yuya@tcha.org>
parents:
34532
diff
changeset
|
105 def _initstdio(): |
163fa0aea71e
dispatch: move initialization of sys.std* files
Yuya Nishihara <yuya@tcha.org>
parents:
34532
diff
changeset
|
106 for fp in (sys.stdin, sys.stdout, sys.stderr): |
163fa0aea71e
dispatch: move initialization of sys.std* files
Yuya Nishihara <yuya@tcha.org>
parents:
34532
diff
changeset
|
107 util.setbinary(fp) |
163fa0aea71e
dispatch: move initialization of sys.std* files
Yuya Nishihara <yuya@tcha.org>
parents:
34532
diff
changeset
|
108 |
24221
4e240d6ab898
dispatch: offer near-edit-distance suggestions for {file,rev}set functions
Augie Fackler <augie@google.com>
parents:
24163
diff
changeset
|
109 def _getsimilar(symbols, value): |
4e240d6ab898
dispatch: offer near-edit-distance suggestions for {file,rev}set functions
Augie Fackler <augie@google.com>
parents:
24163
diff
changeset
|
110 sim = lambda x: difflib.SequenceMatcher(None, value, x).ratio() |
4e240d6ab898
dispatch: offer near-edit-distance suggestions for {file,rev}set functions
Augie Fackler <augie@google.com>
parents:
24163
diff
changeset
|
111 # The cutoff for similarity here is pretty arbitrary. It should |
4e240d6ab898
dispatch: offer near-edit-distance suggestions for {file,rev}set functions
Augie Fackler <augie@google.com>
parents:
24163
diff
changeset
|
112 # probably be investigated and tweaked. |
4e240d6ab898
dispatch: offer near-edit-distance suggestions for {file,rev}set functions
Augie Fackler <augie@google.com>
parents:
24163
diff
changeset
|
113 return [s for s in symbols if sim(s) > 0.6] |
4e240d6ab898
dispatch: offer near-edit-distance suggestions for {file,rev}set functions
Augie Fackler <augie@google.com>
parents:
24163
diff
changeset
|
114 |
27623
b3376fba4ab9
dispatch: report similar names consistently
Bryan O'Sullivan <bos@serpentine.com>
parents:
27615
diff
changeset
|
115 def _reportsimilar(write, similar): |
b3376fba4ab9
dispatch: report similar names consistently
Bryan O'Sullivan <bos@serpentine.com>
parents:
27615
diff
changeset
|
116 if len(similar) == 1: |
b3376fba4ab9
dispatch: report similar names consistently
Bryan O'Sullivan <bos@serpentine.com>
parents:
27615
diff
changeset
|
117 write(_("(did you mean %s?)\n") % similar[0]) |
b3376fba4ab9
dispatch: report similar names consistently
Bryan O'Sullivan <bos@serpentine.com>
parents:
27615
diff
changeset
|
118 elif similar: |
b3376fba4ab9
dispatch: report similar names consistently
Bryan O'Sullivan <bos@serpentine.com>
parents:
27615
diff
changeset
|
119 ss = ", ".join(sorted(similar)) |
b3376fba4ab9
dispatch: report similar names consistently
Bryan O'Sullivan <bos@serpentine.com>
parents:
27615
diff
changeset
|
120 write(_("(did you mean one of %s?)\n") % ss) |
b3376fba4ab9
dispatch: report similar names consistently
Bryan O'Sullivan <bos@serpentine.com>
parents:
27615
diff
changeset
|
121 |
24039
2ee35b6ee4fb
dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents:
23871
diff
changeset
|
122 def _formatparse(write, inst): |
24221
4e240d6ab898
dispatch: offer near-edit-distance suggestions for {file,rev}set functions
Augie Fackler <augie@google.com>
parents:
24163
diff
changeset
|
123 similar = [] |
4e240d6ab898
dispatch: offer near-edit-distance suggestions for {file,rev}set functions
Augie Fackler <augie@google.com>
parents:
24163
diff
changeset
|
124 if isinstance(inst, error.UnknownIdentifier): |
4e240d6ab898
dispatch: offer near-edit-distance suggestions for {file,rev}set functions
Augie Fackler <augie@google.com>
parents:
24163
diff
changeset
|
125 # make sure to check fileset first, as revset can invoke fileset |
4e240d6ab898
dispatch: offer near-edit-distance suggestions for {file,rev}set functions
Augie Fackler <augie@google.com>
parents:
24163
diff
changeset
|
126 similar = _getsimilar(inst.symbols, inst.function) |
24039
2ee35b6ee4fb
dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents:
23871
diff
changeset
|
127 if len(inst.args) > 1: |
2ee35b6ee4fb
dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents:
23871
diff
changeset
|
128 write(_("hg: parse error at %s: %s\n") % |
2ee35b6ee4fb
dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents:
23871
diff
changeset
|
129 (inst.args[1], inst.args[0])) |
2ee35b6ee4fb
dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents:
23871
diff
changeset
|
130 if (inst.args[0][0] == ' '): |
2ee35b6ee4fb
dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents:
23871
diff
changeset
|
131 write(_("unexpected leading whitespace\n")) |
2ee35b6ee4fb
dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents:
23871
diff
changeset
|
132 else: |
2ee35b6ee4fb
dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents:
23871
diff
changeset
|
133 write(_("hg: parse error: %s\n") % inst.args[0]) |
27623
b3376fba4ab9
dispatch: report similar names consistently
Bryan O'Sullivan <bos@serpentine.com>
parents:
27615
diff
changeset
|
134 _reportsimilar(write, similar) |
28515
491eabd0df79
dispatch: extract common logic for handling ParseError
Jun Wu <quark@fb.com>
parents:
28447
diff
changeset
|
135 if inst.hint: |
491eabd0df79
dispatch: extract common logic for handling ParseError
Jun Wu <quark@fb.com>
parents:
28447
diff
changeset
|
136 write(_("(%s)\n") % inst.hint) |
24039
2ee35b6ee4fb
dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents:
23871
diff
changeset
|
137 |
31492
3c77414a0f9c
dispatch: consolidate formatting of arguments
Augie Fackler <augie@google.com>
parents:
31491
diff
changeset
|
138 def _formatargs(args): |
31500
bc315e669a32
dispatch: replace mayberepr with shellquote
Augie Fackler <augie@google.com>
parents:
31494
diff
changeset
|
139 return ' '.join(util.shellquote(a) for a in args) |
31492
3c77414a0f9c
dispatch: consolidate formatting of arguments
Augie Fackler <augie@google.com>
parents:
31491
diff
changeset
|
140 |
14438
08bfec2ef031
dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents:
14286
diff
changeset
|
141 def dispatch(req): |
08bfec2ef031
dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents:
14286
diff
changeset
|
142 "run the command specified in req.args" |
14615
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
143 if req.ferr: |
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
144 ferr = req.ferr |
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
145 elif req.ui: |
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
146 ferr = req.ui.ferr |
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
147 else: |
30473
39d13b8c101d
py3: bulk replace sys.stdin/out/err by util's
Yuya Nishihara <yuya@tcha.org>
parents:
30468
diff
changeset
|
148 ferr = util.stderr |
14615
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
149 |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
150 try: |
14439
80c599eee3f3
dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents:
14438
diff
changeset
|
151 if not req.ui: |
30559
d83ca854fa21
ui: factor out ui.load() to create a ui without loading configs (API)
Yuya Nishihara <yuya@tcha.org>
parents:
30520
diff
changeset
|
152 req.ui = uimod.ui.load() |
35028
7f8f9f0369ca
dispatch: extract stub function to peek boolean command option
Yuya Nishihara <yuya@tcha.org>
parents:
35027
diff
changeset
|
153 if _earlyreqoptbool(req, 'traceback', ['--traceback']): |
20788
f144928dd058
config: give a useful hint of source for the most common command line settings
Mads Kiilerich <madski@unity3d.com>
parents:
20330
diff
changeset
|
154 req.ui.setconfig('ui', 'traceback', 'on', '--traceback') |
14615
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
155 |
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
156 # set ui streams from the request |
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
157 if req.fin: |
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
158 req.ui.fin = req.fin |
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
159 if req.fout: |
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
160 req.ui.fout = req.fout |
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
161 if req.ferr: |
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
162 req.ui.ferr = req.ferr |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26421
diff
changeset
|
163 except error.Abort as inst: |
14615
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
164 ferr.write(_("abort: %s\n") % inst) |
11574
6381fa7bfa53
Abort: add a hint argument, printed in the next line inside parenthesis
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
11556
diff
changeset
|
165 if inst.hint: |
14615
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
166 ferr.write(_("(%s)\n") % inst.hint) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
167 return -1 |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25329
diff
changeset
|
168 except error.ParseError as inst: |
24039
2ee35b6ee4fb
dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents:
23871
diff
changeset
|
169 _formatparse(ferr.write, inst) |
9470
ba75830d17a9
dispatch: catch ConfigError while constructing ui
Martin Geisler <mg@lazybytes.net>
parents:
8936
diff
changeset
|
170 return -1 |
14615
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
171 |
31492
3c77414a0f9c
dispatch: consolidate formatting of arguments
Augie Fackler <augie@google.com>
parents:
31491
diff
changeset
|
172 msg = _formatargs(req.args) |
30975
22fbca1d11ed
mercurial: switch to util.timer for all interval timings
Simon Farnsworth <simonfar@fb.com>
parents:
30934
diff
changeset
|
173 starttime = util.timer() |
19229
41e39a0299cb
blackbox: fix recording exit codes (issue3938)
Durham Goode <durham@fb.com>
parents:
19099
diff
changeset
|
174 ret = None |
41e39a0299cb
blackbox: fix recording exit codes (issue3938)
Durham Goode <durham@fb.com>
parents:
19099
diff
changeset
|
175 try: |
41e39a0299cb
blackbox: fix recording exit codes (issue3938)
Durham Goode <durham@fb.com>
parents:
19099
diff
changeset
|
176 ret = _runcatch(req) |
32340
9c023179e8d0
error: add hint to ProgrammingError
Yuya Nishihara <yuya@tcha.org>
parents:
32291
diff
changeset
|
177 except error.ProgrammingError as inst: |
9c023179e8d0
error: add hint to ProgrammingError
Yuya Nishihara <yuya@tcha.org>
parents:
32291
diff
changeset
|
178 req.ui.warn(_('** ProgrammingError: %s\n') % inst) |
9c023179e8d0
error: add hint to ProgrammingError
Yuya Nishihara <yuya@tcha.org>
parents:
32291
diff
changeset
|
179 if inst.hint: |
9c023179e8d0
error: add hint to ProgrammingError
Yuya Nishihara <yuya@tcha.org>
parents:
32291
diff
changeset
|
180 req.ui.warn(_('** (%s)\n') % inst.hint) |
9c023179e8d0
error: add hint to ProgrammingError
Yuya Nishihara <yuya@tcha.org>
parents:
32291
diff
changeset
|
181 raise |
32111
1208b74841ff
dispatch: take over SignalInterrupt handling from scmutil
Jun Wu <quark@fb.com>
parents:
32054
diff
changeset
|
182 except KeyboardInterrupt as inst: |
28520
84cc72c5771e
dispatch: catch KeyboardInterrupt more broadly
Yuya Nishihara <yuya@tcha.org>
parents:
28515
diff
changeset
|
183 try: |
32111
1208b74841ff
dispatch: take over SignalInterrupt handling from scmutil
Jun Wu <quark@fb.com>
parents:
32054
diff
changeset
|
184 if isinstance(inst, error.SignalInterrupt): |
1208b74841ff
dispatch: take over SignalInterrupt handling from scmutil
Jun Wu <quark@fb.com>
parents:
32054
diff
changeset
|
185 msg = _("killed!\n") |
1208b74841ff
dispatch: take over SignalInterrupt handling from scmutil
Jun Wu <quark@fb.com>
parents:
32054
diff
changeset
|
186 else: |
1208b74841ff
dispatch: take over SignalInterrupt handling from scmutil
Jun Wu <quark@fb.com>
parents:
32054
diff
changeset
|
187 msg = _("interrupted!\n") |
1208b74841ff
dispatch: take over SignalInterrupt handling from scmutil
Jun Wu <quark@fb.com>
parents:
32054
diff
changeset
|
188 req.ui.warn(msg) |
32044
cde72a195f32
dispatch: ignore further SIGPIPE while handling KeyboardInterrupt
Yuya Nishihara <yuya@tcha.org>
parents:
32041
diff
changeset
|
189 except error.SignalInterrupt: |
cde72a195f32
dispatch: ignore further SIGPIPE while handling KeyboardInterrupt
Yuya Nishihara <yuya@tcha.org>
parents:
32041
diff
changeset
|
190 # maybe pager would quit without consuming all the output, and |
cde72a195f32
dispatch: ignore further SIGPIPE while handling KeyboardInterrupt
Yuya Nishihara <yuya@tcha.org>
parents:
32041
diff
changeset
|
191 # SIGPIPE was raised. we cannot print anything in this case. |
cde72a195f32
dispatch: ignore further SIGPIPE while handling KeyboardInterrupt
Yuya Nishihara <yuya@tcha.org>
parents:
32041
diff
changeset
|
192 pass |
28520
84cc72c5771e
dispatch: catch KeyboardInterrupt more broadly
Yuya Nishihara <yuya@tcha.org>
parents:
28515
diff
changeset
|
193 except IOError as inst: |
84cc72c5771e
dispatch: catch KeyboardInterrupt more broadly
Yuya Nishihara <yuya@tcha.org>
parents:
28515
diff
changeset
|
194 if inst.errno != errno.EPIPE: |
84cc72c5771e
dispatch: catch KeyboardInterrupt more broadly
Yuya Nishihara <yuya@tcha.org>
parents:
28515
diff
changeset
|
195 raise |
84cc72c5771e
dispatch: catch KeyboardInterrupt more broadly
Yuya Nishihara <yuya@tcha.org>
parents:
28515
diff
changeset
|
196 ret = -1 |
19229
41e39a0299cb
blackbox: fix recording exit codes (issue3938)
Durham Goode <durham@fb.com>
parents:
19099
diff
changeset
|
197 finally: |
30975
22fbca1d11ed
mercurial: switch to util.timer for all interval timings
Simon Farnsworth <simonfar@fb.com>
parents:
30934
diff
changeset
|
198 duration = util.timer() - starttime |
28534
293adbaa14a7
dispatch: flush ui before returning from dispatch
Jun Wu <quark@fb.com>
parents:
28520
diff
changeset
|
199 req.ui.flush() |
30976
e92daf156d5c
ui: provide a mechanism to track and log blocked time
Simon Farnsworth <simonfar@fb.com>
parents:
30975
diff
changeset
|
200 if req.ui.logblockedtimes: |
e92daf156d5c
ui: provide a mechanism to track and log blocked time
Simon Farnsworth <simonfar@fb.com>
parents:
30975
diff
changeset
|
201 req.ui._blockedtimes['command_duration'] = duration * 1000 |
e92daf156d5c
ui: provide a mechanism to track and log blocked time
Simon Farnsworth <simonfar@fb.com>
parents:
30975
diff
changeset
|
202 req.ui.log('uiblocked', 'ui blocked ms', **req.ui._blockedtimes) |
32130
c3dcec6cbc1b
py3: use %d instead of %s for integers
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32111
diff
changeset
|
203 req.ui.log("commandfinish", "%s exited %d after %0.2f seconds\n", |
19229
41e39a0299cb
blackbox: fix recording exit codes (issue3938)
Durham Goode <durham@fb.com>
parents:
19099
diff
changeset
|
204 msg, ret or 0, duration) |
31956
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31629
diff
changeset
|
205 try: |
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31629
diff
changeset
|
206 req._runexithandlers() |
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31629
diff
changeset
|
207 except: # exiting, so no re-raises |
c13ff31818b0
ui: add special-purpose atexit functionality
Bryan O'Sullivan <bryano@fb.com>
parents:
31629
diff
changeset
|
208 ret = ret or -1 |
28520
84cc72c5771e
dispatch: catch KeyboardInterrupt more broadly
Yuya Nishihara <yuya@tcha.org>
parents:
28515
diff
changeset
|
209 return ret |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
210 |
14439
80c599eee3f3
dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents:
14438
diff
changeset
|
211 def _runcatch(req): |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
212 def catchterm(*args): |
7644
182b7114d35a
error: move SignalInterrupt
Matt Mackall <mpm@selenic.com>
parents:
7643
diff
changeset
|
213 raise error.SignalInterrupt |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
214 |
14439
80c599eee3f3
dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents:
14438
diff
changeset
|
215 ui = req.ui |
10952
6c2c766afefe
dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents:
10793
diff
changeset
|
216 try: |
6c2c766afefe
dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents:
10793
diff
changeset
|
217 for name in 'SIGBREAK', 'SIGHUP', 'SIGTERM': |
6c2c766afefe
dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents:
10793
diff
changeset
|
218 num = getattr(signal, name, None) |
6c2c766afefe
dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents:
10793
diff
changeset
|
219 if num: |
6c2c766afefe
dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents:
10793
diff
changeset
|
220 signal.signal(num, catchterm) |
6c2c766afefe
dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents:
10793
diff
changeset
|
221 except ValueError: |
6c2c766afefe
dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents:
10793
diff
changeset
|
222 pass # happens if called in a thread |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
223 |
29761
39149b6036e6
dispatch: split global error handling out so it can be reused
Jun Wu <quark@fb.com>
parents:
29132
diff
changeset
|
224 def _runcatchfunc(): |
32050
77eaf9539499
dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents:
30678
diff
changeset
|
225 realcmd = None |
77eaf9539499
dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents:
30678
diff
changeset
|
226 try: |
77eaf9539499
dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents:
30678
diff
changeset
|
227 cmdargs = fancyopts.fancyopts(req.args[:], commands.globalopts, {}) |
77eaf9539499
dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents:
30678
diff
changeset
|
228 cmd = cmdargs[0] |
77eaf9539499
dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents:
30678
diff
changeset
|
229 aliases, entry = cmdutil.findcmd(cmd, commands.table, False) |
77eaf9539499
dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents:
30678
diff
changeset
|
230 realcmd = aliases[0] |
77eaf9539499
dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents:
30678
diff
changeset
|
231 except (error.UnknownCommand, error.AmbiguousCommand, |
77eaf9539499
dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents:
30678
diff
changeset
|
232 IndexError, getopt.GetoptError): |
77eaf9539499
dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents:
30678
diff
changeset
|
233 # Don't handle this here. We know the command is |
77eaf9539499
dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents:
30678
diff
changeset
|
234 # invalid, but all we're worried about for now is that |
77eaf9539499
dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents:
30678
diff
changeset
|
235 # it's not a command that server operators expect to |
77eaf9539499
dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents:
30678
diff
changeset
|
236 # be safe to offer to users in a sandbox. |
77eaf9539499
dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents:
30678
diff
changeset
|
237 pass |
77eaf9539499
dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents:
30678
diff
changeset
|
238 if realcmd == 'serve' and '--stdio' in cmdargs: |
77eaf9539499
dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents:
30678
diff
changeset
|
239 # We want to constrain 'hg serve --stdio' instances pretty |
77eaf9539499
dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents:
30678
diff
changeset
|
240 # closely, as many shared-ssh access tools want to grant |
77eaf9539499
dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents:
30678
diff
changeset
|
241 # access to run *only* 'hg -R $repo serve --stdio'. We |
77eaf9539499
dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents:
30678
diff
changeset
|
242 # restrict to exactly that set of arguments, and prohibit |
77eaf9539499
dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents:
30678
diff
changeset
|
243 # any repo name that starts with '--' to prevent |
77eaf9539499
dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents:
30678
diff
changeset
|
244 # shenanigans wherein a user does something like pass |
77eaf9539499
dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents:
30678
diff
changeset
|
245 # --debugger or --config=ui.debugger=1 as a repo |
77eaf9539499
dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents:
30678
diff
changeset
|
246 # name. This used to actually run the debugger. |
77eaf9539499
dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents:
30678
diff
changeset
|
247 if (len(req.args) != 4 or |
77eaf9539499
dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents:
30678
diff
changeset
|
248 req.args[0] != '-R' or |
77eaf9539499
dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents:
30678
diff
changeset
|
249 req.args[1].startswith('--') or |
77eaf9539499
dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents:
30678
diff
changeset
|
250 req.args[2] != 'serve' or |
77eaf9539499
dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents:
30678
diff
changeset
|
251 req.args[3] != '--stdio'): |
77eaf9539499
dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents:
30678
diff
changeset
|
252 raise error.Abort( |
77eaf9539499
dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents:
30678
diff
changeset
|
253 _('potentially unsafe serve --stdio invocation: %r') % |
77eaf9539499
dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents:
30678
diff
changeset
|
254 (req.args,)) |
77eaf9539499
dispatch: protect against malicious 'hg serve --stdio' invocations (sec)
Augie Fackler <augie@google.com>
parents:
30678
diff
changeset
|
255 |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
256 try: |
19640
472fa3b782b1
dispatch: add ability to specify a custom pdb module as a debugger
Sean Farley <sean.michael.farley@gmail.com>
parents:
19639
diff
changeset
|
257 debugger = 'pdb' |
472fa3b782b1
dispatch: add ability to specify a custom pdb module as a debugger
Sean Farley <sean.michael.farley@gmail.com>
parents:
19639
diff
changeset
|
258 debugtrace = { |
34486
a57c938e7ac8
style: never use a space before a colon or comma
Alex Gaynor <agaynor@mozilla.com>
parents:
34306
diff
changeset
|
259 'pdb': pdb.set_trace |
19640
472fa3b782b1
dispatch: add ability to specify a custom pdb module as a debugger
Sean Farley <sean.michael.farley@gmail.com>
parents:
19639
diff
changeset
|
260 } |
472fa3b782b1
dispatch: add ability to specify a custom pdb module as a debugger
Sean Farley <sean.michael.farley@gmail.com>
parents:
19639
diff
changeset
|
261 debugmortem = { |
34486
a57c938e7ac8
style: never use a space before a colon or comma
Alex Gaynor <agaynor@mozilla.com>
parents:
34306
diff
changeset
|
262 'pdb': pdb.post_mortem |
19640
472fa3b782b1
dispatch: add ability to specify a custom pdb module as a debugger
Sean Farley <sean.michael.farley@gmail.com>
parents:
19639
diff
changeset
|
263 } |
19639
09573ad59f7b
dispatch: move command line --config argument parsing to _runcatch()
Sean Farley <sean.michael.farley@gmail.com>
parents:
19229
diff
changeset
|
264 |
09573ad59f7b
dispatch: move command line --config argument parsing to _runcatch()
Sean Farley <sean.michael.farley@gmail.com>
parents:
19229
diff
changeset
|
265 # read --config before doing anything else |
09573ad59f7b
dispatch: move command line --config argument parsing to _runcatch()
Sean Farley <sean.michael.farley@gmail.com>
parents:
19229
diff
changeset
|
266 # (e.g. to change trust settings for reading .hg/hgrc) |
09573ad59f7b
dispatch: move command line --config argument parsing to _runcatch()
Sean Farley <sean.michael.farley@gmail.com>
parents:
19229
diff
changeset
|
267 cfgs = _parseconfig(req.ui, _earlygetopt(['--config'], req.args)) |
09573ad59f7b
dispatch: move command line --config argument parsing to _runcatch()
Sean Farley <sean.michael.farley@gmail.com>
parents:
19229
diff
changeset
|
268 |
09573ad59f7b
dispatch: move command line --config argument parsing to _runcatch()
Sean Farley <sean.michael.farley@gmail.com>
parents:
19229
diff
changeset
|
269 if req.repo: |
09573ad59f7b
dispatch: move command line --config argument parsing to _runcatch()
Sean Farley <sean.michael.farley@gmail.com>
parents:
19229
diff
changeset
|
270 # copy configs that were passed on the cmdline (--config) to |
09573ad59f7b
dispatch: move command line --config argument parsing to _runcatch()
Sean Farley <sean.michael.farley@gmail.com>
parents:
19229
diff
changeset
|
271 # the repo ui |
20796
131f7fe06e9e
check-code: check for argument passing py2.6ism
Matt Mackall <mpm@selenic.com>
parents:
20788
diff
changeset
|
272 for sec, name, val in cfgs: |
131f7fe06e9e
check-code: check for argument passing py2.6ism
Matt Mackall <mpm@selenic.com>
parents:
20788
diff
changeset
|
273 req.repo.ui.setconfig(sec, name, val, source='--config') |
19639
09573ad59f7b
dispatch: move command line --config argument parsing to _runcatch()
Sean Farley <sean.michael.farley@gmail.com>
parents:
19229
diff
changeset
|
274 |
25833
8243e999f22b
debugger: mark developer-only option
Matt Mackall <mpm@selenic.com>
parents:
25660
diff
changeset
|
275 # developer config: ui.debugger |
19640
472fa3b782b1
dispatch: add ability to specify a custom pdb module as a debugger
Sean Farley <sean.michael.farley@gmail.com>
parents:
19639
diff
changeset
|
276 debugger = ui.config("ui", "debugger") |
20826
dd2e25e49862
dispatch: only do __import__(debugger) when a debugger is requested
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
20330
diff
changeset
|
277 debugmod = pdb |
20122
8f4a226c840c
dispatch: turn off custom debugger for HGPLAIN mode
Sean Farley <sean.michael.farley@gmail.com>
parents:
19640
diff
changeset
|
278 if not debugger or ui.plain(): |
25833
8243e999f22b
debugger: mark developer-only option
Matt Mackall <mpm@selenic.com>
parents:
25660
diff
changeset
|
279 # if we are in HGPLAIN mode, then disable custom debugging |
19640
472fa3b782b1
dispatch: add ability to specify a custom pdb module as a debugger
Sean Farley <sean.michael.farley@gmail.com>
parents:
19639
diff
changeset
|
280 debugger = 'pdb' |
35028
7f8f9f0369ca
dispatch: extract stub function to peek boolean command option
Yuya Nishihara <yuya@tcha.org>
parents:
35027
diff
changeset
|
281 elif _earlyreqoptbool(req, 'debugger', ['--debugger']): |
20826
dd2e25e49862
dispatch: only do __import__(debugger) when a debugger is requested
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
20330
diff
changeset
|
282 # This import can be slow for fancy debuggers, so only |
dd2e25e49862
dispatch: only do __import__(debugger) when a debugger is requested
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
20330
diff
changeset
|
283 # do it when absolutely necessary, i.e. when actual |
dd2e25e49862
dispatch: only do __import__(debugger) when a debugger is requested
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
20330
diff
changeset
|
284 # debugging has been requested |
25329
101e84121c13
dispatch: disable demandimport for the --debugger option
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
25277
diff
changeset
|
285 with demandimport.deactivated(): |
101e84121c13
dispatch: disable demandimport for the --debugger option
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
25277
diff
changeset
|
286 try: |
101e84121c13
dispatch: disable demandimport for the --debugger option
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
25277
diff
changeset
|
287 debugmod = __import__(debugger) |
101e84121c13
dispatch: disable demandimport for the --debugger option
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
25277
diff
changeset
|
288 except ImportError: |
101e84121c13
dispatch: disable demandimport for the --debugger option
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
25277
diff
changeset
|
289 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
|
290 |
472fa3b782b1
dispatch: add ability to specify a custom pdb module as a debugger
Sean Farley <sean.michael.farley@gmail.com>
parents:
19639
diff
changeset
|
291 debugtrace[debugger] = debugmod.set_trace |
472fa3b782b1
dispatch: add ability to specify a custom pdb module as a debugger
Sean Farley <sean.michael.farley@gmail.com>
parents:
19639
diff
changeset
|
292 debugmortem[debugger] = debugmod.post_mortem |
472fa3b782b1
dispatch: add ability to specify a custom pdb module as a debugger
Sean Farley <sean.michael.farley@gmail.com>
parents:
19639
diff
changeset
|
293 |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
294 # enter the debugger before command execution |
35028
7f8f9f0369ca
dispatch: extract stub function to peek boolean command option
Yuya Nishihara <yuya@tcha.org>
parents:
35027
diff
changeset
|
295 if _earlyreqoptbool(req, 'debugger', ['--debugger']): |
11495
6ee107782018
debugger: give a little intro before entering pdb
Mads Kiilerich <mads@kiilerich.com>
parents:
11494
diff
changeset
|
296 ui.warn(_("entering debugger - " |
6ee107782018
debugger: give a little intro before entering pdb
Mads Kiilerich <mads@kiilerich.com>
parents:
11494
diff
changeset
|
297 "type c to continue starting hg or h for help\n")) |
19640
472fa3b782b1
dispatch: add ability to specify a custom pdb module as a debugger
Sean Farley <sean.michael.farley@gmail.com>
parents:
19639
diff
changeset
|
298 |
472fa3b782b1
dispatch: add ability to specify a custom pdb module as a debugger
Sean Farley <sean.michael.farley@gmail.com>
parents:
19639
diff
changeset
|
299 if (debugger != 'pdb' and |
472fa3b782b1
dispatch: add ability to specify a custom pdb module as a debugger
Sean Farley <sean.michael.farley@gmail.com>
parents:
19639
diff
changeset
|
300 debugtrace[debugger] == debugtrace['pdb']): |
472fa3b782b1
dispatch: add ability to specify a custom pdb module as a debugger
Sean Farley <sean.michael.farley@gmail.com>
parents:
19639
diff
changeset
|
301 ui.warn(_("%s debugger specified " |
472fa3b782b1
dispatch: add ability to specify a custom pdb module as a debugger
Sean Farley <sean.michael.farley@gmail.com>
parents:
19639
diff
changeset
|
302 "but its module was not found\n") % debugger) |
26236
2e42517129ca
dispatch: use the right context manager to deactivate demandimport
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
26216
diff
changeset
|
303 with demandimport.deactivated(): |
26216
e86d12404d69
dispatch: disable demandimport when invoking the debugger
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
26191
diff
changeset
|
304 debugtrace[debugger]() |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
305 try: |
14439
80c599eee3f3
dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents:
14438
diff
changeset
|
306 return _dispatch(req) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
307 finally: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
308 ui.flush() |
16705
c2d9ef43ff6c
check-code: ignore naked excepts with a "re-raise" comment
Brodie Rao <brodie@sf.io>
parents:
16686
diff
changeset
|
309 except: # re-raises |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
310 # enter the debugger when we hit an exception |
35028
7f8f9f0369ca
dispatch: extract stub function to peek boolean command option
Yuya Nishihara <yuya@tcha.org>
parents:
35027
diff
changeset
|
311 if _earlyreqoptbool(req, 'debugger', ['--debugger']): |
11494
2347513f562a
debugger: show traceback before entering pdb post-mortem
Mads Kiilerich <mads@kiilerich.com>
parents:
11330
diff
changeset
|
312 traceback.print_exc() |
19640
472fa3b782b1
dispatch: add ability to specify a custom pdb module as a debugger
Sean Farley <sean.michael.farley@gmail.com>
parents:
19639
diff
changeset
|
313 debugmortem[debugger](sys.exc_info()[2]) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
314 raise |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
315 |
32040
0fb78cb90ca7
dispatch: mark callcatch() as a private function
Yuya Nishihara <yuya@tcha.org>
parents:
31960
diff
changeset
|
316 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
|
317 |
32040
0fb78cb90ca7
dispatch: mark callcatch() as a private function
Yuya Nishihara <yuya@tcha.org>
parents:
31960
diff
changeset
|
318 def _callcatch(ui, func): |
30520
4338f87dbf6f
dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents:
30519
diff
changeset
|
319 """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
|
320 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
|
321 uncaught exceptions. |
29761
39149b6036e6
dispatch: split global error handling out so it can be reused
Jun Wu <quark@fb.com>
parents:
29132
diff
changeset
|
322 """ |
39149b6036e6
dispatch: split global error handling out so it can be reused
Jun Wu <quark@fb.com>
parents:
29132
diff
changeset
|
323 try: |
30520
4338f87dbf6f
dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents:
30519
diff
changeset
|
324 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
|
325 except error.AmbiguousCommand as inst: |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
326 ui.warn(_("hg: command '%s' is ambiguous:\n %s\n") % |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
327 (inst.args[0], " ".join(inst.args[1]))) |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25329
diff
changeset
|
328 except error.CommandError as inst: |
7645
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
329 if inst.args[0]: |
31266
8089de5fab89
dispatch: add pagination of two more help cases
Augie Fackler <augie@google.com>
parents:
31199
diff
changeset
|
330 ui.pager('help') |
32620
3ce53a499334
dispatch: convert exception payload to bytes more carefully
Augie Fackler <raf@durin42.com>
parents:
32566
diff
changeset
|
331 msgbytes = pycompat.bytestr(inst.args[1]) |
3ce53a499334
dispatch: convert exception payload to bytes more carefully
Augie Fackler <raf@durin42.com>
parents:
32566
diff
changeset
|
332 ui.warn(_("hg %s: %s\n") % (inst.args[0], msgbytes)) |
14286
005a540e9aee
help: add -c/--command flag to only show command help (issue2799)
Martin Geisler <mg@aragost.com>
parents:
14265
diff
changeset
|
333 commands.help_(ui, inst.args[0], full=False, command=True) |
7645
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
334 else: |
31266
8089de5fab89
dispatch: add pagination of two more help cases
Augie Fackler <augie@google.com>
parents:
31199
diff
changeset
|
335 ui.pager('help') |
7645
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
336 ui.warn(_("hg: %s\n") % inst.args[1]) |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
337 commands.help_(ui, 'shortlist') |
30520
4338f87dbf6f
dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents:
30519
diff
changeset
|
338 except error.ParseError as inst: |
4338f87dbf6f
dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents:
30519
diff
changeset
|
339 _formatparse(ui.warn, inst) |
4338f87dbf6f
dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents:
30519
diff
changeset
|
340 return -1 |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25329
diff
changeset
|
341 except error.UnknownCommand as inst: |
31060
ab20491b1760
dispatch: rearrange 'unknown command' code to better employ pager
Augie Fackler <augie@google.com>
parents:
31027
diff
changeset
|
342 nocmdmsg = _("hg: unknown command '%s'\n") % inst.args[0] |
10364
de1e7099d100
dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents:
10282
diff
changeset
|
343 try: |
de1e7099d100
dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents:
10282
diff
changeset
|
344 # 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
|
345 # (but don't check for extensions themselves) |
32566
1b90036f42f0
help: pass commands module by argument
Yuya Nishihara <yuya@tcha.org>
parents:
32379
diff
changeset
|
346 formatted = help.formattedhelp(ui, commands, inst.args[0], |
1b90036f42f0
help: pass commands module by argument
Yuya Nishihara <yuya@tcha.org>
parents:
32379
diff
changeset
|
347 unknowncmd=True) |
31060
ab20491b1760
dispatch: rearrange 'unknown command' code to better employ pager
Augie Fackler <augie@google.com>
parents:
31027
diff
changeset
|
348 ui.warn(nocmdmsg) |
ab20491b1760
dispatch: rearrange 'unknown command' code to better employ pager
Augie Fackler <augie@google.com>
parents:
31027
diff
changeset
|
349 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
|
350 except (error.UnknownCommand, error.Abort): |
24222
02d7b5cd373b
dispatch: offer suggestions of similar-named commands
Augie Fackler <augie@google.com>
parents:
24221
diff
changeset
|
351 suggested = False |
02d7b5cd373b
dispatch: offer suggestions of similar-named commands
Augie Fackler <augie@google.com>
parents:
24221
diff
changeset
|
352 if len(inst.args) == 2: |
02d7b5cd373b
dispatch: offer suggestions of similar-named commands
Augie Fackler <augie@google.com>
parents:
24221
diff
changeset
|
353 sim = _getsimilar(inst.args[1], inst.args[0]) |
02d7b5cd373b
dispatch: offer suggestions of similar-named commands
Augie Fackler <augie@google.com>
parents:
24221
diff
changeset
|
354 if sim: |
31060
ab20491b1760
dispatch: rearrange 'unknown command' code to better employ pager
Augie Fackler <augie@google.com>
parents:
31027
diff
changeset
|
355 ui.warn(nocmdmsg) |
27623
b3376fba4ab9
dispatch: report similar names consistently
Bryan O'Sullivan <bos@serpentine.com>
parents:
27615
diff
changeset
|
356 _reportsimilar(ui.warn, sim) |
24222
02d7b5cd373b
dispatch: offer suggestions of similar-named commands
Augie Fackler <augie@google.com>
parents:
24221
diff
changeset
|
357 suggested = True |
02d7b5cd373b
dispatch: offer suggestions of similar-named commands
Augie Fackler <augie@google.com>
parents:
24221
diff
changeset
|
358 if not suggested: |
31060
ab20491b1760
dispatch: rearrange 'unknown command' code to better employ pager
Augie Fackler <augie@google.com>
parents:
31027
diff
changeset
|
359 ui.pager('help') |
ab20491b1760
dispatch: rearrange 'unknown command' code to better employ pager
Augie Fackler <augie@google.com>
parents:
31027
diff
changeset
|
360 ui.warn(nocmdmsg) |
24222
02d7b5cd373b
dispatch: offer suggestions of similar-named commands
Augie Fackler <augie@google.com>
parents:
24221
diff
changeset
|
361 commands.help_(ui, 'shortlist') |
30520
4338f87dbf6f
dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents:
30519
diff
changeset
|
362 except IOError: |
4338f87dbf6f
dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents:
30519
diff
changeset
|
363 raise |
7645
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
364 except KeyboardInterrupt: |
28520
84cc72c5771e
dispatch: catch KeyboardInterrupt more broadly
Yuya Nishihara <yuya@tcha.org>
parents:
28515
diff
changeset
|
365 raise |
30520
4338f87dbf6f
dispatch: move part of callcatch to scmutil
Jun Wu <quark@fb.com>
parents:
30519
diff
changeset
|
366 except: # probably re-raises |
28784
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
367 if not handlecommandexception(ui): |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
368 raise |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
369 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
370 return -1 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
371 |
14265
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
372 def aliasargs(fn, givenargs): |
34087
5361771f9714
wrapfunction: use functools.partial if possible
Jun Wu <quark@fb.com>
parents:
34022
diff
changeset
|
373 args = [] |
5361771f9714
wrapfunction: use functools.partial if possible
Jun Wu <quark@fb.com>
parents:
34022
diff
changeset
|
374 # only care about alias 'args', ignore 'args' set by extensions.wrapfunction |
5361771f9714
wrapfunction: use functools.partial if possible
Jun Wu <quark@fb.com>
parents:
34022
diff
changeset
|
375 if not util.safehasattr(fn, '_origfunc'): |
5361771f9714
wrapfunction: use functools.partial if possible
Jun Wu <quark@fb.com>
parents:
34022
diff
changeset
|
376 args = getattr(fn, 'args', args) |
16294
795d591b6ef5
alias: abort on missing positional args (issue3331)
Matt Mackall <mpm@selenic.com>
parents:
16277
diff
changeset
|
377 if args: |
14265
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
378 cmd = ' '.join(map(util.shellquote, args)) |
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
379 |
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
380 nums = [] |
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
381 def replacer(m): |
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
382 num = int(m.group(1)) - 1 |
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
383 nums.append(num) |
16277
1c2aaf05f7d7
aliases: use empty string for missing position parameters (issue3331)
Matt Mackall <mpm@selenic.com>
parents:
15781
diff
changeset
|
384 if num < len(givenargs): |
1c2aaf05f7d7
aliases: use empty string for missing position parameters (issue3331)
Matt Mackall <mpm@selenic.com>
parents:
15781
diff
changeset
|
385 return givenargs[num] |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26421
diff
changeset
|
386 raise error.Abort(_('too few arguments for command alias')) |
31491
492c64afc54c
py3: make the regular expression bytes to prevent TypeError
Pulkit Goyal <7895pulkit@gmail.com>
parents:
31305
diff
changeset
|
387 cmd = re.sub(br'\$(\d+|\$)', replacer, cmd) |
14265
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
388 givenargs = [x for i, x in enumerate(givenargs) |
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
389 if i not in nums] |
30678
caf7e1c5efe4
py3: have a bytes version of shlex.split()
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30653
diff
changeset
|
390 args = pycompat.shlexsplit(cmd) |
14265
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
391 return args + givenargs |
8655 | 392 |
22158
bc2132dfc0a4
alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents:
21961
diff
changeset
|
393 def aliasinterpolate(name, args, cmd): |
bc2132dfc0a4
alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents:
21961
diff
changeset
|
394 '''interpolate args into cmd for shell aliases |
bc2132dfc0a4
alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents:
21961
diff
changeset
|
395 |
bc2132dfc0a4
alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents:
21961
diff
changeset
|
396 This also handles $0, $@ and "$@". |
bc2132dfc0a4
alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents:
21961
diff
changeset
|
397 ''' |
bc2132dfc0a4
alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents:
21961
diff
changeset
|
398 # 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
|
399 # built to match prefix + patterns. |
bc2132dfc0a4
alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents:
21961
diff
changeset
|
400 replacemap = dict(('$%d' % (i + 1), arg) for i, arg in enumerate(args)) |
bc2132dfc0a4
alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents:
21961
diff
changeset
|
401 replacemap['$0'] = name |
bc2132dfc0a4
alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents:
21961
diff
changeset
|
402 replacemap['$$'] = '$' |
bc2132dfc0a4
alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents:
21961
diff
changeset
|
403 replacemap['$@'] = ' '.join(args) |
bc2132dfc0a4
alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents:
21961
diff
changeset
|
404 # 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
|
405 # 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
|
406 # 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
|
407 # tokenize each argument into exactly one word. |
bc2132dfc0a4
alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents:
21961
diff
changeset
|
408 replacemap['"$@"'] = ' '.join(util.shellquote(arg) for arg in args) |
bc2132dfc0a4
alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents:
21961
diff
changeset
|
409 # escape '\$' for regex |
bc2132dfc0a4
alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents:
21961
diff
changeset
|
410 regex = '|'.join(replacemap.keys()).replace('$', r'\$') |
bc2132dfc0a4
alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents:
21961
diff
changeset
|
411 r = re.compile(regex) |
bc2132dfc0a4
alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents:
21961
diff
changeset
|
412 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
|
413 |
8655 | 414 class cmdalias(object): |
28828
3640c1702c43
help: report source of aliases
timeless <timeless@mozdev.org>
parents:
28821
diff
changeset
|
415 def __init__(self, name, definition, cmdtable, source): |
12039
18e1e7520b67
alias: make shadowing behavior more consistent (issue2054)
Brodie Rao <brodie@bitheap.org>
parents:
11712
diff
changeset
|
416 self.name = self.cmd = name |
12092
4982fa38e544
alias: print what command is being shadowed in debug message
Brodie Rao <brodie@bitheap.org>
parents:
12070
diff
changeset
|
417 self.cmdname = '' |
8655 | 418 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
|
419 self.fn = None |
29087
ad1bdea43965
dispatch: defer environment variable resolution in alias commands (BC)
Jun Wu <quark@fb.com>
parents:
28861
diff
changeset
|
420 self.givenargs = [] |
8655 | 421 self.opts = [] |
422 self.help = '' | |
22160
645457f73aa6
alias: keep error message in "badalias" so that help can see it
Yuya Nishihara <yuya@tcha.org>
parents:
22158
diff
changeset
|
423 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
|
424 self.unknowncmd = False |
28828
3640c1702c43
help: report source of aliases
timeless <timeless@mozdev.org>
parents:
28821
diff
changeset
|
425 self.source = source |
8655 | 426 |
427 try: | |
12039
18e1e7520b67
alias: make shadowing behavior more consistent (issue2054)
Brodie Rao <brodie@bitheap.org>
parents:
11712
diff
changeset
|
428 aliases, entry = cmdutil.findcmd(self.name, cmdtable) |
18e1e7520b67
alias: make shadowing behavior more consistent (issue2054)
Brodie Rao <brodie@bitheap.org>
parents:
11712
diff
changeset
|
429 for alias, e in cmdtable.iteritems(): |
18e1e7520b67
alias: make shadowing behavior more consistent (issue2054)
Brodie Rao <brodie@bitheap.org>
parents:
11712
diff
changeset
|
430 if e is entry: |
18e1e7520b67
alias: make shadowing behavior more consistent (issue2054)
Brodie Rao <brodie@bitheap.org>
parents:
11712
diff
changeset
|
431 self.cmd = alias |
18e1e7520b67
alias: make shadowing behavior more consistent (issue2054)
Brodie Rao <brodie@bitheap.org>
parents:
11712
diff
changeset
|
432 break |
8655 | 433 self.shadows = True |
434 except error.UnknownCommand: | |
435 self.shadows = False | |
436 | |
437 if not self.definition: | |
22160
645457f73aa6
alias: keep error message in "badalias" so that help can see it
Yuya Nishihara <yuya@tcha.org>
parents:
22158
diff
changeset
|
438 self.badalias = _("no definition for alias '%s'") % self.name |
8655 | 439 return |
440 | |
11524
24965bb270b7
dispatch: add shell aliases
Steve Losh <steve@stevelosh.com>
parents:
11495
diff
changeset
|
441 if self.definition.startswith('!'): |
12536
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
442 self.shell = True |
11524
24965bb270b7
dispatch: add shell aliases
Steve Losh <steve@stevelosh.com>
parents:
11495
diff
changeset
|
443 def fn(ui, *args): |
11989
f853873fc66d
aliases: provide more flexible ways to work with shell alias arguments
Steve Losh <steve@stevelosh.com>
parents:
11985
diff
changeset
|
444 env = {'HG_ARGS': ' '.join((self.name,) + args)} |
f853873fc66d
aliases: provide more flexible ways to work with shell alias arguments
Steve Losh <steve@stevelosh.com>
parents:
11985
diff
changeset
|
445 def _checkvar(m): |
13392
777cef34a890
dispatch: support for $ escaping in shell-alias definition
Roman Sokolov <sokolov.r.v@gmail.com>
parents:
13382
diff
changeset
|
446 if m.groups()[0] == '$': |
777cef34a890
dispatch: support for $ escaping in shell-alias definition
Roman Sokolov <sokolov.r.v@gmail.com>
parents:
13382
diff
changeset
|
447 return m.group() |
777cef34a890
dispatch: support for $ escaping in shell-alias definition
Roman Sokolov <sokolov.r.v@gmail.com>
parents:
13382
diff
changeset
|
448 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
|
449 return m.group() |
f853873fc66d
aliases: provide more flexible ways to work with shell alias arguments
Steve Losh <steve@stevelosh.com>
parents:
11985
diff
changeset
|
450 else: |
14708
8083f4d00bd1
i18n: remove translation of debug messages
David Soria Parra <dsp@php.net>
parents:
14704
diff
changeset
|
451 ui.debug("No argument found for substitution " |
8083f4d00bd1
i18n: remove translation of debug messages
David Soria Parra <dsp@php.net>
parents:
14704
diff
changeset
|
452 "of %i variable in alias '%s' definition." |
13393
d38d500deb08
dispatch: debug message for missing arguments in shell alias
Roman Sokolov <sokolov.r.v@gmail.com>
parents:
13392
diff
changeset
|
453 % (int(m.groups()[0]), self.name)) |
11989
f853873fc66d
aliases: provide more flexible ways to work with shell alias arguments
Steve Losh <steve@stevelosh.com>
parents:
11985
diff
changeset
|
454 return '' |
13392
777cef34a890
dispatch: support for $ escaping in shell-alias definition
Roman Sokolov <sokolov.r.v@gmail.com>
parents:
13382
diff
changeset
|
455 cmd = re.sub(r'\$(\d+|\$)', _checkvar, self.definition[1:]) |
22158
bc2132dfc0a4
alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents:
21961
diff
changeset
|
456 cmd = aliasinterpolate(self.name, args, cmd) |
31199
3a03264de3eb
dispatch: set a blockedtag when running an external alias
Simon Farnsworth <simonfar@fb.com>
parents:
31180
diff
changeset
|
457 return ui.system(cmd, environ=env, |
3a03264de3eb
dispatch: set a blockedtag when running an external alias
Simon Farnsworth <simonfar@fb.com>
parents:
31180
diff
changeset
|
458 blockedtag='alias_%s' % self.name) |
11524
24965bb270b7
dispatch: add shell aliases
Steve Losh <steve@stevelosh.com>
parents:
11495
diff
changeset
|
459 self.fn = fn |
24965bb270b7
dispatch: add shell aliases
Steve Losh <steve@stevelosh.com>
parents:
11495
diff
changeset
|
460 return |
24965bb270b7
dispatch: add shell aliases
Steve Losh <steve@stevelosh.com>
parents:
11495
diff
changeset
|
461 |
21569
c5afb07c33d3
alias: handle shlex error in command aliases
Yuya Nishihara <yuya@tcha.org>
parents:
21556
diff
changeset
|
462 try: |
30678
caf7e1c5efe4
py3: have a bytes version of shlex.split()
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30653
diff
changeset
|
463 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
|
464 except ValueError as inst: |
22160
645457f73aa6
alias: keep error message in "badalias" so that help can see it
Yuya Nishihara <yuya@tcha.org>
parents:
22158
diff
changeset
|
465 self.badalias = (_("error in definition for alias '%s': %s") |
645457f73aa6
alias: keep error message in "badalias" so that help can see it
Yuya Nishihara <yuya@tcha.org>
parents:
22158
diff
changeset
|
466 % (self.name, inst)) |
21569
c5afb07c33d3
alias: handle shlex error in command aliases
Yuya Nishihara <yuya@tcha.org>
parents:
21556
diff
changeset
|
467 return |
12092
4982fa38e544
alias: print what command is being shadowed in debug message
Brodie Rao <brodie@bitheap.org>
parents:
12070
diff
changeset
|
468 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
|
469 self.givenargs = args |
8655 | 470 |
18693
633cd0c46e6a
dispatch: also a separate warning message on aliases with --config
Simon Heimberg <simohe@besonet.ch>
parents:
18691
diff
changeset
|
471 for invalidarg in ("--cwd", "-R", "--repository", "--repo", "--config"): |
11695
ee8f36a6c766
alias: improved diagnostic when arguments include --cwd, etc.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
11681
diff
changeset
|
472 if _earlygetopt([invalidarg], args): |
22160
645457f73aa6
alias: keep error message in "badalias" so that help can see it
Yuya Nishihara <yuya@tcha.org>
parents:
22158
diff
changeset
|
473 self.badalias = (_("error in definition for alias '%s': %s may " |
645457f73aa6
alias: keep error message in "badalias" so that help can see it
Yuya Nishihara <yuya@tcha.org>
parents:
22158
diff
changeset
|
474 "only be given on the command line") |
645457f73aa6
alias: keep error message in "badalias" so that help can see it
Yuya Nishihara <yuya@tcha.org>
parents:
22158
diff
changeset
|
475 % (self.name, invalidarg)) |
11695
ee8f36a6c766
alias: improved diagnostic when arguments include --cwd, etc.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
11681
diff
changeset
|
476 return |
ee8f36a6c766
alias: improved diagnostic when arguments include --cwd, etc.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
11681
diff
changeset
|
477 |
8655 | 478 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
|
479 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
|
480 if len(tableentry) > 2: |
8bce1e0d2801
alias: do not crash when aliased command has no usage help text
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9825
diff
changeset
|
481 self.fn, self.opts, self.help = tableentry |
8bce1e0d2801
alias: do not crash when aliased command has no usage help text
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9825
diff
changeset
|
482 else: |
8bce1e0d2801
alias: do not crash when aliased command has no usage help text
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9825
diff
changeset
|
483 self.fn, self.opts = tableentry |
8bce1e0d2801
alias: do not crash when aliased command has no usage help text
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9825
diff
changeset
|
484 |
9876
6e8a16dd3e30
alias: improve help text for command aliases
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
9875
diff
changeset
|
485 if self.help.startswith("hg " + cmd): |
6e8a16dd3e30
alias: improve help text for command aliases
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
9875
diff
changeset
|
486 # drop prefix in old-style help lines so hg shows the alias |
6e8a16dd3e30
alias: improve help text for command aliases
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
9875
diff
changeset
|
487 self.help = self.help[4 + len(cmd):] |
10564
6ded6243bde2
alias: fixes exception when displaying translated help text
Yuya Nishihara <yuya@tcha.org>
parents:
10402
diff
changeset
|
488 self.__doc__ = self.fn.__doc__ |
9876
6e8a16dd3e30
alias: improve help text for command aliases
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
9875
diff
changeset
|
489 |
8655 | 490 except error.UnknownCommand: |
22160
645457f73aa6
alias: keep error message in "badalias" so that help can see it
Yuya Nishihara <yuya@tcha.org>
parents:
22158
diff
changeset
|
491 self.badalias = (_("alias '%s' resolves to unknown command '%s'") |
645457f73aa6
alias: keep error message in "badalias" so that help can see it
Yuya Nishihara <yuya@tcha.org>
parents:
22158
diff
changeset
|
492 % (self.name, cmd)) |
22161
063628423fd1
alias: provide "unknowncmd" flag to tell help to look for disabled command
Yuya Nishihara <yuya@tcha.org>
parents:
22160
diff
changeset
|
493 self.unknowncmd = True |
8655 | 494 except error.AmbiguousCommand: |
22160
645457f73aa6
alias: keep error message in "badalias" so that help can see it
Yuya Nishihara <yuya@tcha.org>
parents:
22158
diff
changeset
|
495 self.badalias = (_("alias '%s' resolves to ambiguous command '%s'") |
645457f73aa6
alias: keep error message in "badalias" so that help can see it
Yuya Nishihara <yuya@tcha.org>
parents:
22158
diff
changeset
|
496 % (self.name, cmd)) |
8655 | 497 |
29087
ad1bdea43965
dispatch: defer environment variable resolution in alias commands (BC)
Jun Wu <quark@fb.com>
parents:
28861
diff
changeset
|
498 @property |
ad1bdea43965
dispatch: defer environment variable resolution in alias commands (BC)
Jun Wu <quark@fb.com>
parents:
28861
diff
changeset
|
499 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
|
500 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
|
501 return aliasargs(self.fn, args) |
ad1bdea43965
dispatch: defer environment variable resolution in alias commands (BC)
Jun Wu <quark@fb.com>
parents:
28861
diff
changeset
|
502 |
28621
d856e85a8a7a
dispatch: make cmdalias forward command attributes to function
Yuya Nishihara <yuya@tcha.org>
parents:
28538
diff
changeset
|
503 def __getattr__(self, name): |
34781
fe987d0b9e1e
registrar: add support for storing the type of command in func object
Pulkit Goyal <7895pulkit@gmail.com>
parents:
34638
diff
changeset
|
504 adefaults = {r'norepo': True, r'cmdtype': unrecoverablewrite, |
32158
89153b0d4881
py3: make adefaults keys str to be compatible with getattr
Pulkit Goyal <7895pulkit@gmail.com>
parents:
32130
diff
changeset
|
505 r'optionalrepo': False, r'inferrepo': False} |
28621
d856e85a8a7a
dispatch: make cmdalias forward command attributes to function
Yuya Nishihara <yuya@tcha.org>
parents:
28538
diff
changeset
|
506 if name not in adefaults: |
d856e85a8a7a
dispatch: make cmdalias forward command attributes to function
Yuya Nishihara <yuya@tcha.org>
parents:
28538
diff
changeset
|
507 raise AttributeError(name) |
d856e85a8a7a
dispatch: make cmdalias forward command attributes to function
Yuya Nishihara <yuya@tcha.org>
parents:
28538
diff
changeset
|
508 if self.badalias or util.safehasattr(self, 'shell'): |
d856e85a8a7a
dispatch: make cmdalias forward command attributes to function
Yuya Nishihara <yuya@tcha.org>
parents:
28538
diff
changeset
|
509 return adefaults[name] |
d856e85a8a7a
dispatch: make cmdalias forward command attributes to function
Yuya Nishihara <yuya@tcha.org>
parents:
28538
diff
changeset
|
510 return getattr(self.fn, name) |
d856e85a8a7a
dispatch: make cmdalias forward command attributes to function
Yuya Nishihara <yuya@tcha.org>
parents:
28538
diff
changeset
|
511 |
8655 | 512 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
|
513 if self.badalias: |
22164
efd65e51bc0b
alias: exit from bad definition by Abort
Yuya Nishihara <yuya@tcha.org>
parents:
22163
diff
changeset
|
514 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
|
515 if self.unknowncmd: |
10364
de1e7099d100
dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents:
10282
diff
changeset
|
516 try: |
de1e7099d100
dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents:
10282
diff
changeset
|
517 # 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
|
518 cmd, ext = extensions.disabledcmd(ui, self.cmdname)[:2] |
22164
efd65e51bc0b
alias: exit from bad definition by Abort
Yuya Nishihara <yuya@tcha.org>
parents:
22163
diff
changeset
|
519 hint = _("'%s' is provided by '%s' extension") % (cmd, ext) |
10364
de1e7099d100
dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents:
10282
diff
changeset
|
520 except error.UnknownCommand: |
de1e7099d100
dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents:
10282
diff
changeset
|
521 pass |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26421
diff
changeset
|
522 raise error.Abort(self.badalias, hint=hint) |
8655 | 523 if self.shadows: |
14704
b24d596fcd25
Backed out changeset 1ec8bd909ac3
Martin Geisler <mg@aragost.com>
parents:
14702
diff
changeset
|
524 ui.debug("alias '%s' shadows command '%s'\n" % |
12092
4982fa38e544
alias: print what command is being shadowed in debug message
Brodie Rao <brodie@bitheap.org>
parents:
12070
diff
changeset
|
525 (self.name, self.cmdname)) |
8655 | 526 |
29846
318e2b600b80
blackbox: also log alias expansions
Augie Fackler <augie@google.com>
parents:
29841
diff
changeset
|
527 ui.log('commandalias', "alias '%s' expands to '%s'\n", |
318e2b600b80
blackbox: also log alias expansions
Augie Fackler <augie@google.com>
parents:
29841
diff
changeset
|
528 self.name, self.definition) |
14950
144e97421f6b
dispatch: use safehasattr instead of hasattr
Augie Fackler <durin42@gmail.com>
parents:
14918
diff
changeset
|
529 if util.safehasattr(self, 'shell'): |
11989
f853873fc66d
aliases: provide more flexible ways to work with shell alias arguments
Steve Losh <steve@stevelosh.com>
parents:
11985
diff
changeset
|
530 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
|
531 else: |
12093
cd895084a4cd
alias: on --debug, print expansion when it has invalid arguments
Brodie Rao <brodie@bitheap.org>
parents:
12092
diff
changeset
|
532 try: |
21556
5e13507a3b4e
alias: fix loss of non-zero return code in command aliases
Yuya Nishihara <yuya@tcha.org>
parents:
20829
diff
changeset
|
533 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
|
534 except error.SignatureError: |
cd895084a4cd
alias: on --debug, print expansion when it has invalid arguments
Brodie Rao <brodie@bitheap.org>
parents:
12092
diff
changeset
|
535 args = ' '.join([self.cmdname] + self.args) |
14704
b24d596fcd25
Backed out changeset 1ec8bd909ac3
Martin Geisler <mg@aragost.com>
parents:
14702
diff
changeset
|
536 ui.debug("alias '%s' expands to '%s'\n" % (self.name, args)) |
12093
cd895084a4cd
alias: on --debug, print expansion when it has invalid arguments
Brodie Rao <brodie@bitheap.org>
parents:
12092
diff
changeset
|
537 raise |
8655 | 538 |
34306
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
539 class lazyaliasentry(object): |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
540 """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
|
541 |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
542 def __init__(self, name, definition, cmdtable, source): |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
543 self.name = name |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
544 self.definition = definition |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
545 self.cmdtable = cmdtable.copy() |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
546 self.source = source |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
547 |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
548 @util.propertycache |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
549 def _aliasdef(self): |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
550 return cmdalias(self.name, self.definition, self.cmdtable, self.source) |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
551 |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
552 def __getitem__(self, n): |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
553 aliasdef = self._aliasdef |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
554 if n == 0: |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
555 return aliasdef |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
556 elif n == 1: |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
557 return aliasdef.opts |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
558 elif n == 2: |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
559 return aliasdef.help |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
560 else: |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
561 raise IndexError |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
562 |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
563 def __iter__(self): |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
564 for i in range(3): |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
565 yield self[i] |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
566 |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
567 def __len__(self): |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
568 return 3 |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
569 |
8655 | 570 def addaliases(ui, cmdtable): |
571 # aliases are processed after extensions have been loaded, so they | |
572 # may use extension commands. Aliases can also use other alias definitions, | |
573 # but only if they have been defined prior to the current definition. | |
574 for alias, definition in ui.configitems('alias'): | |
15019
f4b7be3f8430
dispatch: don't rewrap aliases that have the same definition
Idan Kamara <idankk86@gmail.com>
parents:
14992
diff
changeset
|
575 try: |
34306
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
576 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
|
577 continue |
f4b7be3f8430
dispatch: don't rewrap aliases that have the same definition
Idan Kamara <idankk86@gmail.com>
parents:
14992
diff
changeset
|
578 except (KeyError, AttributeError): |
f4b7be3f8430
dispatch: don't rewrap aliases that have the same definition
Idan Kamara <idankk86@gmail.com>
parents:
14992
diff
changeset
|
579 # 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
|
580 pass |
f4b7be3f8430
dispatch: don't rewrap aliases that have the same definition
Idan Kamara <idankk86@gmail.com>
parents:
14992
diff
changeset
|
581 |
34305
0e48813cc106
alias: test duplicated definition earlier
Jun Wu <quark@fb.com>
parents:
34131
diff
changeset
|
582 source = ui.configsource('alias', alias) |
34306
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
583 entry = lazyaliasentry(alias, definition, cmdtable, source) |
bd50aa1aa035
alias: make alias command lazily resolved
Jun Wu <quark@fb.com>
parents:
34305
diff
changeset
|
584 cmdtable[alias] = entry |
8655 | 585 |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
586 def _parse(ui, args): |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
587 options = {} |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
588 cmdoptions = {} |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
589 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
590 try: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
591 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
|
592 except getopt.GetoptError as inst: |
11287
b901bb751999
error: change ParseError to CommandError
Matt Mackall <mpm@selenic.com>
parents:
11209
diff
changeset
|
593 raise error.CommandError(None, inst) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
594 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
595 if args: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
596 cmd, args = args[0], args[1:] |
9875
d6a95c5f6ff9
dispatch: minor refactoring
Henri Wiechers <hwiechers@gmail.com>
parents:
9825
diff
changeset
|
597 aliases, entry = cmdutil.findcmd(cmd, commands.table, |
16591
46e9ed223d2c
commands: parse ui.strict config item as bool
Yuya Nishihara <yuya@tcha.org>
parents:
16392
diff
changeset
|
598 ui.configbool("ui", "strict")) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
599 cmd = aliases[0] |
14265
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
600 args = aliasargs(entry[0], args) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
601 defaults = ui.config("defaults", cmd) |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
602 if defaults: |
31502
9916b3d579a9
dispatch: use pycompat.maplist to allow summing with args
Augie Fackler <augie@google.com>
parents:
31500
diff
changeset
|
603 args = pycompat.maplist( |
9916b3d579a9
dispatch: use pycompat.maplist to allow summing with args
Augie Fackler <augie@google.com>
parents:
31500
diff
changeset
|
604 util.expandpath, pycompat.shlexsplit(defaults)) + args |
9875
d6a95c5f6ff9
dispatch: minor refactoring
Henri Wiechers <hwiechers@gmail.com>
parents:
9825
diff
changeset
|
605 c = list(entry[1]) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
606 else: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
607 cmd = None |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
608 c = [] |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
609 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
610 # combine global options into local |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
611 for o in commands.globalopts: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
612 c.append((o[0], o[1], options[o[1]], o[3])) |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
613 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
614 try: |
29822
61a4cdc98307
dispatch: explicitly pass fancyopts optional arg as a keyword
Augie Fackler <augie@google.com>
parents:
29784
diff
changeset
|
615 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
|
616 except getopt.GetoptError as inst: |
11287
b901bb751999
error: change ParseError to CommandError
Matt Mackall <mpm@selenic.com>
parents:
11209
diff
changeset
|
617 raise error.CommandError(cmd, inst) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
618 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
619 # separate global options back out |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
620 for o in commands.globalopts: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
621 n = o[1] |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
622 options[n] = cmdoptions[n] |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
623 del cmdoptions[n] |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
624 |
9875
d6a95c5f6ff9
dispatch: minor refactoring
Henri Wiechers <hwiechers@gmail.com>
parents:
9825
diff
changeset
|
625 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
|
626 |
8137 | 627 def _parseconfig(ui, config): |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
628 """parse the --config options from the command line""" |
14753
10dcb3e7cb55
dispatch: return read config options
Idan Kamara <idankk86@gmail.com>
parents:
14752
diff
changeset
|
629 configs = [] |
10dcb3e7cb55
dispatch: return read config options
Idan Kamara <idankk86@gmail.com>
parents:
14752
diff
changeset
|
630 |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
631 for cfg in config: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
632 try: |
28081
a6344df5108e
dispatch: strip command line options like config file options
Tony Tung <ttung@fb.com>
parents:
27679
diff
changeset
|
633 name, value = [cfgelem.strip() |
a6344df5108e
dispatch: strip command line options like config file options
Tony Tung <ttung@fb.com>
parents:
27679
diff
changeset
|
634 for cfgelem in cfg.split('=', 1)] |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
635 section, name = name.split('.', 1) |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
636 if not section or not name: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
637 raise IndexError |
20788
f144928dd058
config: give a useful hint of source for the most common command line settings
Mads Kiilerich <madski@unity3d.com>
parents:
20330
diff
changeset
|
638 ui.setconfig(section, name, value, '--config') |
14753
10dcb3e7cb55
dispatch: return read config options
Idan Kamara <idankk86@gmail.com>
parents:
14752
diff
changeset
|
639 configs.append((section, name, value)) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
640 except (IndexError, ValueError): |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26421
diff
changeset
|
641 raise error.Abort(_('malformed --config option: %r ' |
9825
0d850f8beea6
dispatch: better error message for --config option
Bill Schroeder <bschroeder@allstontrading.com>
parents:
9679
diff
changeset
|
642 '(use --config section.name=value)') % cfg) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
643 |
14753
10dcb3e7cb55
dispatch: return read config options
Idan Kamara <idankk86@gmail.com>
parents:
14752
diff
changeset
|
644 return configs |
10dcb3e7cb55
dispatch: return read config options
Idan Kamara <idankk86@gmail.com>
parents:
14752
diff
changeset
|
645 |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
646 def _earlygetopt(aliases, args): |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
647 """Return list of values for an option (or aliases). |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
648 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
649 The values are listed in the order they appear in args. |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
650 The options and values are removed from args. |
19098
f01ae031f84c
dispatch: add doctests for _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19011
diff
changeset
|
651 |
34131
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34087
diff
changeset
|
652 >>> args = [b'x', b'--cwd', b'foo', b'y'] |
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34087
diff
changeset
|
653 >>> _earlygetopt([b'--cwd'], args), args |
19098
f01ae031f84c
dispatch: add doctests for _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19011
diff
changeset
|
654 (['foo'], ['x', 'y']) |
f01ae031f84c
dispatch: add doctests for _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19011
diff
changeset
|
655 |
34131
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34087
diff
changeset
|
656 >>> args = [b'x', b'--cwd=bar', b'y'] |
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34087
diff
changeset
|
657 >>> _earlygetopt([b'--cwd'], args), args |
19099
fc081623f4bd
dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19098
diff
changeset
|
658 (['bar'], ['x', 'y']) |
fc081623f4bd
dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19098
diff
changeset
|
659 |
34131
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34087
diff
changeset
|
660 >>> args = [b'x', b'-R', b'foo', b'y'] |
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34087
diff
changeset
|
661 >>> _earlygetopt([b'-R'], args), args |
19098
f01ae031f84c
dispatch: add doctests for _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19011
diff
changeset
|
662 (['foo'], ['x', 'y']) |
f01ae031f84c
dispatch: add doctests for _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19011
diff
changeset
|
663 |
34131
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34087
diff
changeset
|
664 >>> args = [b'x', b'-Rbar', b'y'] |
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34087
diff
changeset
|
665 >>> _earlygetopt([b'-R'], args), args |
19098
f01ae031f84c
dispatch: add doctests for _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19011
diff
changeset
|
666 (['bar'], ['x', 'y']) |
35027
7384250eabd9
dispatch: do not drop unpaired argument at _earlygetopt()
Yuya Nishihara <yuya@tcha.org>
parents:
34781
diff
changeset
|
667 |
7384250eabd9
dispatch: do not drop unpaired argument at _earlygetopt()
Yuya Nishihara <yuya@tcha.org>
parents:
34781
diff
changeset
|
668 >>> args = [b'x', b'-R', b'--', b'y'] |
7384250eabd9
dispatch: do not drop unpaired argument at _earlygetopt()
Yuya Nishihara <yuya@tcha.org>
parents:
34781
diff
changeset
|
669 >>> _earlygetopt([b'-R'], args), args |
7384250eabd9
dispatch: do not drop unpaired argument at _earlygetopt()
Yuya Nishihara <yuya@tcha.org>
parents:
34781
diff
changeset
|
670 ([], ['x', '-R', '--', 'y']) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
671 """ |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
672 try: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
673 argcount = args.index("--") |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
674 except ValueError: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
675 argcount = len(args) |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
676 shortopts = [opt for opt in aliases if len(opt) == 2] |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
677 values = [] |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
678 pos = 0 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
679 while pos < argcount: |
19099
fc081623f4bd
dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19098
diff
changeset
|
680 fullarg = arg = args[pos] |
fc081623f4bd
dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19098
diff
changeset
|
681 equals = arg.find('=') |
fc081623f4bd
dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19098
diff
changeset
|
682 if equals > -1: |
fc081623f4bd
dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19098
diff
changeset
|
683 arg = arg[:equals] |
fc081623f4bd
dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19098
diff
changeset
|
684 if arg in aliases: |
fc081623f4bd
dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19098
diff
changeset
|
685 if equals > -1: |
35027
7384250eabd9
dispatch: do not drop unpaired argument at _earlygetopt()
Yuya Nishihara <yuya@tcha.org>
parents:
34781
diff
changeset
|
686 del args[pos] |
19099
fc081623f4bd
dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19098
diff
changeset
|
687 values.append(fullarg[equals + 1:]) |
fc081623f4bd
dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19098
diff
changeset
|
688 argcount -= 1 |
fc081623f4bd
dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19098
diff
changeset
|
689 else: |
fc081623f4bd
dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19098
diff
changeset
|
690 if pos + 1 >= argcount: |
fc081623f4bd
dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19098
diff
changeset
|
691 # ignore and let getopt report an error if there is no value |
fc081623f4bd
dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19098
diff
changeset
|
692 break |
35027
7384250eabd9
dispatch: do not drop unpaired argument at _earlygetopt()
Yuya Nishihara <yuya@tcha.org>
parents:
34781
diff
changeset
|
693 del args[pos] |
19099
fc081623f4bd
dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19098
diff
changeset
|
694 values.append(args.pop(pos)) |
fc081623f4bd
dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19098
diff
changeset
|
695 argcount -= 2 |
fc081623f4bd
dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19098
diff
changeset
|
696 elif arg[:2] in shortopts: |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
697 # short option can have no following space, e.g. hg log -Rfoo |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
698 values.append(args.pop(pos)[2:]) |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
699 argcount -= 1 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
700 else: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
701 pos += 1 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
702 return values |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
703 |
35028
7f8f9f0369ca
dispatch: extract stub function to peek boolean command option
Yuya Nishihara <yuya@tcha.org>
parents:
35027
diff
changeset
|
704 def _earlyreqoptbool(req, name, aliases): |
35029
e16f68c4abe3
dispatch: stop parsing of early boolean option at "--"
Yuya Nishihara <yuya@tcha.org>
parents:
35028
diff
changeset
|
705 """Peek a boolean option without using a full options table |
e16f68c4abe3
dispatch: stop parsing of early boolean option at "--"
Yuya Nishihara <yuya@tcha.org>
parents:
35028
diff
changeset
|
706 |
e16f68c4abe3
dispatch: stop parsing of early boolean option at "--"
Yuya Nishihara <yuya@tcha.org>
parents:
35028
diff
changeset
|
707 >>> req = request([b'x', b'--debugger']) |
e16f68c4abe3
dispatch: stop parsing of early boolean option at "--"
Yuya Nishihara <yuya@tcha.org>
parents:
35028
diff
changeset
|
708 >>> _earlyreqoptbool(req, b'debugger', [b'--debugger']) |
e16f68c4abe3
dispatch: stop parsing of early boolean option at "--"
Yuya Nishihara <yuya@tcha.org>
parents:
35028
diff
changeset
|
709 True |
e16f68c4abe3
dispatch: stop parsing of early boolean option at "--"
Yuya Nishihara <yuya@tcha.org>
parents:
35028
diff
changeset
|
710 |
e16f68c4abe3
dispatch: stop parsing of early boolean option at "--"
Yuya Nishihara <yuya@tcha.org>
parents:
35028
diff
changeset
|
711 >>> req = request([b'x', b'--', b'--debugger']) |
e16f68c4abe3
dispatch: stop parsing of early boolean option at "--"
Yuya Nishihara <yuya@tcha.org>
parents:
35028
diff
changeset
|
712 >>> _earlyreqoptbool(req, b'debugger', [b'--debugger']) |
e16f68c4abe3
dispatch: stop parsing of early boolean option at "--"
Yuya Nishihara <yuya@tcha.org>
parents:
35028
diff
changeset
|
713 """ |
e16f68c4abe3
dispatch: stop parsing of early boolean option at "--"
Yuya Nishihara <yuya@tcha.org>
parents:
35028
diff
changeset
|
714 try: |
e16f68c4abe3
dispatch: stop parsing of early boolean option at "--"
Yuya Nishihara <yuya@tcha.org>
parents:
35028
diff
changeset
|
715 argcount = req.args.index("--") |
e16f68c4abe3
dispatch: stop parsing of early boolean option at "--"
Yuya Nishihara <yuya@tcha.org>
parents:
35028
diff
changeset
|
716 except ValueError: |
e16f68c4abe3
dispatch: stop parsing of early boolean option at "--"
Yuya Nishihara <yuya@tcha.org>
parents:
35028
diff
changeset
|
717 argcount = len(req.args) |
35030
d9aba3730d30
dispatch: abort if early boolean options can't be parsed
Yuya Nishihara <yuya@tcha.org>
parents:
35029
diff
changeset
|
718 value = None |
35029
e16f68c4abe3
dispatch: stop parsing of early boolean option at "--"
Yuya Nishihara <yuya@tcha.org>
parents:
35028
diff
changeset
|
719 pos = 0 |
e16f68c4abe3
dispatch: stop parsing of early boolean option at "--"
Yuya Nishihara <yuya@tcha.org>
parents:
35028
diff
changeset
|
720 while pos < argcount: |
e16f68c4abe3
dispatch: stop parsing of early boolean option at "--"
Yuya Nishihara <yuya@tcha.org>
parents:
35028
diff
changeset
|
721 arg = req.args[pos] |
e16f68c4abe3
dispatch: stop parsing of early boolean option at "--"
Yuya Nishihara <yuya@tcha.org>
parents:
35028
diff
changeset
|
722 if arg in aliases: |
e16f68c4abe3
dispatch: stop parsing of early boolean option at "--"
Yuya Nishihara <yuya@tcha.org>
parents:
35028
diff
changeset
|
723 value = True |
e16f68c4abe3
dispatch: stop parsing of early boolean option at "--"
Yuya Nishihara <yuya@tcha.org>
parents:
35028
diff
changeset
|
724 pos += 1 |
35030
d9aba3730d30
dispatch: abort if early boolean options can't be parsed
Yuya Nishihara <yuya@tcha.org>
parents:
35029
diff
changeset
|
725 req.earlyoptions[name] = value |
35029
e16f68c4abe3
dispatch: stop parsing of early boolean option at "--"
Yuya Nishihara <yuya@tcha.org>
parents:
35028
diff
changeset
|
726 return value |
35028
7f8f9f0369ca
dispatch: extract stub function to peek boolean command option
Yuya Nishihara <yuya@tcha.org>
parents:
35027
diff
changeset
|
727 |
11330
713ae78bb583
provide pre- and post- hooks with parsed command line arguments.
Chad Dombrova <chadrik@gmail.com>
parents:
11305
diff
changeset
|
728 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
|
729 # run pre-hook, and abort if it fails |
19011
12acbea17625
dispatch: print 'abort:' when a pre-command hook fails (BC)
Siddharth Agarwal <sid0@fb.com>
parents:
18935
diff
changeset
|
730 hook.hook(lui, repo, "pre-%s" % cmd, True, args=" ".join(fullargs), |
12acbea17625
dispatch: print 'abort:' when a pre-command hook fails (BC)
Siddharth Agarwal <sid0@fb.com>
parents:
18935
diff
changeset
|
731 pats=cmdpats, opts=cmdoptions) |
29129
e6dfb0e4eeef
dispatch: add fail-* family of hooks
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
29114
diff
changeset
|
732 try: |
e6dfb0e4eeef
dispatch: add fail-* family of hooks
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
29114
diff
changeset
|
733 ret = _runcommand(ui, options, cmd, d) |
e6dfb0e4eeef
dispatch: add fail-* family of hooks
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
29114
diff
changeset
|
734 # run post-hook, passing command result |
e6dfb0e4eeef
dispatch: add fail-* family of hooks
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
29114
diff
changeset
|
735 hook.hook(lui, repo, "post-%s" % cmd, False, args=" ".join(fullargs), |
e6dfb0e4eeef
dispatch: add fail-* family of hooks
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
29114
diff
changeset
|
736 result=ret, pats=cmdpats, opts=cmdoptions) |
e6dfb0e4eeef
dispatch: add fail-* family of hooks
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
29114
diff
changeset
|
737 except Exception: |
e6dfb0e4eeef
dispatch: add fail-* family of hooks
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
29114
diff
changeset
|
738 # run failure hook and re-raise |
e6dfb0e4eeef
dispatch: add fail-* family of hooks
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
29114
diff
changeset
|
739 hook.hook(lui, repo, "fail-%s" % cmd, False, args=" ".join(fullargs), |
e6dfb0e4eeef
dispatch: add fail-* family of hooks
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
29114
diff
changeset
|
740 pats=cmdpats, opts=cmdoptions) |
e6dfb0e4eeef
dispatch: add fail-* family of hooks
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
29114
diff
changeset
|
741 raise |
7819
14b703252f14
dispatch: extract command execution block into method
Bill Barry <after.fallout@gmail.com>
parents:
7772
diff
changeset
|
742 return ret |
14b703252f14
dispatch: extract command execution block into method
Bill Barry <after.fallout@gmail.com>
parents:
7772
diff
changeset
|
743 |
28263
59509c6724c7
dispatch: add wd parameter to _getlocal
Jun Wu <quark@fb.com>
parents:
28081
diff
changeset
|
744 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
|
745 """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
|
746 |
12536
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
747 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
|
748 """ |
28263
59509c6724c7
dispatch: add wd parameter to _getlocal
Jun Wu <quark@fb.com>
parents:
28081
diff
changeset
|
749 if wd is None: |
59509c6724c7
dispatch: add wd parameter to _getlocal
Jun Wu <quark@fb.com>
parents:
28081
diff
changeset
|
750 try: |
30500
fc0cfe6c87d7
py3: add os.getcwdb() to have bytes path
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30485
diff
changeset
|
751 wd = pycompat.getcwd() |
28263
59509c6724c7
dispatch: add wd parameter to _getlocal
Jun Wu <quark@fb.com>
parents:
28081
diff
changeset
|
752 except OSError as e: |
59509c6724c7
dispatch: add wd parameter to _getlocal
Jun Wu <quark@fb.com>
parents:
28081
diff
changeset
|
753 raise error.Abort(_("error getting current working directory: %s") % |
34022
d5b2beca16c0
python3: wrap all uses of <exception>.strerror with strtolocal
Augie Fackler <raf@durin42.com>
parents:
33620
diff
changeset
|
754 encoding.strtolocal(e.strerror)) |
11675
f92f8921a5cc
dispatch: give better error message when cwd doesn't exist (issue2293)
Mads Kiilerich <mads@kiilerich.com>
parents:
11600
diff
changeset
|
755 path = cmdutil.findrepo(wd) or "" |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
756 if not path: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
757 lui = ui |
9436 | 758 else: |
12636
c24215aa7e69
dispatch: remove superfluous try/except when reading local ui config
Brodie Rao <brodie@bitheap.org>
parents:
12633
diff
changeset
|
759 lui = ui.copy() |
12637
42ca7aef28d3
dispatch: properly handle relative path aliases used with -R (issue2376)
Brodie Rao <brodie@bitheap.org>
parents:
12636
diff
changeset
|
760 lui.readconfig(os.path.join(path, ".hg", "hgrc"), path) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
761 |
14860
67add0f24f83
dispatch: fix checking of rpath in _getlocal
Matt Mackall <mpm@selenic.com>
parents:
14761
diff
changeset
|
762 if rpath and rpath[-1]: |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
763 path = lui.expandpath(rpath[-1]) |
8190
9b8ac5fb7760
ui: kill most users of parentui name and arg, replace with .copy()
Matt Mackall <mpm@selenic.com>
parents:
8144
diff
changeset
|
764 lui = ui.copy() |
12637
42ca7aef28d3
dispatch: properly handle relative path aliases used with -R (issue2376)
Brodie Rao <brodie@bitheap.org>
parents:
12636
diff
changeset
|
765 lui.readconfig(os.path.join(path, ".hg", "hgrc"), path) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
766 |
12536
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
767 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
|
768 |
29132
12769703d4ba
dispatch: always load extensions before running shell aliases (issue5230)
Jun Wu <quark@fb.com>
parents:
29129
diff
changeset
|
769 def _checkshellalias(lui, ui, args): |
12769703d4ba
dispatch: always load extensions before running shell aliases (issue5230)
Jun Wu <quark@fb.com>
parents:
29129
diff
changeset
|
770 """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
|
771 options = {} |
12748
d10369fefd01
alias: fail gracefully when invalid global options are given (issue2442)
Steve Losh <steve@stevelosh.com>
parents:
12637
diff
changeset
|
772 |
d10369fefd01
alias: fail gracefully when invalid global options are given (issue2442)
Steve Losh <steve@stevelosh.com>
parents:
12637
diff
changeset
|
773 try: |
d10369fefd01
alias: fail gracefully when invalid global options are given (issue2442)
Steve Losh <steve@stevelosh.com>
parents:
12637
diff
changeset
|
774 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
|
775 except getopt.GetoptError: |
12748
d10369fefd01
alias: fail gracefully when invalid global options are given (issue2442)
Steve Losh <steve@stevelosh.com>
parents:
12637
diff
changeset
|
776 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
|
777 |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
778 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
|
779 return |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
780 |
29132
12769703d4ba
dispatch: always load extensions before running shell aliases (issue5230)
Jun Wu <quark@fb.com>
parents:
29129
diff
changeset
|
781 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
|
782 |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
783 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
|
784 try: |
29132
12769703d4ba
dispatch: always load extensions before running shell aliases (issue5230)
Jun Wu <quark@fb.com>
parents:
29129
diff
changeset
|
785 strict = ui.configbool("ui", "strict") |
22377
f98abe3146b2
dispatch: check shell alias again after loading extensions (issue4355)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22376
diff
changeset
|
786 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
|
787 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
|
788 return |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
789 |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
790 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
|
791 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
|
792 |
14950
144e97421f6b
dispatch: use safehasattr instead of hasattr
Augie Fackler <durin42@gmail.com>
parents:
14918
diff
changeset
|
793 if cmd and util.safehasattr(fn, 'shell'): |
12536
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
794 d = lambda: fn(ui, *args[1:]) |
16683 | 795 return lambda: runcommand(lui, None, cmd, args[:1], ui, options, d, |
796 [], {}) | |
12536
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
797 |
14439
80c599eee3f3
dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents:
14438
diff
changeset
|
798 def _dispatch(req): |
14438
08bfec2ef031
dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents:
14286
diff
changeset
|
799 args = req.args |
14439
80c599eee3f3
dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents:
14438
diff
changeset
|
800 ui = req.ui |
80c599eee3f3
dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents:
14438
diff
changeset
|
801 |
12536
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
802 # check for cwd |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
803 cwd = _earlygetopt(['--cwd'], args) |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
804 if cwd: |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
805 os.chdir(cwd[-1]) |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
806 |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
807 rpath = _earlygetopt(["-R", "--repository", "--repo"], args) |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
808 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
|
809 |
32291
bd872f64a8ba
cleanup: use set literals
Martin von Zweigbergk <martinvonz@google.com>
parents:
32158
diff
changeset
|
810 uis = {ui, lui} |
30933
69a3c6c8bf95
dispatch: move detection of profiling earlier during startup
Bryan O'Sullivan <bryano@fb.com>
parents:
30917
diff
changeset
|
811 |
69a3c6c8bf95
dispatch: move detection of profiling earlier during startup
Bryan O'Sullivan <bryano@fb.com>
parents:
30917
diff
changeset
|
812 if req.repo: |
69a3c6c8bf95
dispatch: move detection of profiling earlier during startup
Bryan O'Sullivan <bryano@fb.com>
parents:
30917
diff
changeset
|
813 uis.add(req.repo.ui) |
69a3c6c8bf95
dispatch: move detection of profiling earlier during startup
Bryan O'Sullivan <bryano@fb.com>
parents:
30917
diff
changeset
|
814 |
35028
7f8f9f0369ca
dispatch: extract stub function to peek boolean command option
Yuya Nishihara <yuya@tcha.org>
parents:
35027
diff
changeset
|
815 if _earlyreqoptbool(req, 'profile', ['--profile']): |
30933
69a3c6c8bf95
dispatch: move detection of profiling earlier during startup
Bryan O'Sullivan <bryano@fb.com>
parents:
30917
diff
changeset
|
816 for ui_ in uis: |
69a3c6c8bf95
dispatch: move detection of profiling earlier during startup
Bryan O'Sullivan <bryano@fb.com>
parents:
30917
diff
changeset
|
817 ui_.setconfig('profiling', 'enabled', 'true', '--profile') |
69a3c6c8bf95
dispatch: move detection of profiling earlier during startup
Bryan O'Sullivan <bryano@fb.com>
parents:
30917
diff
changeset
|
818 |
32788
eede022fc142
profile: drop maybeprofile
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32787
diff
changeset
|
819 profile = lui.configbool('profiling', 'enabled') |
eede022fc142
profile: drop maybeprofile
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32787
diff
changeset
|
820 with profiling.profile(lui, enabled=profile) as profiler: |
30934
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
821 # 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
|
822 # reposetup |
30934
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
823 extensions.loadall(lui) |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
824 # Propagate any changes to lui.__class__ by extensions |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
825 ui.__class__ = lui.__class__ |
5828
863e237b58fb
dispatch: allow extensions to provide setup code
Kirill Smelkov <kirr@mns.spb.ru>
parents:
5664
diff
changeset
|
826 |
30934
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
827 # (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
|
828 |
30934
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
829 # (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
|
830 |
30934
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
831 addaliases(lui, commands.table) |
8655 | 832 |
30934
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
833 # All aliases and commands are completely defined, now. |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
834 # Check abbreviation/ambiguity of shell alias. |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
835 shellaliasfn = _checkshellalias(lui, ui, args) |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
836 if shellaliasfn: |
30006
b19c2679289c
dispatch: make hg --profile wrap reposetup
Arun Kulshreshtha <kulshrax@fb.com>
parents:
30005
diff
changeset
|
837 return shellaliasfn() |
22377
f98abe3146b2
dispatch: check shell alias again after loading extensions (issue4355)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22376
diff
changeset
|
838 |
30934
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
839 # check for fallback encoding |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
840 fallback = lui.config('ui', 'fallbackencoding') |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
841 if fallback: |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
842 encoding.fallbackencoding = fallback |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
843 |
30934
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
844 fullargs = args |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
845 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
|
846 |
30934
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
847 if options["config"]: |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
848 raise error.Abort(_("option --config may not be abbreviated!")) |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
849 if options["cwd"]: |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
850 raise error.Abort(_("option --cwd may not be abbreviated!")) |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
851 if options["repository"]: |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
852 raise error.Abort(_( |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
853 "option -R has to be separated from other options (e.g. not " |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
854 "-qR) and --repository may only be abbreviated as --repo!")) |
35030
d9aba3730d30
dispatch: abort if early boolean options can't be parsed
Yuya Nishihara <yuya@tcha.org>
parents:
35029
diff
changeset
|
855 if options["debugger"] != req.earlyoptions["debugger"]: |
d9aba3730d30
dispatch: abort if early boolean options can't be parsed
Yuya Nishihara <yuya@tcha.org>
parents:
35029
diff
changeset
|
856 raise error.Abort(_("option --debugger may not be abbreviated!")) |
d9aba3730d30
dispatch: abort if early boolean options can't be parsed
Yuya Nishihara <yuya@tcha.org>
parents:
35029
diff
changeset
|
857 # 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
|
858 |
30934
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
859 if options["encoding"]: |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
860 encoding.encoding = options["encoding"] |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
861 if options["encodingmode"]: |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
862 encoding.encodingmode = options["encodingmode"] |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
863 if options["time"]: |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
864 def get_times(): |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
865 t = os.times() |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
866 if t[4] == 0.0: |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
867 # Windows leaves this as zero, so use time.clock() |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
868 t = (t[0], t[1], t[2], t[3], time.clock()) |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
869 return t |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
870 s = get_times() |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
871 def print_time(): |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
872 t = get_times() |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
873 ui.warn( |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
874 _("time: real %.3f secs (user %.3f+%.3f sys %.3f+%.3f)\n") % |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
875 (t[4]-s[4], t[0]-s[0], t[2]-s[2], t[1]-s[1], t[3]-s[3])) |
31958
de5c9d0e02ea
atexit: switch to home-grown implementation
Bryan O'Sullivan <bryano@fb.com>
parents:
31956
diff
changeset
|
876 ui.atexit(print_time) |
32787
545f69cd6042
profile: support --profile in alias and abbreviated version (--prof)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32687
diff
changeset
|
877 if options["profile"]: |
545f69cd6042
profile: support --profile in alias and abbreviated version (--prof)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32687
diff
changeset
|
878 profiler.start() |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
879 |
30934
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
880 if options['verbose'] or options['debug'] or options['quiet']: |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
881 for opt in ('verbose', 'debug', 'quiet'): |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
882 val = str(bool(options[opt])) |
31305
dc9842a7017c
dispatch: enforce bytes when converting boolean flags to config items
Augie Fackler <raf@durin42.com>
parents:
31266
diff
changeset
|
883 if pycompat.ispy3: |
dc9842a7017c
dispatch: enforce bytes when converting boolean flags to config items
Augie Fackler <raf@durin42.com>
parents:
31266
diff
changeset
|
884 val = val.encode('ascii') |
30934
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
885 for ui_ in uis: |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
886 ui_.setconfig('ui', opt, val, '--' + opt) |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
887 |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
888 if options['traceback']: |
14752
99ace3cb7352
dispatch: set global options on the request repo.ui
Idan Kamara <idankk86@gmail.com>
parents:
14748
diff
changeset
|
889 for ui_ in uis: |
30934
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
890 ui_.setconfig('ui', 'traceback', 'on', '--traceback') |
14992
188936b334b1
dispatch: make sure global options on the command line take precedence
Idan Kamara <idankk86@gmail.com>
parents:
14914
diff
changeset
|
891 |
30934
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
892 if options['noninteractive']: |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
893 for ui_ in uis: |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
894 ui_.setconfig('ui', 'interactive', 'off', '-y') |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
895 |
30934
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
896 if cmdoptions.get('insecure', False): |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
897 for ui_ in uis: |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
898 ui_.insecureconnections = True |
13328
a939f08fae9c
url: add --insecure option to bypass verification of ssl certificates
Yuya Nishihara <yuya@tcha.org>
parents:
12932
diff
changeset
|
899 |
32383
f928d53b687c
dispatch: setup color before pager for correct console information on windows
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
32054
diff
changeset
|
900 # 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
|
901 # might cause incorrect console information |
31110
7fec37746417
color: add a 'ui.color' option to control color behavior
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31105
diff
changeset
|
902 coloropt = options['color'] |
31105
45be7590301d
color: move triggering of the initialisation logic in core
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31060
diff
changeset
|
903 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
|
904 if coloropt: |
7fec37746417
color: add a 'ui.color' option to control color behavior
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31105
diff
changeset
|
905 ui_.setconfig('ui', 'color', coloropt, '--color') |
7fec37746417
color: add a 'ui.color' option to control color behavior
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31105
diff
changeset
|
906 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
|
907 |
32383
f928d53b687c
dispatch: setup color before pager for correct console information on windows
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
32054
diff
changeset
|
908 if util.parsebool(options['pager']): |
33620
cc047a733f69
ui: enable pager always for explicit --pager=on (issue5580)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33499
diff
changeset
|
909 # ui.pager() expects 'internal-always-' prefix in this case |
32383
f928d53b687c
dispatch: setup color before pager for correct console information on windows
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
32054
diff
changeset
|
910 ui.pager('internal-always-' + cmd) |
f928d53b687c
dispatch: setup color before pager for correct console information on windows
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
32054
diff
changeset
|
911 elif options['pager'] != 'auto': |
34638
021607b4ef49
dispatch: when --pager=no is passed, also disable pager on req.repo.ui
Jun Wu <quark@fb.com>
parents:
34533
diff
changeset
|
912 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
|
913 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
|
914 |
30934
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
915 if options['version']: |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
916 return commands.version_(ui) |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
917 if options['help']: |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
918 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
|
919 elif not cmd: |
6d642ecf1a89
dispatch: start profiling earlier
Bryan O'Sullivan <bryano@fb.com>
parents:
30933
diff
changeset
|
920 return commands.help_(ui, 'shortlist') |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
921 |
30005
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
922 repo = None |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
923 cmdpats = args[:] |
30485
acd30a959980
dispatch: stop supporting non-use of @command
Augie Fackler <augie@google.com>
parents:
30473
diff
changeset
|
924 if not func.norepo: |
30005
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
925 # 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
|
926 if not rpath and not cwd: |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
927 repo = req.repo |
14510
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
928 |
30005
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
929 if repo: |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
930 # 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
|
931 repo.ui.fin = ui.fin |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
932 repo.ui.fout = ui.fout |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
933 repo.ui.ferr = ui.ferr |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
934 else: |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
935 try: |
32379
71e735bd8170
dispatch: make request accept additional reposetups
Jun Wu <quark@fb.com>
parents:
32377
diff
changeset
|
936 repo = hg.repository(ui, path=path, |
71e735bd8170
dispatch: make request accept additional reposetups
Jun Wu <quark@fb.com>
parents:
32377
diff
changeset
|
937 presetupfuncs=req.prereposetups) |
30005
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
938 if not repo.local(): |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
939 raise error.Abort(_("repository '%s' is not local") |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
940 % path) |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
941 repo.ui.setconfig("bundle", "mainreporoot", repo.root, |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
942 'repo') |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
943 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
|
944 raise |
30005
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
945 except error.RepoError: |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
946 if rpath and rpath[-1]: # invalid -R path |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
947 raise |
30485
acd30a959980
dispatch: stop supporting non-use of @command
Augie Fackler <augie@google.com>
parents:
30473
diff
changeset
|
948 if not func.optionalrepo: |
acd30a959980
dispatch: stop supporting non-use of @command
Augie Fackler <augie@google.com>
parents:
30473
diff
changeset
|
949 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
|
950 # try to infer -R from command args |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
951 repos = map(cmdutil.findrepo, args) |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
952 guess = repos[0] |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
953 if guess and repos.count(guess) == len(repos): |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
954 req.args = ['--repository', guess] + fullargs |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
955 return _dispatch(req) |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
956 if not path: |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
957 raise error.RepoError(_("no repository found in" |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
958 " '%s' (.hg not found)") |
30519
20a42325fdef
py3: use pycompat.getcwd() instead of os.getcwd()
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30500
diff
changeset
|
959 % pycompat.getcwd()) |
30005
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
960 raise |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
961 if repo: |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
962 ui = repo.ui |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
963 if options['hidden']: |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
964 repo = repo.unfiltered() |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
965 args.insert(0, repo) |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
966 elif rpath: |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
967 ui.warn(_("warning: --repository ignored\n")) |
7388
5751631246de
dispatch: generalize signature checking for extension command wrapping
Matt Mackall <mpm@selenic.com>
parents:
7280
diff
changeset
|
968 |
31492
3c77414a0f9c
dispatch: consolidate formatting of arguments
Augie Fackler <augie@google.com>
parents:
31491
diff
changeset
|
969 msg = _formatargs(fullargs) |
30005
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
970 ui.log("command", '%s\n', msg) |
30586
2d555d753f0e
py3: make keys of keyword arguments strings
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30576
diff
changeset
|
971 strcmdopt = pycompat.strkwargs(cmdoptions) |
2d555d753f0e
py3: make keys of keyword arguments strings
Pulkit Goyal <7895pulkit@gmail.com>
parents:
30576
diff
changeset
|
972 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
|
973 try: |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
974 return runcommand(lui, repo, cmd, fullargs, ui, options, d, |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
975 cmdpats, cmdoptions) |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
976 finally: |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
977 if repo and repo != req.repo: |
dfd97e60044c
dispatch: change indentation level in _dispatch()
Arun Kulshreshtha <kulshrax@fb.com>
parents:
29884
diff
changeset
|
978 repo.close() |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
979 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
980 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
|
981 """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
|
982 try: |
b19c2679289c
dispatch: make hg --profile wrap reposetup
Arun Kulshreshtha <kulshrax@fb.com>
parents:
30005
diff
changeset
|
983 return cmdfunc() |
b19c2679289c
dispatch: make hg --profile wrap reposetup
Arun Kulshreshtha <kulshrax@fb.com>
parents:
30005
diff
changeset
|
984 except error.SignatureError: |
b19c2679289c
dispatch: make hg --profile wrap reposetup
Arun Kulshreshtha <kulshrax@fb.com>
parents:
30005
diff
changeset
|
985 raise error.CommandError(cmd, _('invalid arguments')) |
28784
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
986 |
28821
d3369dc6c1d0
dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents:
28784
diff
changeset
|
987 def _exceptionwarning(ui): |
d3369dc6c1d0
dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents:
28784
diff
changeset
|
988 """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
|
989 |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
990 # 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
|
991 # 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
|
992 # 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
|
993 # 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
|
994 # '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
|
995 # 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
|
996 # version number and try updating. |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
997 ct = util.versiontuple(n=2) |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
998 worst = None, ct, '' |
33499
0407a51b9d8c
codemod: register core configitems using a script
Jun Wu <quark@fb.com>
parents:
33053
diff
changeset
|
999 if ui.config('ui', 'supportcontact') is None: |
28784
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1000 for name, mod in extensions.extensions(): |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1001 testedwith = getattr(mod, 'testedwith', '') |
31179
49ad6bf63107
dispatch: allow testedwith to be bytes or str
Augie Fackler <raf@durin42.com>
parents:
31110
diff
changeset
|
1002 if pycompat.ispy3 and isinstance(testedwith, str): |
49ad6bf63107
dispatch: allow testedwith to be bytes or str
Augie Fackler <raf@durin42.com>
parents:
31110
diff
changeset
|
1003 testedwith = testedwith.encode(u'utf-8') |
28784
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1004 report = getattr(mod, 'buglink', _('the extension author.')) |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1005 if not testedwith.strip(): |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1006 # We found an untested extension. It's likely the culprit. |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1007 worst = name, 'unknown', report |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1008 break |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1009 |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1010 # Never blame on extensions bundled with Mercurial. |
29884
ed793f41e83f
extensions: use ismoduleinternal() thoroughly
Yuya Nishihara <yuya@tcha.org>
parents:
29846
diff
changeset
|
1011 if extensions.ismoduleinternal(mod): |
28784
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1012 continue |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1013 |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1014 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
|
1015 if ct in tested: |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1016 continue |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1017 |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1018 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
|
1019 nearest = max(lower or tested) |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1020 if worst[0] is None or nearest < worst[1]: |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1021 worst = name, nearest, report |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1022 if worst[0] is not None: |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1023 name, testedwith, report = worst |
31179
49ad6bf63107
dispatch: allow testedwith to be bytes or str
Augie Fackler <raf@durin42.com>
parents:
31110
diff
changeset
|
1024 if not isinstance(testedwith, (bytes, str)): |
28784
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1025 testedwith = '.'.join([str(c) for c in testedwith]) |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1026 warning = (_('** Unknown exception encountered with ' |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1027 'possibly-broken third-party extension %s\n' |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1028 '** which supports versions %s of Mercurial.\n' |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1029 '** Please disable %s and try your action again.\n' |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1030 '** If that fixes the bug please report it to %s\n') |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1031 % (name, testedwith, name, report)) |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1032 else: |
33499
0407a51b9d8c
codemod: register core configitems using a script
Jun Wu <quark@fb.com>
parents:
33053
diff
changeset
|
1033 bugtracker = ui.config('ui', 'supportcontact') |
28784
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1034 if bugtracker is None: |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1035 bugtracker = _("https://mercurial-scm.org/wiki/BugTracker") |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1036 warning = (_("** unknown exception encountered, " |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1037 "please report by visiting\n** ") + bugtracker + '\n') |
31180
27e3b66ec7c5
dispatch: cope with sys.version being unicode on Python 3
Augie Fackler <raf@durin42.com>
parents:
31179
diff
changeset
|
1038 if pycompat.ispy3: |
27e3b66ec7c5
dispatch: cope with sys.version being unicode on Python 3
Augie Fackler <raf@durin42.com>
parents:
31179
diff
changeset
|
1039 sysversion = sys.version.encode(u'utf-8') |
27e3b66ec7c5
dispatch: cope with sys.version being unicode on Python 3
Augie Fackler <raf@durin42.com>
parents:
31179
diff
changeset
|
1040 else: |
27e3b66ec7c5
dispatch: cope with sys.version being unicode on Python 3
Augie Fackler <raf@durin42.com>
parents:
31179
diff
changeset
|
1041 sysversion = sys.version |
27e3b66ec7c5
dispatch: cope with sys.version being unicode on Python 3
Augie Fackler <raf@durin42.com>
parents:
31179
diff
changeset
|
1042 sysversion = sysversion.replace('\n', '') |
27e3b66ec7c5
dispatch: cope with sys.version being unicode on Python 3
Augie Fackler <raf@durin42.com>
parents:
31179
diff
changeset
|
1043 warning += ((_("** Python %s\n") % sysversion) + |
28784
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1044 (_("** Mercurial Distributed SCM (version %s)\n") % |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1045 util.version()) + |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1046 (_("** Extensions loaded: %s\n") % |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1047 ", ".join([x[0] for x in extensions.extensions()]))) |
28821
d3369dc6c1d0
dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents:
28784
diff
changeset
|
1048 return warning |
d3369dc6c1d0
dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents:
28784
diff
changeset
|
1049 |
d3369dc6c1d0
dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents:
28784
diff
changeset
|
1050 def handlecommandexception(ui): |
d3369dc6c1d0
dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents:
28784
diff
changeset
|
1051 """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
|
1052 |
d3369dc6c1d0
dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents:
28784
diff
changeset
|
1053 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
|
1054 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
|
1055 """ |
d3369dc6c1d0
dispatch: split out warning message generation to separate function
Martijn Pieters <mjpieters@fb.com>
parents:
28784
diff
changeset
|
1056 warning = _exceptionwarning(ui) |
28784
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1057 ui.log("commandexception", "%s\n%s\n", warning, traceback.format_exc()) |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1058 ui.warn(warning) |
09750b1231c2
dispatch: factor out command failure handling into a function
Martijn Pieters <mjpieters@fb.com>
parents:
28695
diff
changeset
|
1059 return False # re-raise the exception |