Mercurial > hg
annotate mercurial/dispatch.py @ 28386:1c658391b22f
parsers: optimize filtered headrevs logic
The old native head revs logic would iterate over every node, starting from 0,
and check if every node was filtered (by testing it against the filteredrevs
python set). On large repos with hundreds of thousands of commits, this could
take 150ms.
This new logic iterates over the nodes in reverse order, and skips the filtered
check if we've seen an unfiltered child of the node. This saves approximately a
bagillion filteredrevs set checks, which shaves the time down from 150ms to
20ms during every branch cache write.
author | Durham Goode <durham@fb.com> |
---|---|
date | Tue, 08 Mar 2016 00:20:08 -0800 |
parents | aa73d6a5d9ea |
children | 73905484ef70 |
rev | line source |
---|---|
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
1 # dispatch.py - command dispatching for mercurial |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
2 # |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
3 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com> |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
4 # |
8225
46293a0c7e9f
updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents:
8206
diff
changeset
|
5 # This software may be used and distributed according to the terms of the |
10263 | 6 # GNU General Public License version 2 or any later version. |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
7 |
27615
4030d3b79953
dispatch: use print function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27516
diff
changeset
|
8 from __future__ import absolute_import, print_function |
25932
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
9 |
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
10 import atexit |
24221
4e240d6ab898
dispatch: offer near-edit-distance suggestions for {file,rev}set functions
Augie Fackler <augie@google.com>
parents:
24163
diff
changeset
|
11 import difflib |
25932
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
12 import errno |
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 shlex |
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
17 import signal |
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
18 import socket |
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
19 import sys |
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
20 import time |
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
21 import traceback |
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
22 |
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
23 |
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
24 from .i18n import _ |
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
25 |
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
26 from . import ( |
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
27 cmdutil, |
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
28 commands, |
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
29 demandimport, |
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
30 encoding, |
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
31 error, |
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
32 extensions, |
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
33 fancyopts, |
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, |
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
36 ui as uimod, |
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
37 util, |
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
38 ) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
39 |
14438
08bfec2ef031
dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents:
14286
diff
changeset
|
40 class request(object): |
16683 | 41 def __init__(self, args, ui=None, repo=None, fin=None, fout=None, |
42 ferr=None): | |
14438
08bfec2ef031
dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents:
14286
diff
changeset
|
43 self.args = args |
14439
80c599eee3f3
dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents:
14438
diff
changeset
|
44 self.ui = ui |
14510
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
45 self.repo = repo |
14438
08bfec2ef031
dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents:
14286
diff
changeset
|
46 |
14613
ea8938d3a5aa
dispatch: add I/O descriptors to the request
Idan Kamara <idankk86@gmail.com>
parents:
14601
diff
changeset
|
47 # input/output/error streams |
ea8938d3a5aa
dispatch: add I/O descriptors to the request
Idan Kamara <idankk86@gmail.com>
parents:
14601
diff
changeset
|
48 self.fin = fin |
ea8938d3a5aa
dispatch: add I/O descriptors to the request
Idan Kamara <idankk86@gmail.com>
parents:
14601
diff
changeset
|
49 self.fout = fout |
ea8938d3a5aa
dispatch: add I/O descriptors to the request
Idan Kamara <idankk86@gmail.com>
parents:
14601
diff
changeset
|
50 self.ferr = ferr |
ea8938d3a5aa
dispatch: add I/O descriptors to the request
Idan Kamara <idankk86@gmail.com>
parents:
14601
diff
changeset
|
51 |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
52 def run(): |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
53 "run the command in sys.argv" |
15439
01611e7c36ff
dispatch: exit with 8-bit exit code
Mads Kiilerich <mads@kiilerich.com>
parents:
15233
diff
changeset
|
54 sys.exit((dispatch(request(sys.argv[1:])) or 0) & 255) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
55 |
24221
4e240d6ab898
dispatch: offer near-edit-distance suggestions for {file,rev}set functions
Augie Fackler <augie@google.com>
parents:
24163
diff
changeset
|
56 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
|
57 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
|
58 # 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
|
59 # 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
|
60 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
|
61 |
27623
b3376fba4ab9
dispatch: report similar names consistently
Bryan O'Sullivan <bos@serpentine.com>
parents:
27615
diff
changeset
|
62 def _reportsimilar(write, similar): |
b3376fba4ab9
dispatch: report similar names consistently
Bryan O'Sullivan <bos@serpentine.com>
parents:
27615
diff
changeset
|
63 if len(similar) == 1: |
b3376fba4ab9
dispatch: report similar names consistently
Bryan O'Sullivan <bos@serpentine.com>
parents:
27615
diff
changeset
|
64 write(_("(did you mean %s?)\n") % similar[0]) |
b3376fba4ab9
dispatch: report similar names consistently
Bryan O'Sullivan <bos@serpentine.com>
parents:
27615
diff
changeset
|
65 elif similar: |
b3376fba4ab9
dispatch: report similar names consistently
Bryan O'Sullivan <bos@serpentine.com>
parents:
27615
diff
changeset
|
66 ss = ", ".join(sorted(similar)) |
b3376fba4ab9
dispatch: report similar names consistently
Bryan O'Sullivan <bos@serpentine.com>
parents:
27615
diff
changeset
|
67 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
|
68 |
24039
2ee35b6ee4fb
dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents:
23871
diff
changeset
|
69 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
|
70 similar = [] |
4e240d6ab898
dispatch: offer near-edit-distance suggestions for {file,rev}set functions
Augie Fackler <augie@google.com>
parents:
24163
diff
changeset
|
71 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
|
72 # 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
|
73 similar = _getsimilar(inst.symbols, inst.function) |
24039
2ee35b6ee4fb
dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents:
23871
diff
changeset
|
74 if len(inst.args) > 1: |
2ee35b6ee4fb
dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents:
23871
diff
changeset
|
75 write(_("hg: parse error at %s: %s\n") % |
2ee35b6ee4fb
dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents:
23871
diff
changeset
|
76 (inst.args[1], inst.args[0])) |
2ee35b6ee4fb
dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents:
23871
diff
changeset
|
77 if (inst.args[0][0] == ' '): |
2ee35b6ee4fb
dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents:
23871
diff
changeset
|
78 write(_("unexpected leading whitespace\n")) |
2ee35b6ee4fb
dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents:
23871
diff
changeset
|
79 else: |
2ee35b6ee4fb
dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents:
23871
diff
changeset
|
80 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
|
81 _reportsimilar(write, similar) |
24039
2ee35b6ee4fb
dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents:
23871
diff
changeset
|
82 |
14438
08bfec2ef031
dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents:
14286
diff
changeset
|
83 def dispatch(req): |
08bfec2ef031
dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents:
14286
diff
changeset
|
84 "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
|
85 if req.ferr: |
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
86 ferr = req.ferr |
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
87 elif req.ui: |
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
88 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
|
89 else: |
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
90 ferr = sys.stderr |
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
91 |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
92 try: |
14439
80c599eee3f3
dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents:
14438
diff
changeset
|
93 if not req.ui: |
80c599eee3f3
dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents:
14438
diff
changeset
|
94 req.ui = uimod.ui() |
14438
08bfec2ef031
dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents:
14286
diff
changeset
|
95 if '--traceback' in req.args: |
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
|
96 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
|
97 |
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
98 # 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
|
99 if req.fin: |
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
100 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
|
101 if req.fout: |
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
102 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
|
103 if req.ferr: |
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
104 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
|
105 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
|
106 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
|
107 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
|
108 ferr.write(_("(%s)\n") % inst.hint) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
109 return -1 |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25329
diff
changeset
|
110 except error.ParseError as inst: |
24039
2ee35b6ee4fb
dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents:
23871
diff
changeset
|
111 _formatparse(ferr.write, inst) |
27516
1c1216182dc1
error: make ParseError inherit from HintException
timeless <timeless@mozdev.org>
parents:
27325
diff
changeset
|
112 if inst.hint: |
1c1216182dc1
error: make ParseError inherit from HintException
timeless <timeless@mozdev.org>
parents:
27325
diff
changeset
|
113 ferr.write(_("(%s)\n") % inst.hint) |
9470
ba75830d17a9
dispatch: catch ConfigError while constructing ui
Martin Geisler <mg@lazybytes.net>
parents:
8936
diff
changeset
|
114 return -1 |
14615
9fba795dd030
dispatch: assign I/O descriptors from the request to the ui
Idan Kamara <idankk86@gmail.com>
parents:
14613
diff
changeset
|
115 |
19229
41e39a0299cb
blackbox: fix recording exit codes (issue3938)
Durham Goode <durham@fb.com>
parents:
19099
diff
changeset
|
116 msg = ' '.join(' ' in a and repr(a) or a for a in req.args) |
41e39a0299cb
blackbox: fix recording exit codes (issue3938)
Durham Goode <durham@fb.com>
parents:
19099
diff
changeset
|
117 starttime = time.time() |
41e39a0299cb
blackbox: fix recording exit codes (issue3938)
Durham Goode <durham@fb.com>
parents:
19099
diff
changeset
|
118 ret = None |
41e39a0299cb
blackbox: fix recording exit codes (issue3938)
Durham Goode <durham@fb.com>
parents:
19099
diff
changeset
|
119 try: |
41e39a0299cb
blackbox: fix recording exit codes (issue3938)
Durham Goode <durham@fb.com>
parents:
19099
diff
changeset
|
120 ret = _runcatch(req) |
41e39a0299cb
blackbox: fix recording exit codes (issue3938)
Durham Goode <durham@fb.com>
parents:
19099
diff
changeset
|
121 return ret |
41e39a0299cb
blackbox: fix recording exit codes (issue3938)
Durham Goode <durham@fb.com>
parents:
19099
diff
changeset
|
122 finally: |
41e39a0299cb
blackbox: fix recording exit codes (issue3938)
Durham Goode <durham@fb.com>
parents:
19099
diff
changeset
|
123 duration = time.time() - starttime |
41e39a0299cb
blackbox: fix recording exit codes (issue3938)
Durham Goode <durham@fb.com>
parents:
19099
diff
changeset
|
124 req.ui.log("commandfinish", "%s exited %s after %0.2f seconds\n", |
41e39a0299cb
blackbox: fix recording exit codes (issue3938)
Durham Goode <durham@fb.com>
parents:
19099
diff
changeset
|
125 msg, ret or 0, duration) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
126 |
14439
80c599eee3f3
dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents:
14438
diff
changeset
|
127 def _runcatch(req): |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
128 def catchterm(*args): |
7644
182b7114d35a
error: move SignalInterrupt
Matt Mackall <mpm@selenic.com>
parents:
7643
diff
changeset
|
129 raise error.SignalInterrupt |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
130 |
14439
80c599eee3f3
dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents:
14438
diff
changeset
|
131 ui = req.ui |
10952
6c2c766afefe
dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents:
10793
diff
changeset
|
132 try: |
6c2c766afefe
dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents:
10793
diff
changeset
|
133 for name in 'SIGBREAK', 'SIGHUP', 'SIGTERM': |
6c2c766afefe
dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents:
10793
diff
changeset
|
134 num = getattr(signal, name, None) |
6c2c766afefe
dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents:
10793
diff
changeset
|
135 if num: |
6c2c766afefe
dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents:
10793
diff
changeset
|
136 signal.signal(num, catchterm) |
6c2c766afefe
dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents:
10793
diff
changeset
|
137 except ValueError: |
6c2c766afefe
dispatch: ignore if signals can not be set
Simon Heimberg <simohe@besonet.ch>
parents:
10793
diff
changeset
|
138 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
|
139 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
140 try: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
141 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
|
142 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
|
143 debugtrace = { |
472fa3b782b1
dispatch: add ability to specify a custom pdb module as a debugger
Sean Farley <sean.michael.farley@gmail.com>
parents:
19639
diff
changeset
|
144 'pdb' : pdb.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
|
145 } |
472fa3b782b1
dispatch: add ability to specify a custom pdb module as a debugger
Sean Farley <sean.michael.farley@gmail.com>
parents:
19639
diff
changeset
|
146 debugmortem = { |
472fa3b782b1
dispatch: add ability to specify a custom pdb module as a debugger
Sean Farley <sean.michael.farley@gmail.com>
parents:
19639
diff
changeset
|
147 'pdb' : pdb.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
|
148 } |
19639
09573ad59f7b
dispatch: move command line --config argument parsing to _runcatch()
Sean Farley <sean.michael.farley@gmail.com>
parents:
19229
diff
changeset
|
149 |
09573ad59f7b
dispatch: move command line --config argument parsing to _runcatch()
Sean Farley <sean.michael.farley@gmail.com>
parents:
19229
diff
changeset
|
150 # 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
|
151 # (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
|
152 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
|
153 |
09573ad59f7b
dispatch: move command line --config argument parsing to _runcatch()
Sean Farley <sean.michael.farley@gmail.com>
parents:
19229
diff
changeset
|
154 if req.repo: |
09573ad59f7b
dispatch: move command line --config argument parsing to _runcatch()
Sean Farley <sean.michael.farley@gmail.com>
parents:
19229
diff
changeset
|
155 # 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
|
156 # the repo ui |
20796
131f7fe06e9e
check-code: check for argument passing py2.6ism
Matt Mackall <mpm@selenic.com>
parents:
20788
diff
changeset
|
157 for sec, name, val in cfgs: |
131f7fe06e9e
check-code: check for argument passing py2.6ism
Matt Mackall <mpm@selenic.com>
parents:
20788
diff
changeset
|
158 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
|
159 |
25833
8243e999f22b
debugger: mark developer-only option
Matt Mackall <mpm@selenic.com>
parents:
25660
diff
changeset
|
160 # 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
|
161 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
|
162 debugmod = pdb |
20122
8f4a226c840c
dispatch: turn off custom debugger for HGPLAIN mode
Sean Farley <sean.michael.farley@gmail.com>
parents:
19640
diff
changeset
|
163 if not debugger or ui.plain(): |
25833
8243e999f22b
debugger: mark developer-only option
Matt Mackall <mpm@selenic.com>
parents:
25660
diff
changeset
|
164 # 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
|
165 debugger = 'pdb' |
20826
dd2e25e49862
dispatch: only do __import__(debugger) when a debugger is requested
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
20330
diff
changeset
|
166 elif '--debugger' in req.args: |
dd2e25e49862
dispatch: only do __import__(debugger) when a debugger is requested
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
20330
diff
changeset
|
167 # 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
|
168 # 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
|
169 # debugging has been requested |
25329
101e84121c13
dispatch: disable demandimport for the --debugger option
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
25277
diff
changeset
|
170 with demandimport.deactivated(): |
101e84121c13
dispatch: disable demandimport for the --debugger option
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
25277
diff
changeset
|
171 try: |
101e84121c13
dispatch: disable demandimport for the --debugger option
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
25277
diff
changeset
|
172 debugmod = __import__(debugger) |
101e84121c13
dispatch: disable demandimport for the --debugger option
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
25277
diff
changeset
|
173 except ImportError: |
101e84121c13
dispatch: disable demandimport for the --debugger option
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
25277
diff
changeset
|
174 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
|
175 |
472fa3b782b1
dispatch: add ability to specify a custom pdb module as a debugger
Sean Farley <sean.michael.farley@gmail.com>
parents:
19639
diff
changeset
|
176 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
|
177 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
|
178 |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
179 # enter the debugger before command execution |
14438
08bfec2ef031
dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents:
14286
diff
changeset
|
180 if '--debugger' in req.args: |
11495
6ee107782018
debugger: give a little intro before entering pdb
Mads Kiilerich <mads@kiilerich.com>
parents:
11494
diff
changeset
|
181 ui.warn(_("entering debugger - " |
6ee107782018
debugger: give a little intro before entering pdb
Mads Kiilerich <mads@kiilerich.com>
parents:
11494
diff
changeset
|
182 "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
|
183 |
472fa3b782b1
dispatch: add ability to specify a custom pdb module as a debugger
Sean Farley <sean.michael.farley@gmail.com>
parents:
19639
diff
changeset
|
184 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
|
185 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
|
186 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
|
187 "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
|
188 with demandimport.deactivated(): |
26216
e86d12404d69
dispatch: disable demandimport when invoking the debugger
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
26191
diff
changeset
|
189 debugtrace[debugger]() |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
190 try: |
14439
80c599eee3f3
dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents:
14438
diff
changeset
|
191 return _dispatch(req) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
192 finally: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
193 ui.flush() |
16705
c2d9ef43ff6c
check-code: ignore naked excepts with a "re-raise" comment
Brodie Rao <brodie@sf.io>
parents:
16686
diff
changeset
|
194 except: # re-raises |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
195 # enter the debugger when we hit an exception |
14438
08bfec2ef031
dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents:
14286
diff
changeset
|
196 if '--debugger' in req.args: |
11494
2347513f562a
debugger: show traceback before entering pdb post-mortem
Mads Kiilerich <mads@kiilerich.com>
parents:
11330
diff
changeset
|
197 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
|
198 debugmortem[debugger](sys.exc_info()[2]) |
8206
cce63ef1045b
ui: print_exc() -> traceback()
Matt Mackall <mpm@selenic.com>
parents:
8190
diff
changeset
|
199 ui.traceback() |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
200 raise |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
201 |
7645
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
202 # Global exception handling, alphabetically |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
203 # Mercurial-specific first, followed by built-in and library exceptions |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25329
diff
changeset
|
204 except error.AmbiguousCommand as inst: |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
205 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
|
206 (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
|
207 except error.ParseError as inst: |
24039
2ee35b6ee4fb
dispatch: consolidate formatting of ParseErrors
Augie Fackler <augie@google.com>
parents:
23871
diff
changeset
|
208 _formatparse(ui.warn, inst) |
27516
1c1216182dc1
error: make ParseError inherit from HintException
timeless <timeless@mozdev.org>
parents:
27325
diff
changeset
|
209 if inst.hint: |
1c1216182dc1
error: make ParseError inherit from HintException
timeless <timeless@mozdev.org>
parents:
27325
diff
changeset
|
210 ui.warn(_("(%s)\n") % inst.hint) |
11288
2123aad24d56
error: add new ParseError for various parsing errors
Matt Mackall <mpm@selenic.com>
parents:
11287
diff
changeset
|
211 return -1 |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25329
diff
changeset
|
212 except error.LockHeld as inst: |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
213 if inst.errno == errno.ETIMEDOUT: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
214 reason = _('timed out waiting for lock held by %s') % inst.locker |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
215 else: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
216 reason = _('lock held by %s') % inst.locker |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
217 ui.warn(_("abort: %s: %s\n") % (inst.desc or inst.filename, reason)) |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25329
diff
changeset
|
218 except error.LockUnavailable as inst: |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
219 ui.warn(_("abort: could not lock %s: %s\n") % |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
220 (inst.desc or inst.filename, inst.strerror)) |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25329
diff
changeset
|
221 except error.CommandError as inst: |
7645
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
222 if inst.args[0]: |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
223 ui.warn(_("hg %s: %s\n") % (inst.args[0], inst.args[1])) |
14286
005a540e9aee
help: add -c/--command flag to only show command help (issue2799)
Martin Geisler <mg@aragost.com>
parents:
14265
diff
changeset
|
224 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
|
225 else: |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
226 ui.warn(_("hg: %s\n") % inst.args[1]) |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
227 commands.help_(ui, 'shortlist') |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25329
diff
changeset
|
228 except error.OutOfBandError as inst: |
25242
8de7d1d937b3
error: allow a 'hint' to OutOfBandError
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25187
diff
changeset
|
229 if inst.args: |
8de7d1d937b3
error: allow a 'hint' to OutOfBandError
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25187
diff
changeset
|
230 msg = _("abort: remote error:\n") |
8de7d1d937b3
error: allow a 'hint' to OutOfBandError
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25187
diff
changeset
|
231 else: |
8de7d1d937b3
error: allow a 'hint' to OutOfBandError
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25187
diff
changeset
|
232 msg = _("abort: remote error\n") |
8de7d1d937b3
error: allow a 'hint' to OutOfBandError
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25187
diff
changeset
|
233 ui.warn(msg) |
8de7d1d937b3
error: allow a 'hint' to OutOfBandError
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25187
diff
changeset
|
234 if inst.args: |
8de7d1d937b3
error: allow a 'hint' to OutOfBandError
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25187
diff
changeset
|
235 ui.warn(''.join(inst.args)) |
8de7d1d937b3
error: allow a 'hint' to OutOfBandError
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25187
diff
changeset
|
236 if inst.hint: |
8de7d1d937b3
error: allow a 'hint' to OutOfBandError
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25187
diff
changeset
|
237 ui.warn('(%s)\n' % inst.hint) |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25329
diff
changeset
|
238 except error.RepoError as inst: |
7645
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
239 ui.warn(_("abort: %s!\n") % inst) |
14761
1a9256cdf10f
error: Add a hint argument to RepoError
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
14754
diff
changeset
|
240 if inst.hint: |
1a9256cdf10f
error: Add a hint argument to RepoError
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
14754
diff
changeset
|
241 ui.warn(_("(%s)\n") % inst.hint) |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25329
diff
changeset
|
242 except error.ResponseError as inst: |
7645
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
243 ui.warn(_("abort: %s") % inst.args[0]) |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
244 if not isinstance(inst.args[1], basestring): |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
245 ui.warn(" %r\n" % (inst.args[1],)) |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
246 elif not inst.args[1]: |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
247 ui.warn(_(" empty string\n")) |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
248 else: |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
249 ui.warn("\n%r\n" % util.ellipsis(inst.args[1])) |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25329
diff
changeset
|
250 except error.CensoredNodeError as inst: |
22595
244478687edd
error: add CensoredNodeError, will be thrown when content deliberately erased
Mike Edgar <adgar@google.com>
parents:
22378
diff
changeset
|
251 ui.warn(_("abort: file censored %s!\n") % inst) |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25329
diff
changeset
|
252 except error.RevlogError as inst: |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
253 ui.warn(_("abort: %s!\n") % inst) |
7644
182b7114d35a
error: move SignalInterrupt
Matt Mackall <mpm@selenic.com>
parents:
7643
diff
changeset
|
254 except error.SignalInterrupt: |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
255 ui.warn(_("killed!\n")) |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25329
diff
changeset
|
256 except error.UnknownCommand as inst: |
7645
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
257 ui.warn(_("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
|
258 try: |
de1e7099d100
dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents:
10282
diff
changeset
|
259 # 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
|
260 # (but don't check for extensions themselves) |
de1e7099d100
dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents:
10282
diff
changeset
|
261 commands.help_(ui, inst.args[0], unknowncmd=True) |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26421
diff
changeset
|
262 except (error.UnknownCommand, error.Abort): |
24222
02d7b5cd373b
dispatch: offer suggestions of similar-named commands
Augie Fackler <augie@google.com>
parents:
24221
diff
changeset
|
263 suggested = False |
02d7b5cd373b
dispatch: offer suggestions of similar-named commands
Augie Fackler <augie@google.com>
parents:
24221
diff
changeset
|
264 if len(inst.args) == 2: |
02d7b5cd373b
dispatch: offer suggestions of similar-named commands
Augie Fackler <augie@google.com>
parents:
24221
diff
changeset
|
265 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
|
266 if sim: |
27623
b3376fba4ab9
dispatch: report similar names consistently
Bryan O'Sullivan <bos@serpentine.com>
parents:
27615
diff
changeset
|
267 _reportsimilar(ui.warn, sim) |
24222
02d7b5cd373b
dispatch: offer suggestions of similar-named commands
Augie Fackler <augie@google.com>
parents:
24221
diff
changeset
|
268 suggested = True |
02d7b5cd373b
dispatch: offer suggestions of similar-named commands
Augie Fackler <augie@google.com>
parents:
24221
diff
changeset
|
269 if not suggested: |
02d7b5cd373b
dispatch: offer suggestions of similar-named commands
Augie Fackler <augie@google.com>
parents:
24221
diff
changeset
|
270 commands.help_(ui, 'shortlist') |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25329
diff
changeset
|
271 except error.InterventionRequired as inst: |
18932
7b4b9e8ea12e
dispatch: catch InterventionRequired and print the message with no prefix
Augie Fackler <raf@durin42.com>
parents:
18758
diff
changeset
|
272 ui.warn("%s\n" % inst) |
27628
707d66afce21
error: make InterventionRequired take a hint
timeless <timeless@mozdev.org>
parents:
27623
diff
changeset
|
273 if inst.hint: |
707d66afce21
error: make InterventionRequired take a hint
timeless <timeless@mozdev.org>
parents:
27623
diff
changeset
|
274 ui.warn(_("(%s)\n") % inst.hint) |
18935
e5d9441ec281
dispatch: exit with status 1 for an InterventionRequired exception (bc)
Augie Fackler <raf@durin42.com>
parents:
18932
diff
changeset
|
275 return 1 |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26421
diff
changeset
|
276 except error.Abort as inst: |
7645
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
277 ui.warn(_("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
|
278 if inst.hint: |
11683
757f39fa1162
dispatch: write Abort hint to stderr too
Patrick Mezard <pmezard@gmail.com>
parents:
11601
diff
changeset
|
279 ui.warn(_("(%s)\n") % inst.hint) |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25329
diff
changeset
|
280 except ImportError as inst: |
11053
59d0d715fbfa
dispatch: don't mangle ImportError abort messages
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
10952
diff
changeset
|
281 ui.warn(_("abort: %s!\n") % inst) |
7645
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
282 m = str(inst).split()[-1] |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
283 if m in "mpatch bdiff".split(): |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
284 ui.warn(_("(did you forget to compile extensions?)\n")) |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
285 elif m in "zlib".split(): |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
286 ui.warn(_("(is your Python install correct?)\n")) |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25329
diff
changeset
|
287 except IOError as inst: |
14950
144e97421f6b
dispatch: use safehasattr instead of hasattr
Augie Fackler <durin42@gmail.com>
parents:
14918
diff
changeset
|
288 if util.safehasattr(inst, "code"): |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
289 ui.warn(_("abort: %s\n") % inst) |
14950
144e97421f6b
dispatch: use safehasattr instead of hasattr
Augie Fackler <durin42@gmail.com>
parents:
14918
diff
changeset
|
290 elif util.safehasattr(inst, "reason"): |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
291 try: # usually it is in the form (errno, strerror) |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
292 reason = inst.reason.args[1] |
14096
dea93484cf9f
dispatch: handle IndexErrors
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
14004
diff
changeset
|
293 except (AttributeError, IndexError): |
17299
e51d4aedace9
check-code: indent 4 spaces in py files
Mads Kiilerich <mads@kiilerich.com>
parents:
17228
diff
changeset
|
294 # it might be anything, for example a string |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
295 reason = inst.reason |
24152
97a548aeb749
dispatch: work around UnicodeDecodeError caused by SSLError of Python 2.7.9
Yuya Nishihara <yuya@tcha.org>
parents:
23871
diff
changeset
|
296 if isinstance(reason, unicode): |
97a548aeb749
dispatch: work around UnicodeDecodeError caused by SSLError of Python 2.7.9
Yuya Nishihara <yuya@tcha.org>
parents:
23871
diff
changeset
|
297 # SSLError of Python 2.7.9 contains a unicode |
97a548aeb749
dispatch: work around UnicodeDecodeError caused by SSLError of Python 2.7.9
Yuya Nishihara <yuya@tcha.org>
parents:
23871
diff
changeset
|
298 reason = reason.encode(encoding.encoding, 'replace') |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
299 ui.warn(_("abort: error: %s\n") % reason) |
21824
57c70d3ad1c9
dispatch: handle empty IOError args
Matt Mackall <mpm@selenic.com>
parents:
21572
diff
changeset
|
300 elif (util.safehasattr(inst, "args") |
57c70d3ad1c9
dispatch: handle empty IOError args
Matt Mackall <mpm@selenic.com>
parents:
21572
diff
changeset
|
301 and inst.args and inst.args[0] == errno.EPIPE): |
26350
ccab61d84ea7
dispatch: stop warning about EPIPE in --debug mode
Daniel Colascione <dancol@fb.com>
parents:
26263
diff
changeset
|
302 pass |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
303 elif getattr(inst, "strerror", None): |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
304 if getattr(inst, "filename", None): |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
305 ui.warn(_("abort: %s: %s\n") % (inst.strerror, inst.filename)) |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
306 else: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
307 ui.warn(_("abort: %s\n") % inst.strerror) |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
308 else: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
309 raise |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25329
diff
changeset
|
310 except OSError as inst: |
18227
720308f741cb
dispatch: show empty filename in OSError aborts
Mads Kiilerich <mads@kiilerich.com>
parents:
18224
diff
changeset
|
311 if getattr(inst, "filename", None) is not None: |
720308f741cb
dispatch: show empty filename in OSError aborts
Mads Kiilerich <mads@kiilerich.com>
parents:
18224
diff
changeset
|
312 ui.warn(_("abort: %s: '%s'\n") % (inst.strerror, inst.filename)) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
313 else: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
314 ui.warn(_("abort: %s\n") % inst.strerror) |
7645
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
315 except KeyboardInterrupt: |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
316 try: |
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
317 ui.warn(_("interrupted!\n")) |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25329
diff
changeset
|
318 except IOError as inst: |
26350
ccab61d84ea7
dispatch: stop warning about EPIPE in --debug mode
Daniel Colascione <dancol@fb.com>
parents:
26263
diff
changeset
|
319 if inst.errno != errno.EPIPE: |
7645
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
320 raise |
5633
e04a65111a80
dispatch: report OOM rather than traceback
Matt Mackall <mpm@selenic.com>
parents:
5542
diff
changeset
|
321 except MemoryError: |
e04a65111a80
dispatch: report OOM rather than traceback
Matt Mackall <mpm@selenic.com>
parents:
5542
diff
changeset
|
322 ui.warn(_("abort: out of memory\n")) |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25329
diff
changeset
|
323 except SystemExit as inst: |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
324 # Commands shouldn't sys.exit directly, but give a return code. |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
325 # Just in case catch this and and pass exit code to caller. |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
326 return inst.code |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25329
diff
changeset
|
327 except socket.error as inst: |
7645
020a896a5292
dispatch: sort exception handlers
Matt Mackall <mpm@selenic.com>
parents:
7644
diff
changeset
|
328 ui.warn(_("abort: %s\n") % inst.args[-1]) |
16705
c2d9ef43ff6c
check-code: ignore naked excepts with a "re-raise" comment
Brodie Rao <brodie@sf.io>
parents:
16686
diff
changeset
|
329 except: # re-raises |
16744
1c9f58a6c8f1
dispatch: try and identify third-party extensions as sources of tracebacks
Augie Fackler <raf@durin42.com>
parents:
16705
diff
changeset
|
330 # For compatibility checking, we discard the portion of the hg |
1c9f58a6c8f1
dispatch: try and identify third-party extensions as sources of tracebacks
Augie Fackler <raf@durin42.com>
parents:
16705
diff
changeset
|
331 # version after the + on the assumption that if a "normal |
1c9f58a6c8f1
dispatch: try and identify third-party extensions as sources of tracebacks
Augie Fackler <raf@durin42.com>
parents:
16705
diff
changeset
|
332 # user" is running a build with a + in it the packager |
1c9f58a6c8f1
dispatch: try and identify third-party extensions as sources of tracebacks
Augie Fackler <raf@durin42.com>
parents:
16705
diff
changeset
|
333 # probably built from fairly close to a tag and anyone with a |
1c9f58a6c8f1
dispatch: try and identify third-party extensions as sources of tracebacks
Augie Fackler <raf@durin42.com>
parents:
16705
diff
changeset
|
334 # 'make local' copy of hg (where the version number can be out |
1c9f58a6c8f1
dispatch: try and identify third-party extensions as sources of tracebacks
Augie Fackler <raf@durin42.com>
parents:
16705
diff
changeset
|
335 # of date) will be clueful enough to notice the implausible |
1c9f58a6c8f1
dispatch: try and identify third-party extensions as sources of tracebacks
Augie Fackler <raf@durin42.com>
parents:
16705
diff
changeset
|
336 # version number and try updating. |
27113
77850d2a161c
dispatch: use versiontuple()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
337 ct = util.versiontuple(n=2) |
16744
1c9f58a6c8f1
dispatch: try and identify third-party extensions as sources of tracebacks
Augie Fackler <raf@durin42.com>
parents:
16705
diff
changeset
|
338 worst = None, ct, '' |
26263
bf2bfc6f45fb
traceback: allow providing a local support contact point
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26262
diff
changeset
|
339 if ui.config('ui', 'supportcontact', None) is None: |
26262
3e79ec0ba589
dispatch: pre-indent the extensions blaming logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26236
diff
changeset
|
340 for name, mod in extensions.extensions(): |
3e79ec0ba589
dispatch: pre-indent the extensions blaming logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26236
diff
changeset
|
341 testedwith = getattr(mod, 'testedwith', '') |
3e79ec0ba589
dispatch: pre-indent the extensions blaming logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26236
diff
changeset
|
342 report = getattr(mod, 'buglink', _('the extension author.')) |
3e79ec0ba589
dispatch: pre-indent the extensions blaming logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26236
diff
changeset
|
343 if not testedwith.strip(): |
3e79ec0ba589
dispatch: pre-indent the extensions blaming logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26236
diff
changeset
|
344 # We found an untested extension. It's likely the culprit. |
3e79ec0ba589
dispatch: pre-indent the extensions blaming logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26236
diff
changeset
|
345 worst = name, 'unknown', report |
3e79ec0ba589
dispatch: pre-indent the extensions blaming logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26236
diff
changeset
|
346 break |
23871
b2d8f3685b06
dispatch: only check compatibility against major and minor versions (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23270
diff
changeset
|
347 |
26262
3e79ec0ba589
dispatch: pre-indent the extensions blaming logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26236
diff
changeset
|
348 # Never blame on extensions bundled with Mercurial. |
3e79ec0ba589
dispatch: pre-indent the extensions blaming logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26236
diff
changeset
|
349 if testedwith == 'internal': |
3e79ec0ba589
dispatch: pre-indent the extensions blaming logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26236
diff
changeset
|
350 continue |
23871
b2d8f3685b06
dispatch: only check compatibility against major and minor versions (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23270
diff
changeset
|
351 |
27113
77850d2a161c
dispatch: use versiontuple()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
352 tested = [util.versiontuple(t, 2) for t in testedwith.split()] |
26262
3e79ec0ba589
dispatch: pre-indent the extensions blaming logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26236
diff
changeset
|
353 if ct in tested: |
3e79ec0ba589
dispatch: pre-indent the extensions blaming logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26236
diff
changeset
|
354 continue |
23871
b2d8f3685b06
dispatch: only check compatibility against major and minor versions (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
23270
diff
changeset
|
355 |
26262
3e79ec0ba589
dispatch: pre-indent the extensions blaming logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26236
diff
changeset
|
356 lower = [t for t in tested if t < ct] |
3e79ec0ba589
dispatch: pre-indent the extensions blaming logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26236
diff
changeset
|
357 nearest = max(lower or tested) |
3e79ec0ba589
dispatch: pre-indent the extensions blaming logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26236
diff
changeset
|
358 if worst[0] is None or nearest < worst[1]: |
3e79ec0ba589
dispatch: pre-indent the extensions blaming logic
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26236
diff
changeset
|
359 worst = name, nearest, report |
16744
1c9f58a6c8f1
dispatch: try and identify third-party extensions as sources of tracebacks
Augie Fackler <raf@durin42.com>
parents:
16705
diff
changeset
|
360 if worst[0] is not None: |
1c9f58a6c8f1
dispatch: try and identify third-party extensions as sources of tracebacks
Augie Fackler <raf@durin42.com>
parents:
16705
diff
changeset
|
361 name, testedwith, report = worst |
1c9f58a6c8f1
dispatch: try and identify third-party extensions as sources of tracebacks
Augie Fackler <raf@durin42.com>
parents:
16705
diff
changeset
|
362 if not isinstance(testedwith, str): |
1c9f58a6c8f1
dispatch: try and identify third-party extensions as sources of tracebacks
Augie Fackler <raf@durin42.com>
parents:
16705
diff
changeset
|
363 testedwith = '.'.join([str(c) for c in testedwith]) |
1c9f58a6c8f1
dispatch: try and identify third-party extensions as sources of tracebacks
Augie Fackler <raf@durin42.com>
parents:
16705
diff
changeset
|
364 warning = (_('** Unknown exception encountered with ' |
1c9f58a6c8f1
dispatch: try and identify third-party extensions as sources of tracebacks
Augie Fackler <raf@durin42.com>
parents:
16705
diff
changeset
|
365 'possibly-broken third-party extension %s\n' |
1c9f58a6c8f1
dispatch: try and identify third-party extensions as sources of tracebacks
Augie Fackler <raf@durin42.com>
parents:
16705
diff
changeset
|
366 '** which supports versions %s of Mercurial.\n' |
1c9f58a6c8f1
dispatch: try and identify third-party extensions as sources of tracebacks
Augie Fackler <raf@durin42.com>
parents:
16705
diff
changeset
|
367 '** Please disable %s and try your action again.\n' |
1c9f58a6c8f1
dispatch: try and identify third-party extensions as sources of tracebacks
Augie Fackler <raf@durin42.com>
parents:
16705
diff
changeset
|
368 '** If that fixes the bug please report it to %s\n') |
1c9f58a6c8f1
dispatch: try and identify third-party extensions as sources of tracebacks
Augie Fackler <raf@durin42.com>
parents:
16705
diff
changeset
|
369 % (name, testedwith, name, report)) |
1c9f58a6c8f1
dispatch: try and identify third-party extensions as sources of tracebacks
Augie Fackler <raf@durin42.com>
parents:
16705
diff
changeset
|
370 else: |
26263
bf2bfc6f45fb
traceback: allow providing a local support contact point
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26262
diff
changeset
|
371 bugtracker = ui.config('ui', 'supportcontact', None) |
bf2bfc6f45fb
traceback: allow providing a local support contact point
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26262
diff
changeset
|
372 if bugtracker is None: |
26421
4b0fc75f9403
urls: bulk-change primary website URLs
Matt Mackall <mpm@selenic.com>
parents:
26364
diff
changeset
|
373 bugtracker = _("https://mercurial-scm.org/wiki/BugTracker") |
16744
1c9f58a6c8f1
dispatch: try and identify third-party extensions as sources of tracebacks
Augie Fackler <raf@durin42.com>
parents:
16705
diff
changeset
|
374 warning = (_("** unknown exception encountered, " |
26263
bf2bfc6f45fb
traceback: allow providing a local support contact point
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26262
diff
changeset
|
375 "please report by visiting\n** ") + bugtracker + '\n') |
16744
1c9f58a6c8f1
dispatch: try and identify third-party extensions as sources of tracebacks
Augie Fackler <raf@durin42.com>
parents:
16705
diff
changeset
|
376 warning += ((_("** Python %s\n") % sys.version.replace('\n', '')) + |
27113
77850d2a161c
dispatch: use versiontuple()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
377 (_("** Mercurial Distributed SCM (version %s)\n") % |
77850d2a161c
dispatch: use versiontuple()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26587
diff
changeset
|
378 util.version()) + |
16744
1c9f58a6c8f1
dispatch: try and identify third-party extensions as sources of tracebacks
Augie Fackler <raf@durin42.com>
parents:
16705
diff
changeset
|
379 (_("** Extensions loaded: %s\n") % |
1c9f58a6c8f1
dispatch: try and identify third-party extensions as sources of tracebacks
Augie Fackler <raf@durin42.com>
parents:
16705
diff
changeset
|
380 ", ".join([x[0] for x in extensions.extensions()]))) |
18670
ddc7268da176
blackbox: log the commands that are run
Durham Goode <durham@fb.com>
parents:
18548
diff
changeset
|
381 ui.log("commandexception", "%s\n%s\n", warning, traceback.format_exc()) |
16744
1c9f58a6c8f1
dispatch: try and identify third-party extensions as sources of tracebacks
Augie Fackler <raf@durin42.com>
parents:
16705
diff
changeset
|
382 ui.warn(warning) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
383 raise |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
384 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
385 return -1 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
386 |
14265
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
387 def aliasargs(fn, givenargs): |
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
388 args = getattr(fn, 'args', []) |
16294
795d591b6ef5
alias: abort on missing positional args (issue3331)
Matt Mackall <mpm@selenic.com>
parents:
16277
diff
changeset
|
389 if args: |
14265
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
390 cmd = ' '.join(map(util.shellquote, args)) |
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
391 |
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
392 nums = [] |
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
393 def replacer(m): |
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
394 num = int(m.group(1)) - 1 |
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
395 nums.append(num) |
16277
1c2aaf05f7d7
aliases: use empty string for missing position parameters (issue3331)
Matt Mackall <mpm@selenic.com>
parents:
15781
diff
changeset
|
396 if num < len(givenargs): |
1c2aaf05f7d7
aliases: use empty string for missing position parameters (issue3331)
Matt Mackall <mpm@selenic.com>
parents:
15781
diff
changeset
|
397 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
|
398 raise error.Abort(_('too few arguments for command alias')) |
14265
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
399 cmd = re.sub(r'\$(\d+|\$)', replacer, cmd) |
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
400 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
|
401 if i not in nums] |
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
402 args = shlex.split(cmd) |
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
403 return args + givenargs |
8655 | 404 |
22158
bc2132dfc0a4
alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents:
21961
diff
changeset
|
405 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
|
406 '''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
|
407 |
bc2132dfc0a4
alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents:
21961
diff
changeset
|
408 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
|
409 ''' |
bc2132dfc0a4
alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents:
21961
diff
changeset
|
410 # 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
|
411 # 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
|
412 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
|
413 replacemap['$0'] = name |
bc2132dfc0a4
alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents:
21961
diff
changeset
|
414 replacemap['$$'] = '$' |
bc2132dfc0a4
alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents:
21961
diff
changeset
|
415 replacemap['$@'] = ' '.join(args) |
bc2132dfc0a4
alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents:
21961
diff
changeset
|
416 # 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
|
417 # 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
|
418 # 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
|
419 # 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
|
420 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
|
421 # escape '\$' for regex |
bc2132dfc0a4
alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents:
21961
diff
changeset
|
422 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
|
423 r = re.compile(regex) |
bc2132dfc0a4
alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)
Siddharth Agarwal <sid0@fb.com>
parents:
21961
diff
changeset
|
424 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
|
425 |
8655 | 426 class cmdalias(object): |
427 def __init__(self, name, definition, cmdtable): | |
12039
18e1e7520b67
alias: make shadowing behavior more consistent (issue2054)
Brodie Rao <brodie@bitheap.org>
parents:
11712
diff
changeset
|
428 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
|
429 self.cmdname = '' |
8655 | 430 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
|
431 self.fn = None |
8655 | 432 self.args = [] |
433 self.opts = [] | |
434 self.help = '' | |
435 self.norepo = True | |
16609
d36a384bec87
alias: inherit command optionalrepo flag (issue3298)
Patrick Mezard <patrick@mezard.eu>
parents:
16591
diff
changeset
|
436 self.optionalrepo = False |
27679
6822f9382b4c
dispatch: copy inferrepo attribute to alias commands
Yuya Nishihara <yuya@tcha.org>
parents:
27628
diff
changeset
|
437 self.inferrepo = False |
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 = None |
22161
063628423fd1
alias: provide "unknowncmd" flag to tell help to look for disabled command
Yuya Nishihara <yuya@tcha.org>
parents:
22160
diff
changeset
|
439 self.unknowncmd = False |
8655 | 440 |
441 try: | |
12039
18e1e7520b67
alias: make shadowing behavior more consistent (issue2054)
Brodie Rao <brodie@bitheap.org>
parents:
11712
diff
changeset
|
442 aliases, entry = cmdutil.findcmd(self.name, cmdtable) |
18e1e7520b67
alias: make shadowing behavior more consistent (issue2054)
Brodie Rao <brodie@bitheap.org>
parents:
11712
diff
changeset
|
443 for alias, e in cmdtable.iteritems(): |
18e1e7520b67
alias: make shadowing behavior more consistent (issue2054)
Brodie Rao <brodie@bitheap.org>
parents:
11712
diff
changeset
|
444 if e is entry: |
18e1e7520b67
alias: make shadowing behavior more consistent (issue2054)
Brodie Rao <brodie@bitheap.org>
parents:
11712
diff
changeset
|
445 self.cmd = alias |
18e1e7520b67
alias: make shadowing behavior more consistent (issue2054)
Brodie Rao <brodie@bitheap.org>
parents:
11712
diff
changeset
|
446 break |
8655 | 447 self.shadows = True |
448 except error.UnknownCommand: | |
449 self.shadows = False | |
450 | |
451 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
|
452 self.badalias = _("no definition for alias '%s'") % self.name |
8655 | 453 return |
454 | |
11524
24965bb270b7
dispatch: add shell aliases
Steve Losh <steve@stevelosh.com>
parents:
11495
diff
changeset
|
455 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
|
456 self.shell = True |
11524
24965bb270b7
dispatch: add shell aliases
Steve Losh <steve@stevelosh.com>
parents:
11495
diff
changeset
|
457 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
|
458 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
|
459 def _checkvar(m): |
13392
777cef34a890
dispatch: support for $ escaping in shell-alias definition
Roman Sokolov <sokolov.r.v@gmail.com>
parents:
13382
diff
changeset
|
460 if m.groups()[0] == '$': |
777cef34a890
dispatch: support for $ escaping in shell-alias definition
Roman Sokolov <sokolov.r.v@gmail.com>
parents:
13382
diff
changeset
|
461 return m.group() |
777cef34a890
dispatch: support for $ escaping in shell-alias definition
Roman Sokolov <sokolov.r.v@gmail.com>
parents:
13382
diff
changeset
|
462 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
|
463 return m.group() |
f853873fc66d
aliases: provide more flexible ways to work with shell alias arguments
Steve Losh <steve@stevelosh.com>
parents:
11985
diff
changeset
|
464 else: |
14708
8083f4d00bd1
i18n: remove translation of debug messages
David Soria Parra <dsp@php.net>
parents:
14704
diff
changeset
|
465 ui.debug("No argument found for substitution " |
8083f4d00bd1
i18n: remove translation of debug messages
David Soria Parra <dsp@php.net>
parents:
14704
diff
changeset
|
466 "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
|
467 % (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
|
468 return '' |
13392
777cef34a890
dispatch: support for $ escaping in shell-alias definition
Roman Sokolov <sokolov.r.v@gmail.com>
parents:
13382
diff
changeset
|
469 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
|
470 cmd = aliasinterpolate(self.name, args, cmd) |
23270
41c03b7592ed
util.system: use ui.system() in place of optional ui.fout parameter
Yuya Nishihara <yuya@tcha.org>
parents:
22595
diff
changeset
|
471 return ui.system(cmd, environ=env) |
11524
24965bb270b7
dispatch: add shell aliases
Steve Losh <steve@stevelosh.com>
parents:
11495
diff
changeset
|
472 self.fn = fn |
24965bb270b7
dispatch: add shell aliases
Steve Losh <steve@stevelosh.com>
parents:
11495
diff
changeset
|
473 return |
24965bb270b7
dispatch: add shell aliases
Steve Losh <steve@stevelosh.com>
parents:
11495
diff
changeset
|
474 |
21569
c5afb07c33d3
alias: handle shlex error in command aliases
Yuya Nishihara <yuya@tcha.org>
parents:
21556
diff
changeset
|
475 try: |
c5afb07c33d3
alias: handle shlex error in command aliases
Yuya Nishihara <yuya@tcha.org>
parents:
21556
diff
changeset
|
476 args = shlex.split(self.definition) |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25329
diff
changeset
|
477 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
|
478 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
|
479 % (self.name, inst)) |
21569
c5afb07c33d3
alias: handle shlex error in command aliases
Yuya Nishihara <yuya@tcha.org>
parents:
21556
diff
changeset
|
480 return |
12092
4982fa38e544
alias: print what command is being shadowed in debug message
Brodie Rao <brodie@bitheap.org>
parents:
12070
diff
changeset
|
481 self.cmdname = cmd = args.pop(0) |
10793
16df09a54113
expand paths in aliases
Alexander Solovyov <piranha@piranha.org.ua>
parents:
10564
diff
changeset
|
482 args = map(util.expandpath, args) |
8655 | 483 |
18693
633cd0c46e6a
dispatch: also a separate warning message on aliases with --config
Simon Heimberg <simohe@besonet.ch>
parents:
18691
diff
changeset
|
484 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
|
485 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
|
486 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
|
487 "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
|
488 % (self.name, invalidarg)) |
11695
ee8f36a6c766
alias: improved diagnostic when arguments include --cwd, etc.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
11681
diff
changeset
|
489 return |
ee8f36a6c766
alias: improved diagnostic when arguments include --cwd, etc.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
11681
diff
changeset
|
490 |
8655 | 491 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
|
492 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
|
493 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
|
494 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
|
495 else: |
8bce1e0d2801
alias: do not crash when aliased command has no usage help text
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9825
diff
changeset
|
496 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
|
497 |
14265
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
498 self.args = aliasargs(self.fn, args) |
28313
aa73d6a5d9ea
dispatch: store norepo/optionalrepo/inferrepo attributes in function (API)
Yuya Nishihara <yuya@tcha.org>
parents:
28263
diff
changeset
|
499 if not self.fn.norepo: |
8655 | 500 self.norepo = False |
28313
aa73d6a5d9ea
dispatch: store norepo/optionalrepo/inferrepo attributes in function (API)
Yuya Nishihara <yuya@tcha.org>
parents:
28263
diff
changeset
|
501 if self.fn.optionalrepo: |
16609
d36a384bec87
alias: inherit command optionalrepo flag (issue3298)
Patrick Mezard <patrick@mezard.eu>
parents:
16591
diff
changeset
|
502 self.optionalrepo = True |
28313
aa73d6a5d9ea
dispatch: store norepo/optionalrepo/inferrepo attributes in function (API)
Yuya Nishihara <yuya@tcha.org>
parents:
28263
diff
changeset
|
503 if self.fn.inferrepo: |
27679
6822f9382b4c
dispatch: copy inferrepo attribute to alias commands
Yuya Nishihara <yuya@tcha.org>
parents:
27628
diff
changeset
|
504 self.inferrepo = True |
9876
6e8a16dd3e30
alias: improve help text for command aliases
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
9875
diff
changeset
|
505 if self.help.startswith("hg " + cmd): |
6e8a16dd3e30
alias: improve help text for command aliases
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
9875
diff
changeset
|
506 # 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
|
507 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
|
508 self.__doc__ = self.fn.__doc__ |
9876
6e8a16dd3e30
alias: improve help text for command aliases
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
9875
diff
changeset
|
509 |
8655 | 510 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
|
511 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
|
512 % (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
|
513 self.unknowncmd = True |
8655 | 514 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
|
515 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
|
516 % (self.name, cmd)) |
8655 | 517 |
518 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
|
519 if self.badalias: |
22164
efd65e51bc0b
alias: exit from bad definition by Abort
Yuya Nishihara <yuya@tcha.org>
parents:
22163
diff
changeset
|
520 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
|
521 if self.unknowncmd: |
10364
de1e7099d100
dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents:
10282
diff
changeset
|
522 try: |
de1e7099d100
dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents:
10282
diff
changeset
|
523 # 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
|
524 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
|
525 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
|
526 except error.UnknownCommand: |
de1e7099d100
dispatch: provide help for disabled extensions and commands
Brodie Rao <me+hg@dackz.net>
parents:
10282
diff
changeset
|
527 pass |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26421
diff
changeset
|
528 raise error.Abort(self.badalias, hint=hint) |
8655 | 529 if self.shadows: |
14704
b24d596fcd25
Backed out changeset 1ec8bd909ac3
Martin Geisler <mg@aragost.com>
parents:
14702
diff
changeset
|
530 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
|
531 (self.name, self.cmdname)) |
8655 | 532 |
14950
144e97421f6b
dispatch: use safehasattr instead of hasattr
Augie Fackler <durin42@gmail.com>
parents:
14918
diff
changeset
|
533 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
|
534 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
|
535 else: |
12093
cd895084a4cd
alias: on --debug, print expansion when it has invalid arguments
Brodie Rao <brodie@bitheap.org>
parents:
12092
diff
changeset
|
536 try: |
21556
5e13507a3b4e
alias: fix loss of non-zero return code in command aliases
Yuya Nishihara <yuya@tcha.org>
parents:
20829
diff
changeset
|
537 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
|
538 except error.SignatureError: |
cd895084a4cd
alias: on --debug, print expansion when it has invalid arguments
Brodie Rao <brodie@bitheap.org>
parents:
12092
diff
changeset
|
539 args = ' '.join([self.cmdname] + self.args) |
14704
b24d596fcd25
Backed out changeset 1ec8bd909ac3
Martin Geisler <mg@aragost.com>
parents:
14702
diff
changeset
|
540 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
|
541 raise |
8655 | 542 |
543 def addaliases(ui, cmdtable): | |
544 # aliases are processed after extensions have been loaded, so they | |
545 # may use extension commands. Aliases can also use other alias definitions, | |
546 # but only if they have been defined prior to the current definition. | |
547 for alias, definition in ui.configitems('alias'): | |
548 aliasdef = cmdalias(alias, definition, cmdtable) | |
15019
f4b7be3f8430
dispatch: don't rewrap aliases that have the same definition
Idan Kamara <idankk86@gmail.com>
parents:
14992
diff
changeset
|
549 |
f4b7be3f8430
dispatch: don't rewrap aliases that have the same definition
Idan Kamara <idankk86@gmail.com>
parents:
14992
diff
changeset
|
550 try: |
f4b7be3f8430
dispatch: don't rewrap aliases that have the same definition
Idan Kamara <idankk86@gmail.com>
parents:
14992
diff
changeset
|
551 olddef = cmdtable[aliasdef.cmd][0] |
f4b7be3f8430
dispatch: don't rewrap aliases that have the same definition
Idan Kamara <idankk86@gmail.com>
parents:
14992
diff
changeset
|
552 if olddef.definition == aliasdef.definition: |
f4b7be3f8430
dispatch: don't rewrap aliases that have the same definition
Idan Kamara <idankk86@gmail.com>
parents:
14992
diff
changeset
|
553 continue |
f4b7be3f8430
dispatch: don't rewrap aliases that have the same definition
Idan Kamara <idankk86@gmail.com>
parents:
14992
diff
changeset
|
554 except (KeyError, AttributeError): |
f4b7be3f8430
dispatch: don't rewrap aliases that have the same definition
Idan Kamara <idankk86@gmail.com>
parents:
14992
diff
changeset
|
555 # 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
|
556 pass |
f4b7be3f8430
dispatch: don't rewrap aliases that have the same definition
Idan Kamara <idankk86@gmail.com>
parents:
14992
diff
changeset
|
557 |
15233
81c97964d123
alias: don't shadow commands that we only partially matched (issue2993) (BC)
Augie Fackler <durin42@gmail.com>
parents:
15027
diff
changeset
|
558 cmdtable[aliasdef.name] = (aliasdef, aliasdef.opts, aliasdef.help) |
8655 | 559 |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
560 def _parse(ui, args): |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
561 options = {} |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
562 cmdoptions = {} |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
563 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
564 try: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
565 args = fancyopts.fancyopts(args, commands.globalopts, options) |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25329
diff
changeset
|
566 except fancyopts.getopt.GetoptError as inst: |
11287
b901bb751999
error: change ParseError to CommandError
Matt Mackall <mpm@selenic.com>
parents:
11209
diff
changeset
|
567 raise error.CommandError(None, inst) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
568 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
569 if args: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
570 cmd, args = args[0], args[1:] |
9875
d6a95c5f6ff9
dispatch: minor refactoring
Henri Wiechers <hwiechers@gmail.com>
parents:
9825
diff
changeset
|
571 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
|
572 ui.configbool("ui", "strict")) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
573 cmd = aliases[0] |
14265
e4ab5ae193f2
add positional arguments to non-shell aliases
Alexander Solovyov <alexander@solovyov.net>
parents:
14096
diff
changeset
|
574 args = aliasargs(entry[0], args) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
575 defaults = ui.config("defaults", cmd) |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
576 if defaults: |
9610
d78fe60f6bda
make path expanding more consistent
Alexander Solovyov <piranha@piranha.org.ua>
parents:
9569
diff
changeset
|
577 args = map(util.expandpath, shlex.split(defaults)) + args |
9875
d6a95c5f6ff9
dispatch: minor refactoring
Henri Wiechers <hwiechers@gmail.com>
parents:
9825
diff
changeset
|
578 c = list(entry[1]) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
579 else: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
580 cmd = None |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
581 c = [] |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
582 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
583 # combine global options into local |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
584 for o in commands.globalopts: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
585 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
|
586 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
587 try: |
7772
88887054d277
fancyopts: Parse options that occur after arguments.
Augie Fackler <durin42@gmail.com>
parents:
7733
diff
changeset
|
588 args = fancyopts.fancyopts(args, c, cmdoptions, True) |
25660
328739ea70c3
global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25329
diff
changeset
|
589 except fancyopts.getopt.GetoptError as inst: |
11287
b901bb751999
error: change ParseError to CommandError
Matt Mackall <mpm@selenic.com>
parents:
11209
diff
changeset
|
590 raise error.CommandError(cmd, inst) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
591 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
592 # separate global options back out |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
593 for o in commands.globalopts: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
594 n = o[1] |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
595 options[n] = cmdoptions[n] |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
596 del cmdoptions[n] |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
597 |
9875
d6a95c5f6ff9
dispatch: minor refactoring
Henri Wiechers <hwiechers@gmail.com>
parents:
9825
diff
changeset
|
598 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
|
599 |
8137 | 600 def _parseconfig(ui, config): |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
601 """parse the --config options from the command line""" |
14753
10dcb3e7cb55
dispatch: return read config options
Idan Kamara <idankk86@gmail.com>
parents:
14752
diff
changeset
|
602 configs = [] |
10dcb3e7cb55
dispatch: return read config options
Idan Kamara <idankk86@gmail.com>
parents:
14752
diff
changeset
|
603 |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
604 for cfg in config: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
605 try: |
28081
a6344df5108e
dispatch: strip command line options like config file options
Tony Tung <ttung@fb.com>
parents:
27679
diff
changeset
|
606 name, value = [cfgelem.strip() |
a6344df5108e
dispatch: strip command line options like config file options
Tony Tung <ttung@fb.com>
parents:
27679
diff
changeset
|
607 for cfgelem in cfg.split('=', 1)] |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
608 section, name = name.split('.', 1) |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
609 if not section or not name: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
610 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
|
611 ui.setconfig(section, name, value, '--config') |
14753
10dcb3e7cb55
dispatch: return read config options
Idan Kamara <idankk86@gmail.com>
parents:
14752
diff
changeset
|
612 configs.append((section, name, value)) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
613 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
|
614 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
|
615 '(use --config section.name=value)') % cfg) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
616 |
14753
10dcb3e7cb55
dispatch: return read config options
Idan Kamara <idankk86@gmail.com>
parents:
14752
diff
changeset
|
617 return configs |
10dcb3e7cb55
dispatch: return read config options
Idan Kamara <idankk86@gmail.com>
parents:
14752
diff
changeset
|
618 |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
619 def _earlygetopt(aliases, args): |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
620 """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
|
621 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
622 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
|
623 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
|
624 |
f01ae031f84c
dispatch: add doctests for _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19011
diff
changeset
|
625 >>> args = ['x', '--cwd', 'foo', 'y'] |
f01ae031f84c
dispatch: add doctests for _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19011
diff
changeset
|
626 >>> _earlygetopt(['--cwd'], args), args |
f01ae031f84c
dispatch: add doctests for _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19011
diff
changeset
|
627 (['foo'], ['x', 'y']) |
f01ae031f84c
dispatch: add doctests for _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19011
diff
changeset
|
628 |
19099
fc081623f4bd
dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19098
diff
changeset
|
629 >>> args = ['x', '--cwd=bar', 'y'] |
fc081623f4bd
dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19098
diff
changeset
|
630 >>> _earlygetopt(['--cwd'], args), args |
fc081623f4bd
dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19098
diff
changeset
|
631 (['bar'], ['x', 'y']) |
fc081623f4bd
dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19098
diff
changeset
|
632 |
19098
f01ae031f84c
dispatch: add doctests for _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19011
diff
changeset
|
633 >>> args = ['x', '-R', 'foo', 'y'] |
f01ae031f84c
dispatch: add doctests for _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19011
diff
changeset
|
634 >>> _earlygetopt(['-R'], args), args |
f01ae031f84c
dispatch: add doctests for _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19011
diff
changeset
|
635 (['foo'], ['x', 'y']) |
f01ae031f84c
dispatch: add doctests for _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19011
diff
changeset
|
636 |
f01ae031f84c
dispatch: add doctests for _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19011
diff
changeset
|
637 >>> args = ['x', '-Rbar', 'y'] |
f01ae031f84c
dispatch: add doctests for _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19011
diff
changeset
|
638 >>> _earlygetopt(['-R'], args), args |
f01ae031f84c
dispatch: add doctests for _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19011
diff
changeset
|
639 (['bar'], ['x', 'y']) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
640 """ |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
641 try: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
642 argcount = args.index("--") |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
643 except ValueError: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
644 argcount = len(args) |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
645 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
|
646 values = [] |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
647 pos = 0 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
648 while pos < argcount: |
19099
fc081623f4bd
dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19098
diff
changeset
|
649 fullarg = arg = args[pos] |
fc081623f4bd
dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19098
diff
changeset
|
650 equals = arg.find('=') |
fc081623f4bd
dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19098
diff
changeset
|
651 if equals > -1: |
fc081623f4bd
dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19098
diff
changeset
|
652 arg = arg[:equals] |
fc081623f4bd
dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19098
diff
changeset
|
653 if arg in aliases: |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
654 del args[pos] |
19099
fc081623f4bd
dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19098
diff
changeset
|
655 if equals > -1: |
fc081623f4bd
dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19098
diff
changeset
|
656 values.append(fullarg[equals + 1:]) |
fc081623f4bd
dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19098
diff
changeset
|
657 argcount -= 1 |
fc081623f4bd
dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19098
diff
changeset
|
658 else: |
fc081623f4bd
dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19098
diff
changeset
|
659 if pos + 1 >= argcount: |
fc081623f4bd
dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19098
diff
changeset
|
660 # 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
|
661 break |
fc081623f4bd
dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19098
diff
changeset
|
662 values.append(args.pop(pos)) |
fc081623f4bd
dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19098
diff
changeset
|
663 argcount -= 2 |
fc081623f4bd
dispatch: add support for --option=value to _earlygetopt
Bryan O'Sullivan <bryano@fb.com>
parents:
19098
diff
changeset
|
664 elif arg[:2] in shortopts: |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
665 # 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
|
666 values.append(args.pop(pos)[2:]) |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
667 argcount -= 1 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
668 else: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
669 pos += 1 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
670 return values |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
671 |
11330
713ae78bb583
provide pre- and post- hooks with parsed command line arguments.
Chad Dombrova <chadrik@gmail.com>
parents:
11305
diff
changeset
|
672 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
|
673 # 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
|
674 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
|
675 pats=cmdpats, opts=cmdoptions) |
7819
14b703252f14
dispatch: extract command execution block into method
Bill Barry <after.fallout@gmail.com>
parents:
7772
diff
changeset
|
676 ret = _runcommand(ui, options, cmd, d) |
14b703252f14
dispatch: extract command execution block into method
Bill Barry <after.fallout@gmail.com>
parents:
7772
diff
changeset
|
677 # run post-hook, passing command result |
14b703252f14
dispatch: extract command execution block into method
Bill Barry <after.fallout@gmail.com>
parents:
7772
diff
changeset
|
678 hook.hook(lui, repo, "post-%s" % cmd, False, args=" ".join(fullargs), |
11330
713ae78bb583
provide pre- and post- hooks with parsed command line arguments.
Chad Dombrova <chadrik@gmail.com>
parents:
11305
diff
changeset
|
679 result=ret, pats=cmdpats, opts=cmdoptions) |
7819
14b703252f14
dispatch: extract command execution block into method
Bill Barry <after.fallout@gmail.com>
parents:
7772
diff
changeset
|
680 return ret |
14b703252f14
dispatch: extract command execution block into method
Bill Barry <after.fallout@gmail.com>
parents:
7772
diff
changeset
|
681 |
28263
59509c6724c7
dispatch: add wd parameter to _getlocal
Jun Wu <quark@fb.com>
parents:
28081
diff
changeset
|
682 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
|
683 """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
|
684 |
12536
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
685 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
|
686 """ |
28263
59509c6724c7
dispatch: add wd parameter to _getlocal
Jun Wu <quark@fb.com>
parents:
28081
diff
changeset
|
687 if wd is None: |
59509c6724c7
dispatch: add wd parameter to _getlocal
Jun Wu <quark@fb.com>
parents:
28081
diff
changeset
|
688 try: |
59509c6724c7
dispatch: add wd parameter to _getlocal
Jun Wu <quark@fb.com>
parents:
28081
diff
changeset
|
689 wd = os.getcwd() |
59509c6724c7
dispatch: add wd parameter to _getlocal
Jun Wu <quark@fb.com>
parents:
28081
diff
changeset
|
690 except OSError as e: |
59509c6724c7
dispatch: add wd parameter to _getlocal
Jun Wu <quark@fb.com>
parents:
28081
diff
changeset
|
691 raise error.Abort(_("error getting current working directory: %s") % |
59509c6724c7
dispatch: add wd parameter to _getlocal
Jun Wu <quark@fb.com>
parents:
28081
diff
changeset
|
692 e.strerror) |
11675
f92f8921a5cc
dispatch: give better error message when cwd doesn't exist (issue2293)
Mads Kiilerich <mads@kiilerich.com>
parents:
11600
diff
changeset
|
693 path = cmdutil.findrepo(wd) or "" |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
694 if not path: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
695 lui = ui |
9436 | 696 else: |
12636
c24215aa7e69
dispatch: remove superfluous try/except when reading local ui config
Brodie Rao <brodie@bitheap.org>
parents:
12633
diff
changeset
|
697 lui = ui.copy() |
12637
42ca7aef28d3
dispatch: properly handle relative path aliases used with -R (issue2376)
Brodie Rao <brodie@bitheap.org>
parents:
12636
diff
changeset
|
698 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
|
699 |
14860
67add0f24f83
dispatch: fix checking of rpath in _getlocal
Matt Mackall <mpm@selenic.com>
parents:
14761
diff
changeset
|
700 if rpath and rpath[-1]: |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
701 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
|
702 lui = ui.copy() |
12637
42ca7aef28d3
dispatch: properly handle relative path aliases used with -R (issue2376)
Brodie Rao <brodie@bitheap.org>
parents:
12636
diff
changeset
|
703 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
|
704 |
12536
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
705 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
|
706 |
22376
d821fff9b0b9
dispatch: make "_checkshellalias" reusable regardless of adding aliases
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21961
diff
changeset
|
707 def _checkshellalias(lui, ui, args, precheck=True): |
d821fff9b0b9
dispatch: make "_checkshellalias" reusable regardless of adding aliases
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21961
diff
changeset
|
708 """Return the function to run the shell alias, if it is required |
d821fff9b0b9
dispatch: make "_checkshellalias" reusable regardless of adding aliases
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21961
diff
changeset
|
709 |
d821fff9b0b9
dispatch: make "_checkshellalias" reusable regardless of adding aliases
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21961
diff
changeset
|
710 'precheck' is whether this function is invoked before adding |
d821fff9b0b9
dispatch: make "_checkshellalias" reusable regardless of adding aliases
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21961
diff
changeset
|
711 aliases or not. |
d821fff9b0b9
dispatch: make "_checkshellalias" reusable regardless of adding aliases
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21961
diff
changeset
|
712 """ |
12536
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
713 options = {} |
12748
d10369fefd01
alias: fail gracefully when invalid global options are given (issue2442)
Steve Losh <steve@stevelosh.com>
parents:
12637
diff
changeset
|
714 |
d10369fefd01
alias: fail gracefully when invalid global options are given (issue2442)
Steve Losh <steve@stevelosh.com>
parents:
12637
diff
changeset
|
715 try: |
d10369fefd01
alias: fail gracefully when invalid global options are given (issue2442)
Steve Losh <steve@stevelosh.com>
parents:
12637
diff
changeset
|
716 args = fancyopts.fancyopts(args, commands.globalopts, options) |
d10369fefd01
alias: fail gracefully when invalid global options are given (issue2442)
Steve Losh <steve@stevelosh.com>
parents:
12637
diff
changeset
|
717 except fancyopts.getopt.GetoptError: |
d10369fefd01
alias: fail gracefully when invalid global options are given (issue2442)
Steve Losh <steve@stevelosh.com>
parents:
12637
diff
changeset
|
718 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
|
719 |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
720 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
|
721 return |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
722 |
22376
d821fff9b0b9
dispatch: make "_checkshellalias" reusable regardless of adding aliases
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21961
diff
changeset
|
723 if precheck: |
22377
f98abe3146b2
dispatch: check shell alias again after loading extensions (issue4355)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22376
diff
changeset
|
724 strict = True |
22376
d821fff9b0b9
dispatch: make "_checkshellalias" reusable regardless of adding aliases
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21961
diff
changeset
|
725 cmdtable = commands.table.copy() |
d821fff9b0b9
dispatch: make "_checkshellalias" reusable regardless of adding aliases
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21961
diff
changeset
|
726 addaliases(lui, cmdtable) |
d821fff9b0b9
dispatch: make "_checkshellalias" reusable regardless of adding aliases
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21961
diff
changeset
|
727 else: |
22377
f98abe3146b2
dispatch: check shell alias again after loading extensions (issue4355)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22376
diff
changeset
|
728 strict = False |
22376
d821fff9b0b9
dispatch: make "_checkshellalias" reusable regardless of adding aliases
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21961
diff
changeset
|
729 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
|
730 |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
731 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
|
732 try: |
22377
f98abe3146b2
dispatch: check shell alias again after loading extensions (issue4355)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22376
diff
changeset
|
733 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
|
734 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
|
735 return |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
736 |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
737 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
|
738 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
|
739 |
14950
144e97421f6b
dispatch: use safehasattr instead of hasattr
Augie Fackler <durin42@gmail.com>
parents:
14918
diff
changeset
|
740 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
|
741 d = lambda: fn(ui, *args[1:]) |
16683 | 742 return lambda: runcommand(lui, None, cmd, args[:1], ui, options, d, |
743 [], {}) | |
12536
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
744 |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
745 _loaded = set() |
14439
80c599eee3f3
dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents:
14438
diff
changeset
|
746 def _dispatch(req): |
14438
08bfec2ef031
dispatch: wrap dispatch related information in a request class
Idan Kamara <idankk86@gmail.com>
parents:
14286
diff
changeset
|
747 args = req.args |
14439
80c599eee3f3
dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents:
14438
diff
changeset
|
748 ui = req.ui |
80c599eee3f3
dispatch: use the request to store the ui object
Idan Kamara <idankk86@gmail.com>
parents:
14438
diff
changeset
|
749 |
12536
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
750 # 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
|
751 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
|
752 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
|
753 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
|
754 |
208fc9ad6a48
alias: only allow global options before a shell alias, pass later ones through
Steve Losh <steve@stevelosh.com>
parents:
12276
diff
changeset
|
755 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
|
756 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
|
757 |
14886
9a3831d64ae2
dispatch: move shell alias handling after early arg handling
Matt Mackall <mpm@selenic.com>
parents:
14866
diff
changeset
|
758 # Now that we're operating in the right directory/repository with |
9a3831d64ae2
dispatch: move shell alias handling after early arg handling
Matt Mackall <mpm@selenic.com>
parents:
14866
diff
changeset
|
759 # the right config settings, check for shell aliases |
14888
946f4381c1cb
alias: pass local ui to shell alias
Matt Mackall <mpm@selenic.com>
parents:
14887
diff
changeset
|
760 shellaliasfn = _checkshellalias(lui, ui, args) |
14886
9a3831d64ae2
dispatch: move shell alias handling after early arg handling
Matt Mackall <mpm@selenic.com>
parents:
14866
diff
changeset
|
761 if shellaliasfn: |
9a3831d64ae2
dispatch: move shell alias handling after early arg handling
Matt Mackall <mpm@selenic.com>
parents:
14866
diff
changeset
|
762 return shellaliasfn() |
9a3831d64ae2
dispatch: move shell alias handling after early arg handling
Matt Mackall <mpm@selenic.com>
parents:
14866
diff
changeset
|
763 |
9410
1c83938b6a8e
extensions: load and configure extensions in well-defined phases
Martin Geisler <mg@lazybytes.net>
parents:
8936
diff
changeset
|
764 # Configure extensions in phases: uisetup, extsetup, cmdtable, and |
1c83938b6a8e
extensions: load and configure extensions in well-defined phases
Martin Geisler <mg@lazybytes.net>
parents:
8936
diff
changeset
|
765 # reposetup. Programs like TortoiseHg will call _dispatch several |
1c83938b6a8e
extensions: load and configure extensions in well-defined phases
Martin Geisler <mg@lazybytes.net>
parents:
8936
diff
changeset
|
766 # times so we keep track of configured extensions in _loaded. |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
767 extensions.loadall(lui) |
9410
1c83938b6a8e
extensions: load and configure extensions in well-defined phases
Martin Geisler <mg@lazybytes.net>
parents:
8936
diff
changeset
|
768 exts = [ext for ext in extensions.extensions() if ext[0] not in _loaded] |
11555
d8d0fc3988ca
color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents:
11330
diff
changeset
|
769 # Propagate any changes to lui.__class__ by extensions |
d8d0fc3988ca
color/progress: subclass ui instead of using wrapfunction (issue2096)
Brodie Rao <brodie@bitheap.org>
parents:
11330
diff
changeset
|
770 ui.__class__ = lui.__class__ |
5828
863e237b58fb
dispatch: allow extensions to provide setup code
Kirill Smelkov <kirr@mns.spb.ru>
parents:
5664
diff
changeset
|
771 |
9660
e0eae93e6c67
extensions: changed to call extsetup() from extensions.loadall()
Yuya Nishihara <yuya@tcha.org>
parents:
9610
diff
changeset
|
772 # (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
|
773 |
9410
1c83938b6a8e
extensions: load and configure extensions in well-defined phases
Martin Geisler <mg@lazybytes.net>
parents:
8936
diff
changeset
|
774 for name, module in exts: |
5192
60acf1432ee0
Move cmdtable and reposetup handling out of extensions.py
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5178
diff
changeset
|
775 cmdtable = getattr(module, 'cmdtable', {}) |
60acf1432ee0
Move cmdtable and reposetup handling out of extensions.py
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5178
diff
changeset
|
776 overrides = [cmd for cmd in cmdtable if cmd in commands.table] |
60acf1432ee0
Move cmdtable and reposetup handling out of extensions.py
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5178
diff
changeset
|
777 if overrides: |
60acf1432ee0
Move cmdtable and reposetup handling out of extensions.py
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5178
diff
changeset
|
778 ui.warn(_("extension '%s' overrides commands: %s\n") |
60acf1432ee0
Move cmdtable and reposetup handling out of extensions.py
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5178
diff
changeset
|
779 % (name, " ".join(overrides))) |
60acf1432ee0
Move cmdtable and reposetup handling out of extensions.py
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5178
diff
changeset
|
780 commands.table.update(cmdtable) |
8304
991ca609ccd6
dispatch: remember loaded extensions in a real set
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
781 _loaded.add(name) |
8655 | 782 |
9410
1c83938b6a8e
extensions: load and configure extensions in well-defined phases
Martin Geisler <mg@lazybytes.net>
parents:
8936
diff
changeset
|
783 # (reposetup is handled in hg.repository) |
1c83938b6a8e
extensions: load and configure extensions in well-defined phases
Martin Geisler <mg@lazybytes.net>
parents:
8936
diff
changeset
|
784 |
8655 | 785 addaliases(lui, commands.table) |
786 | |
22377
f98abe3146b2
dispatch: check shell alias again after loading extensions (issue4355)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22376
diff
changeset
|
787 if not lui.configbool("ui", "strict"): |
f98abe3146b2
dispatch: check shell alias again after loading extensions (issue4355)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22376
diff
changeset
|
788 # All aliases and commands are completely defined, now. |
f98abe3146b2
dispatch: check shell alias again after loading extensions (issue4355)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22376
diff
changeset
|
789 # Check abbreviation/ambiguity of shell alias again, because shell |
f98abe3146b2
dispatch: check shell alias again after loading extensions (issue4355)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22376
diff
changeset
|
790 # alias may cause failure of "_parse" (see issue4355) |
f98abe3146b2
dispatch: check shell alias again after loading extensions (issue4355)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22376
diff
changeset
|
791 shellaliasfn = _checkshellalias(lui, ui, args, precheck=False) |
f98abe3146b2
dispatch: check shell alias again after loading extensions (issue4355)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22376
diff
changeset
|
792 if shellaliasfn: |
f98abe3146b2
dispatch: check shell alias again after loading extensions (issue4355)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22376
diff
changeset
|
793 return shellaliasfn() |
f98abe3146b2
dispatch: check shell alias again after loading extensions (issue4355)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
22376
diff
changeset
|
794 |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
795 # check for fallback encoding |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
796 fallback = lui.config('ui', 'fallbackencoding') |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
797 if fallback: |
7948
de377b1a9a84
move encoding bits from util to encoding
Matt Mackall <mpm@selenic.com>
parents:
7873
diff
changeset
|
798 encoding.fallbackencoding = fallback |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
799 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
800 fullargs = args |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
801 cmd, func, args, options, cmdoptions = _parse(lui, args) |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
802 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
803 if options["config"]: |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26421
diff
changeset
|
804 raise error.Abort(_("option --config may not be abbreviated!")) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
805 if options["cwd"]: |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26421
diff
changeset
|
806 raise error.Abort(_("option --cwd may not be abbreviated!")) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
807 if options["repository"]: |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26421
diff
changeset
|
808 raise error.Abort(_( |
15781
cc2da4a5ed9a
dispatch: lowercase abort message
Martin Geisler <mg@aragost.com>
parents:
15632
diff
changeset
|
809 "option -R has to be separated from other options (e.g. not -qR) " |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
810 "and --repository may only be abbreviated as --repo!")) |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
811 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
812 if options["encoding"]: |
7948
de377b1a9a84
move encoding bits from util to encoding
Matt Mackall <mpm@selenic.com>
parents:
7873
diff
changeset
|
813 encoding.encoding = options["encoding"] |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
814 if options["encodingmode"]: |
7948
de377b1a9a84
move encoding bits from util to encoding
Matt Mackall <mpm@selenic.com>
parents:
7873
diff
changeset
|
815 encoding.encodingmode = options["encodingmode"] |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
816 if options["time"]: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
817 def get_times(): |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
818 t = os.times() |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
819 if t[4] == 0.0: # Windows leaves this as zero, so use time.clock() |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
820 t = (t[0], t[1], t[2], t[3], time.clock()) |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
821 return t |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
822 s = get_times() |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
823 def print_time(): |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
824 t = get_times() |
16933
30143c3dd102
dispatch: lowercase --time message
Martin Geisler <mg@aragost.com>
parents:
16839
diff
changeset
|
825 ui.warn(_("time: real %.3f secs (user %.3f+%.3f sys %.3f+%.3f)\n") % |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
826 (t[4]-s[4], t[0]-s[0], t[2]-s[2], t[1]-s[1], t[3]-s[3])) |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
827 atexit.register(print_time) |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
828 |
14752
99ace3cb7352
dispatch: set global options on the request repo.ui
Idan Kamara <idankk86@gmail.com>
parents:
14748
diff
changeset
|
829 uis = set([ui, lui]) |
99ace3cb7352
dispatch: set global options on the request repo.ui
Idan Kamara <idankk86@gmail.com>
parents:
14748
diff
changeset
|
830 |
99ace3cb7352
dispatch: set global options on the request repo.ui
Idan Kamara <idankk86@gmail.com>
parents:
14748
diff
changeset
|
831 if req.repo: |
99ace3cb7352
dispatch: set global options on the request repo.ui
Idan Kamara <idankk86@gmail.com>
parents:
14748
diff
changeset
|
832 uis.add(req.repo.ui) |
99ace3cb7352
dispatch: set global options on the request repo.ui
Idan Kamara <idankk86@gmail.com>
parents:
14748
diff
changeset
|
833 |
14992
188936b334b1
dispatch: make sure global options on the command line take precedence
Idan Kamara <idankk86@gmail.com>
parents:
14914
diff
changeset
|
834 if options['verbose'] or options['debug'] or options['quiet']: |
188936b334b1
dispatch: make sure global options on the command line take precedence
Idan Kamara <idankk86@gmail.com>
parents:
14914
diff
changeset
|
835 for opt in ('verbose', 'debug', 'quiet'): |
188936b334b1
dispatch: make sure global options on the command line take precedence
Idan Kamara <idankk86@gmail.com>
parents:
14914
diff
changeset
|
836 val = str(bool(options[opt])) |
14752
99ace3cb7352
dispatch: set global options on the request repo.ui
Idan Kamara <idankk86@gmail.com>
parents:
14748
diff
changeset
|
837 for ui_ in uis: |
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
|
838 ui_.setconfig('ui', opt, val, '--' + opt) |
14992
188936b334b1
dispatch: make sure global options on the command line take precedence
Idan Kamara <idankk86@gmail.com>
parents:
14914
diff
changeset
|
839 |
188936b334b1
dispatch: make sure global options on the command line take precedence
Idan Kamara <idankk86@gmail.com>
parents:
14914
diff
changeset
|
840 if options['traceback']: |
188936b334b1
dispatch: make sure global options on the command line take precedence
Idan Kamara <idankk86@gmail.com>
parents:
14914
diff
changeset
|
841 for ui_ in uis: |
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
|
842 ui_.setconfig('ui', 'traceback', 'on', '--traceback') |
14748
1b8c70c9f47c
dispatch: make sure unspecified global ui options don't override old values
Idan Kamara <idankk86@gmail.com>
parents:
14744
diff
changeset
|
843 |
8136
6b5522cb2ad2
ui: refactor option setting
Matt Mackall <mpm@selenic.com>
parents:
8024
diff
changeset
|
844 if options['noninteractive']: |
14752
99ace3cb7352
dispatch: set global options on the request repo.ui
Idan Kamara <idankk86@gmail.com>
parents:
14748
diff
changeset
|
845 for ui_ in uis: |
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
|
846 ui_.setconfig('ui', 'interactive', 'off', '-y') |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
847 |
13328
a939f08fae9c
url: add --insecure option to bypass verification of ssl certificates
Yuya Nishihara <yuya@tcha.org>
parents:
12932
diff
changeset
|
848 if cmdoptions.get('insecure', False): |
14752
99ace3cb7352
dispatch: set global options on the request repo.ui
Idan Kamara <idankk86@gmail.com>
parents:
14748
diff
changeset
|
849 for ui_ in uis: |
24290
b76d8c641746
ssl: set explicit symbol "!" to web.cacerts to disable SSL verification (BC)
Yuya Nishihara <yuya@tcha.org>
parents:
24222
diff
changeset
|
850 ui_.setconfig('web', 'cacerts', '!', '--insecure') |
13328
a939f08fae9c
url: add --insecure option to bypass verification of ssl certificates
Yuya Nishihara <yuya@tcha.org>
parents:
12932
diff
changeset
|
851 |
15020 | 852 if options['version']: |
853 return commands.version_(ui) | |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
854 if options['help']: |
27325
eadbbd14bdc1
help: fix help -c/help -e/help -k
timeless <timeless@mozdev.org>
parents:
27113
diff
changeset
|
855 return commands.help_(ui, cmd, command=cmd is not None) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
856 elif not cmd: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
857 return commands.help_(ui, 'shortlist') |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
858 |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
859 repo = None |
11330
713ae78bb583
provide pre- and post- hooks with parsed command line arguments.
Chad Dombrova <chadrik@gmail.com>
parents:
11305
diff
changeset
|
860 cmdpats = args[:] |
28313
aa73d6a5d9ea
dispatch: store norepo/optionalrepo/inferrepo attributes in function (API)
Yuya Nishihara <yuya@tcha.org>
parents:
28263
diff
changeset
|
861 if not func.norepo: |
14510
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
862 # use the repo from the request only if we don't have -R |
14863
1c148e935244
dispatch: don't use request repo if we have --cwd
Idan Kamara <idankk86@gmail.com>
parents:
14761
diff
changeset
|
863 if not rpath and not cwd: |
14510
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
864 repo = req.repo |
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
865 |
14744
23325c5ef6a7
dispatch: set descriptors on the request repo.ui
Idan Kamara <idankk86@gmail.com>
parents:
14743
diff
changeset
|
866 if repo: |
23325c5ef6a7
dispatch: set descriptors on the request repo.ui
Idan Kamara <idankk86@gmail.com>
parents:
14743
diff
changeset
|
867 # set the descriptors of the repo ui to those of ui |
23325c5ef6a7
dispatch: set descriptors on the request repo.ui
Idan Kamara <idankk86@gmail.com>
parents:
14743
diff
changeset
|
868 repo.ui.fin = ui.fin |
23325c5ef6a7
dispatch: set descriptors on the request repo.ui
Idan Kamara <idankk86@gmail.com>
parents:
14743
diff
changeset
|
869 repo.ui.fout = ui.fout |
23325c5ef6a7
dispatch: set descriptors on the request repo.ui
Idan Kamara <idankk86@gmail.com>
parents:
14743
diff
changeset
|
870 repo.ui.ferr = ui.ferr |
23325c5ef6a7
dispatch: set descriptors on the request repo.ui
Idan Kamara <idankk86@gmail.com>
parents:
14743
diff
changeset
|
871 else: |
14510
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
872 try: |
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
873 repo = hg.repository(ui, path=path) |
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
874 if not repo.local(): |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26421
diff
changeset
|
875 raise error.Abort(_("repository '%s' is not local") % path) |
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
|
876 repo.ui.setconfig("bundle", "mainreporoot", repo.root, 'repo') |
14510
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
877 except error.RequirementError: |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
878 raise |
14510
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
879 except error.RepoError: |
26142
7332bf4ae959
dispatch: error out on invalid -R path even if optionalrepo (issue4805) (BC)
Yuya Nishihara <yuya@tcha.org>
parents:
25932
diff
changeset
|
880 if rpath and rpath[-1]: # invalid -R path |
7332bf4ae959
dispatch: error out on invalid -R path even if optionalrepo (issue4805) (BC)
Yuya Nishihara <yuya@tcha.org>
parents:
25932
diff
changeset
|
881 raise |
28313
aa73d6a5d9ea
dispatch: store norepo/optionalrepo/inferrepo attributes in function (API)
Yuya Nishihara <yuya@tcha.org>
parents:
28263
diff
changeset
|
882 if not func.optionalrepo: |
aa73d6a5d9ea
dispatch: store norepo/optionalrepo/inferrepo attributes in function (API)
Yuya Nishihara <yuya@tcha.org>
parents:
28263
diff
changeset
|
883 if func.inferrepo and args and not path: |
aa73d6a5d9ea
dispatch: store norepo/optionalrepo/inferrepo attributes in function (API)
Yuya Nishihara <yuya@tcha.org>
parents:
28263
diff
changeset
|
884 # try to infer -R from command args |
14510
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
885 repos = map(cmdutil.findrepo, args) |
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
886 guess = repos[0] |
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
887 if guess and repos.count(guess) == len(repos): |
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
888 req.args = ['--repository', guess] + fullargs |
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
889 return _dispatch(req) |
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
890 if not path: |
14914
41c3a71c318d
dispatch: avoid double backslashes in error message
David Golub <davidg@fogcreek.com>
parents:
14863
diff
changeset
|
891 raise error.RepoError(_("no repository found in '%s'" |
16683 | 892 " (.hg not found)") |
893 % os.getcwd()) | |
14510
eccbb9980ada
dispatch: add repo to the request
Idan Kamara <idankk86@gmail.com>
parents:
14439
diff
changeset
|
894 raise |
14743
84a680daa4b2
dispatch: pass the correct ui to runcommand
Idan Kamara <idankk86@gmail.com>
parents:
14727
diff
changeset
|
895 if repo: |
84a680daa4b2
dispatch: pass the correct ui to runcommand
Idan Kamara <idankk86@gmail.com>
parents:
14727
diff
changeset
|
896 ui = repo.ui |
20330
69a0d22b9677
dispatch: take --hidden from individual commands into account
Julien Cristau <julien.cristau@logilab.fr>
parents:
20328
diff
changeset
|
897 if options['hidden']: |
69a0d22b9677
dispatch: take --hidden from individual commands into account
Julien Cristau <julien.cristau@logilab.fr>
parents:
20328
diff
changeset
|
898 repo = repo.unfiltered() |
7388
5751631246de
dispatch: generalize signature checking for extension command wrapping
Matt Mackall <mpm@selenic.com>
parents:
7280
diff
changeset
|
899 args.insert(0, repo) |
7733
30e95eafc1d0
warn if --repository provided for norepo commands
Matt Mackall <mpm@selenic.com>
parents:
7646
diff
changeset
|
900 elif rpath: |
11600
76454cbc11e4
mark ui.warn strings for translation
Martin Geisler <mg@lazybytes.net>
parents:
11555
diff
changeset
|
901 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
|
902 |
11985
81edef14922e
log: add logging for commands
Matt Mackall <mpm@selenic.com>
parents:
11714
diff
changeset
|
903 msg = ' '.join(' ' in a and repr(a) or a for a in fullargs) |
18758
6aca4d1c744e
blackbox: fix exception when logging commands with format characters
Durham Goode <durham@fb.com>
parents:
18693
diff
changeset
|
904 ui.log("command", '%s\n', msg) |
7388
5751631246de
dispatch: generalize signature checking for extension command wrapping
Matt Mackall <mpm@selenic.com>
parents:
7280
diff
changeset
|
905 d = lambda: util.checksignature(func)(ui, *args, **cmdoptions) |
13382
d747774ca9da
Make sure bundlerepo doesn't leak temp files (issue2491)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13328
diff
changeset
|
906 try: |
19229
41e39a0299cb
blackbox: fix recording exit codes (issue3938)
Durham Goode <durham@fb.com>
parents:
19099
diff
changeset
|
907 return runcommand(lui, repo, cmd, fullargs, ui, options, d, |
41e39a0299cb
blackbox: fix recording exit codes (issue3938)
Durham Goode <durham@fb.com>
parents:
19099
diff
changeset
|
908 cmdpats, cmdoptions) |
13382
d747774ca9da
Make sure bundlerepo doesn't leak temp files (issue2491)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13328
diff
changeset
|
909 finally: |
14727
d4b9d3b91ce7
dispatch: check for None before closing repo
Idan Kamara <idankk86@gmail.com>
parents:
14712
diff
changeset
|
910 if repo and repo != req.repo: |
13382
d747774ca9da
Make sure bundlerepo doesn't leak temp files (issue2491)
Adrian Buehlmann <adrian@cadifra.com>
parents:
13328
diff
changeset
|
911 repo.close() |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
912 |
16392
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
913 def lsprofile(ui, func, fp): |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
914 format = ui.config('profiling', 'format', default='text') |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
915 field = ui.config('profiling', 'sort', default='inlinetime') |
18548
e71c2ff93167
profiling: introduce limit configuration option
Mads Kiilerich <madski@unity3d.com>
parents:
18303
diff
changeset
|
916 limit = ui.configint('profiling', 'limit', default=30) |
25277
0f2dcbccf9c9
profile: disable nested report in lsprof by default
Matt Mackall <mpm@selenic.com>
parents:
25242
diff
changeset
|
917 climit = ui.configint('profiling', 'nested', default=0) |
16392
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
918 |
16686
67964cda8701
cleanup: "not x in y" -> "x not in y"
Brodie Rao <brodie@sf.io>
parents:
16683
diff
changeset
|
919 if format not in ['text', 'kcachegrind']: |
16392
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
920 ui.warn(_("unrecognized profiling format '%s'" |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
921 " - Ignored\n") % format) |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
922 format = 'text' |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
923 |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
924 try: |
25932
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
925 from . import lsprof |
16392
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
926 except ImportError: |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26421
diff
changeset
|
927 raise error.Abort(_( |
16392
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
928 'lsprof not available - install from ' |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
929 'http://codespeak.net/svn/user/arigo/hack/misc/lsprof/')) |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
930 p = lsprof.Profiler() |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
931 p.enable(subcalls=True) |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
932 try: |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
933 return func() |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
934 finally: |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
935 p.disable() |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
936 |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
937 if format == 'kcachegrind': |
25932
d491f289045f
dispatch: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25834
diff
changeset
|
938 from . import lsprofcalltree |
16392
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
939 calltree = lsprofcalltree.KCacheGrind(p) |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
940 calltree.output(fp) |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
941 else: |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
942 # format == 'text' |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
943 stats = lsprof.Stats(p.getstats()) |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
944 stats.sort(field) |
18548
e71c2ff93167
profiling: introduce limit configuration option
Mads Kiilerich <madski@unity3d.com>
parents:
18303
diff
changeset
|
945 stats.pprint(limit=limit, file=fp, climit=climit) |
16392
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
946 |
25187
670c1df688fd
dispatch: add support for python-flamegraph[0] profiling
Augie Fackler <augie@google.com>
parents:
24290
diff
changeset
|
947 def flameprofile(ui, func, fp): |
670c1df688fd
dispatch: add support for python-flamegraph[0] profiling
Augie Fackler <augie@google.com>
parents:
24290
diff
changeset
|
948 try: |
670c1df688fd
dispatch: add support for python-flamegraph[0] profiling
Augie Fackler <augie@google.com>
parents:
24290
diff
changeset
|
949 from flamegraph import flamegraph |
670c1df688fd
dispatch: add support for python-flamegraph[0] profiling
Augie Fackler <augie@google.com>
parents:
24290
diff
changeset
|
950 except ImportError: |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26421
diff
changeset
|
951 raise error.Abort(_( |
25187
670c1df688fd
dispatch: add support for python-flamegraph[0] profiling
Augie Fackler <augie@google.com>
parents:
24290
diff
changeset
|
952 'flamegraph not available - install from ' |
670c1df688fd
dispatch: add support for python-flamegraph[0] profiling
Augie Fackler <augie@google.com>
parents:
24290
diff
changeset
|
953 'https://github.com/evanhempel/python-flamegraph')) |
25834
aca8ae2b0cb2
profiler: mark developer-only config option
Matt Mackall <mpm@selenic.com>
parents:
25833
diff
changeset
|
954 # developer config: profiling.freq |
25187
670c1df688fd
dispatch: add support for python-flamegraph[0] profiling
Augie Fackler <augie@google.com>
parents:
24290
diff
changeset
|
955 freq = ui.configint('profiling', 'freq', default=1000) |
670c1df688fd
dispatch: add support for python-flamegraph[0] profiling
Augie Fackler <augie@google.com>
parents:
24290
diff
changeset
|
956 filter_ = None |
670c1df688fd
dispatch: add support for python-flamegraph[0] profiling
Augie Fackler <augie@google.com>
parents:
24290
diff
changeset
|
957 collapse_recursion = True |
670c1df688fd
dispatch: add support for python-flamegraph[0] profiling
Augie Fackler <augie@google.com>
parents:
24290
diff
changeset
|
958 thread = flamegraph.ProfileThread(fp, 1.0 / freq, |
670c1df688fd
dispatch: add support for python-flamegraph[0] profiling
Augie Fackler <augie@google.com>
parents:
24290
diff
changeset
|
959 filter_, collapse_recursion) |
670c1df688fd
dispatch: add support for python-flamegraph[0] profiling
Augie Fackler <augie@google.com>
parents:
24290
diff
changeset
|
960 start_time = time.clock() |
670c1df688fd
dispatch: add support for python-flamegraph[0] profiling
Augie Fackler <augie@google.com>
parents:
24290
diff
changeset
|
961 try: |
670c1df688fd
dispatch: add support for python-flamegraph[0] profiling
Augie Fackler <augie@google.com>
parents:
24290
diff
changeset
|
962 thread.start() |
670c1df688fd
dispatch: add support for python-flamegraph[0] profiling
Augie Fackler <augie@google.com>
parents:
24290
diff
changeset
|
963 func() |
670c1df688fd
dispatch: add support for python-flamegraph[0] profiling
Augie Fackler <augie@google.com>
parents:
24290
diff
changeset
|
964 finally: |
670c1df688fd
dispatch: add support for python-flamegraph[0] profiling
Augie Fackler <augie@google.com>
parents:
24290
diff
changeset
|
965 thread.stop() |
670c1df688fd
dispatch: add support for python-flamegraph[0] profiling
Augie Fackler <augie@google.com>
parents:
24290
diff
changeset
|
966 thread.join() |
27615
4030d3b79953
dispatch: use print function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27516
diff
changeset
|
967 print('Collected %d stack frames (%d unique) in %2.2f seconds.' % ( |
25187
670c1df688fd
dispatch: add support for python-flamegraph[0] profiling
Augie Fackler <augie@google.com>
parents:
24290
diff
changeset
|
968 time.clock() - start_time, thread.num_frames(), |
27615
4030d3b79953
dispatch: use print function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27516
diff
changeset
|
969 thread.num_frames(unique=True))) |
25187
670c1df688fd
dispatch: add support for python-flamegraph[0] profiling
Augie Fackler <augie@google.com>
parents:
24290
diff
changeset
|
970 |
670c1df688fd
dispatch: add support for python-flamegraph[0] profiling
Augie Fackler <augie@google.com>
parents:
24290
diff
changeset
|
971 |
16392
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
972 def statprofile(ui, func, fp): |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
973 try: |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
974 import statprof |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
975 except ImportError: |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26421
diff
changeset
|
976 raise error.Abort(_( |
16392
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
977 'statprof not available - install using "easy_install statprof"')) |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
978 |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
979 freq = ui.configint('profiling', 'freq', default=1000) |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
980 if freq > 0: |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
981 statprof.reset(freq) |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
982 else: |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
983 ui.warn(_("invalid sampling frequency '%s' - ignoring\n") % freq) |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
984 |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
985 statprof.start() |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
986 try: |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
987 return func() |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
988 finally: |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
989 statprof.stop() |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
990 statprof.display(fp) |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
991 |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
992 def _runcommand(ui, options, cmd, cmdfunc): |
26186
eb2187ebdf8a
profiling: add config option for enabling profiling
Durham Goode <durham@fb.com>
parents:
26142
diff
changeset
|
993 """Enables the profiler if applicable. |
eb2187ebdf8a
profiling: add config option for enabling profiling
Durham Goode <durham@fb.com>
parents:
26142
diff
changeset
|
994 |
eb2187ebdf8a
profiling: add config option for enabling profiling
Durham Goode <durham@fb.com>
parents:
26142
diff
changeset
|
995 ``profiling.enabled`` - boolean config that enables or disables profiling |
eb2187ebdf8a
profiling: add config option for enabling profiling
Durham Goode <durham@fb.com>
parents:
26142
diff
changeset
|
996 """ |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
997 def checkargs(): |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
998 try: |
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
999 return cmdfunc() |
7646 | 1000 except error.SignatureError: |
11287
b901bb751999
error: change ParseError to CommandError
Matt Mackall <mpm@selenic.com>
parents:
11209
diff
changeset
|
1001 raise error.CommandError(cmd, _("invalid arguments")) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
1002 |
26186
eb2187ebdf8a
profiling: add config option for enabling profiling
Durham Goode <durham@fb.com>
parents:
26142
diff
changeset
|
1003 if options['profile'] or ui.configbool('profiling', 'enabled'): |
16392
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
1004 profiler = os.getenv('HGPROF') |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
1005 if profiler is None: |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
1006 profiler = ui.config('profiling', 'type', default='ls') |
25187
670c1df688fd
dispatch: add support for python-flamegraph[0] profiling
Augie Fackler <augie@google.com>
parents:
24290
diff
changeset
|
1007 if profiler not in ('ls', 'stat', 'flame'): |
16392
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
1008 ui.warn(_("unrecognized profiler '%s' - ignored\n") % profiler) |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
1009 profiler = 'ls' |
8023
fd9debb3ea1b
profiling: Adding a profiling.format config variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8022
diff
changeset
|
1010 |
8022
4f3fdfaa3874
profiling: Adding profiling.output config variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8021
diff
changeset
|
1011 output = ui.config('profiling', 'output') |
4f3fdfaa3874
profiling: Adding profiling.output config variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8021
diff
changeset
|
1012 |
26191
39a0b11158d8
profiling: allow logging profile to the blackbox
Durham Goode <durham@fb.com>
parents:
26186
diff
changeset
|
1013 if output == 'blackbox': |
39a0b11158d8
profiling: allow logging profile to the blackbox
Durham Goode <durham@fb.com>
parents:
26186
diff
changeset
|
1014 import StringIO |
39a0b11158d8
profiling: allow logging profile to the blackbox
Durham Goode <durham@fb.com>
parents:
26186
diff
changeset
|
1015 fp = StringIO.StringIO() |
39a0b11158d8
profiling: allow logging profile to the blackbox
Durham Goode <durham@fb.com>
parents:
26186
diff
changeset
|
1016 elif output: |
9610
d78fe60f6bda
make path expanding more consistent
Alexander Solovyov <piranha@piranha.org.ua>
parents:
9569
diff
changeset
|
1017 path = ui.expandpath(output) |
16392
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
1018 fp = open(path, 'wb') |
8022
4f3fdfaa3874
profiling: Adding profiling.output config variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8021
diff
changeset
|
1019 else: |
16392
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
1020 fp = sys.stderr |
8022
4f3fdfaa3874
profiling: Adding profiling.output config variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8021
diff
changeset
|
1021 |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
1022 try: |
16392
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
1023 if profiler == 'ls': |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
1024 return lsprofile(ui, checkargs, fp) |
25187
670c1df688fd
dispatch: add support for python-flamegraph[0] profiling
Augie Fackler <augie@google.com>
parents:
24290
diff
changeset
|
1025 elif profiler == 'flame': |
670c1df688fd
dispatch: add support for python-flamegraph[0] profiling
Augie Fackler <augie@google.com>
parents:
24290
diff
changeset
|
1026 return flameprofile(ui, checkargs, fp) |
16392
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
1027 else: |
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
1028 return statprofile(ui, checkargs, fp) |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
1029 finally: |
8022
4f3fdfaa3874
profiling: Adding profiling.output config variable
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
8021
diff
changeset
|
1030 if output: |
26191
39a0b11158d8
profiling: allow logging profile to the blackbox
Durham Goode <durham@fb.com>
parents:
26186
diff
changeset
|
1031 if output == 'blackbox': |
39a0b11158d8
profiling: allow logging profile to the blackbox
Durham Goode <durham@fb.com>
parents:
26186
diff
changeset
|
1032 val = "Profile:\n%s" % fp.getvalue() |
39a0b11158d8
profiling: allow logging profile to the blackbox
Durham Goode <durham@fb.com>
parents:
26186
diff
changeset
|
1033 # ui.log treats the input as a format string, |
39a0b11158d8
profiling: allow logging profile to the blackbox
Durham Goode <durham@fb.com>
parents:
26186
diff
changeset
|
1034 # so we need to escape any % signs. |
39a0b11158d8
profiling: allow logging profile to the blackbox
Durham Goode <durham@fb.com>
parents:
26186
diff
changeset
|
1035 val = val.replace('%', '%%') |
39a0b11158d8
profiling: allow logging profile to the blackbox
Durham Goode <durham@fb.com>
parents:
26186
diff
changeset
|
1036 ui.log('profile', val) |
16392
ee3f423df1b4
dispatch: add support for statprof as a profiler
Bryan O'Sullivan <bryano@fb.com>
parents:
16295
diff
changeset
|
1037 fp.close() |
5178
18a9fbb5cd78
dispatch: move command dispatching into its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
1038 else: |
6141
90e5c82a3859
Backed out changeset b913d3aacddc (see issue971/msg5317)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
5995
diff
changeset
|
1039 return checkargs() |