bzr branch
http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
5609.16.1
by John Arbash Meinel
Fix bug #713258. Restore logging of bytes transferred. |
1 |
# Copyright (C) 2005-2011 Canonical Ltd
|
1610.1.4
by Martin Pool
Doc |
2 |
#
|
1
by mbp at sourcefrog
import from baz patch-364 |
3 |
# This program is free software; you can redistribute it and/or modify
|
4 |
# it under the terms of the GNU General Public License as published by
|
|
5 |
# the Free Software Foundation; either version 2 of the License, or
|
|
6 |
# (at your option) any later version.
|
|
1610.1.4
by Martin Pool
Doc |
7 |
#
|
1
by mbp at sourcefrog
import from baz patch-364 |
8 |
# This program is distributed in the hope that it will be useful,
|
9 |
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
10 |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
11 |
# GNU General Public License for more details.
|
|
1610.1.4
by Martin Pool
Doc |
12 |
#
|
1
by mbp at sourcefrog
import from baz patch-364 |
13 |
# You should have received a copy of the GNU General Public License
|
14 |
# along with this program; if not, write to the Free Software
|
|
4183.7.1
by Sabin Iacob
update FSF mailing address |
15 |
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
1
by mbp at sourcefrog
import from baz patch-364 |
16 |
|
1095
by Martin Pool
todo |
17 |
# TODO: Define arguments by objects, rather than just using names.
|
18 |
# Those objects can specify the expected type of the argument, which
|
|
1610.1.4
by Martin Pool
Doc |
19 |
# would help with validation and shell completion. They could also provide
|
20 |
# help/explanation for that argument in a structured way.
|
|
21 |
||
22 |
# TODO: Specific "examples" property on commands for consistent formatting.
|
|
1095
by Martin Pool
todo |
23 |
|
7479.2.1
by Jelmer Vernooij
Drop python2 support. |
24 |
import contextlib |
1996.3.1
by John Arbash Meinel
Demandloading builtins.py drops our load time from 350ms to 291ms |
25 |
import os |
26 |
import sys |
|
27 |
||
7045.4.23
by Jelmer Vernooij
Fix some help tests. |
28 |
from . import ( |
29 |
i18n, |
|
30 |
option, |
|
31 |
osutils, |
|
32 |
)
|
|
33 |
||
6624
by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes') |
34 |
from .lazy_import import lazy_import |
1996.3.1
by John Arbash Meinel
Demandloading builtins.py drops our load time from 350ms to 291ms |
35 |
lazy_import(globals(), """ |
1857.1.1
by Aaron Bentley
Use optparse for parsing options |
36 |
import errno
|
1
by mbp at sourcefrog
import from baz patch-364 |
37 |
|
6622.1.34
by Jelmer Vernooij
Rename brzlib => breezy. |
38 |
import breezy
|
39 |
from breezy import (
|
|
4913.5.24
by Gordon Tyler
Added cmdline.split function, which replaces commands.shlex_split_unicode. |
40 |
cmdline,
|
2095.5.2
by Martin Pool
save commit message if commit fails (#32054) |
41 |
debug,
|
1996.3.1
by John Arbash Meinel
Demandloading builtins.py drops our load time from 350ms to 291ms |
42 |
trace,
|
4792.8.9
by Martin Pool
Send Command.outf through UIFactory |
43 |
ui,
|
1996.3.1
by John Arbash Meinel
Demandloading builtins.py drops our load time from 350ms to 291ms |
44 |
)
|
45 |
""") |
|
46 |
||
6624
by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes') |
47 |
from .hooks import Hooks |
48 |
from .i18n import gettext |
|
4119.3.8
by Robert Collins
Get missing command support sorted out. |
49 |
# Compatibility - Option used to be in commands.
|
6624
by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes') |
50 |
from .option import Option |
6651.4.2
by Martin
Move plugin_name logic from commands to plugin to fix test |
51 |
from .plugin import disable_plugins, load_plugins, plugin_name |
6731.1.4
by Jelmer Vernooij
Move BadOptionValue to breezy.option. |
52 |
from . import errors, registry |
1996.3.1
by John Arbash Meinel
Demandloading builtins.py drops our load time from 350ms to 291ms |
53 |
|
1
by mbp at sourcefrog
import from baz patch-364 |
54 |
|
7490.61.1
by Jelmer Vernooij
Rename BzrCommandError to CommandError. |
55 |
class BzrOptionError(errors.CommandError): |
6731.1.4
by Jelmer Vernooij
Move BadOptionValue to breezy.option. |
56 |
|
57 |
_fmt = "Error in command line options" |
|
58 |
||
59 |
||
6734.1.1
by Jelmer Vernooij
Fix more imports. |
60 |
class CommandAvailableInPlugin(Exception): |
61 |
||
62 |
internal_error = False |
|
63 |
||
64 |
def __init__(self, cmd_name, plugin_metadata, provider): |
|
65 |
||
66 |
self.plugin_metadata = plugin_metadata |
|
67 |
self.cmd_name = cmd_name |
|
68 |
self.provider = provider |
|
69 |
||
70 |
def __str__(self): |
|
71 |
||
72 |
_fmt = ('"%s" is not a standard brz command. \n' |
|
73 |
'However, the following official plugin provides this command: %s\n' |
|
74 |
'You can install it by going to: %s' |
|
75 |
% (self.cmd_name, self.plugin_metadata['name'], |
|
76 |
self.plugin_metadata['url'])) |
|
77 |
||
78 |
return _fmt |
|
79 |
||
80 |
||
3785.1.2
by Aaron Bentley
Avoid getting plugins unnecessarily |
81 |
class CommandInfo(object): |
82 |
"""Information about a command.""" |
|
83 |
||
84 |
def __init__(self, aliases): |
|
85 |
"""The list of aliases for the command.""" |
|
86 |
self.aliases = aliases |
|
87 |
||
88 |
@classmethod
|
|
89 |
def from_command(klass, command): |
|
90 |
"""Factory to construct a CommandInfo from a command.""" |
|
91 |
return klass(command.aliases) |
|
92 |
||
93 |
||
3785.1.1
by Aaron Bentley
Switch from dict to Registry for plugin_cmds |
94 |
class CommandRegistry(registry.Registry): |
5018.1.9
by Martin Pool
Handle aliases directly in CommandRegistry |
95 |
"""Special registry mapping command names to command classes. |
7143.15.2
by Jelmer Vernooij
Run autopep8. |
96 |
|
5018.1.9
by Martin Pool
Handle aliases directly in CommandRegistry |
97 |
:ivar overridden_registry: Look in this registry for commands being
|
98 |
overridden by this registry. This can be used to tell plugin commands
|
|
99 |
about the builtin they're decorating.
|
|
5018.1.6
by Martin Pool
Avoid more cases of using a dict of all builtins |
100 |
"""
|
101 |
||
5018.1.9
by Martin Pool
Handle aliases directly in CommandRegistry |
102 |
def __init__(self): |
103 |
registry.Registry.__init__(self) |
|
104 |
self.overridden_registry = None |
|
105 |
# map from aliases to the real command that implements the name
|
|
106 |
self._alias_dict = {} |
|
107 |
||
108 |
def get(self, command_name): |
|
109 |
real_name = self._alias_dict.get(command_name, command_name) |
|
110 |
return registry.Registry.get(self, real_name) |
|
111 |
||
3785.1.4
by Aaron Bentley
Enable lazy-loading of commands |
112 |
@staticmethod
|
113 |
def _get_name(command_name): |
|
114 |
if command_name.startswith("cmd_"): |
|
115 |
return _unsquish_command_name(command_name) |
|
116 |
else: |
|
117 |
return command_name |
|
118 |
||
3785.1.1
by Aaron Bentley
Switch from dict to Registry for plugin_cmds |
119 |
def register(self, cmd, decorate=False): |
120 |
"""Utility function to help register a command |
|
121 |
||
122 |
:param cmd: Command subclass to register
|
|
123 |
:param decorate: If true, allow overriding an existing command
|
|
124 |
of the same name; the old command is returned by this function.
|
|
125 |
Otherwise it is an error to try to override an existing command.
|
|
126 |
"""
|
|
127 |
k = cmd.__name__ |
|
3785.1.4
by Aaron Bentley
Enable lazy-loading of commands |
128 |
k_unsquished = self._get_name(k) |
3785.1.1
by Aaron Bentley
Switch from dict to Registry for plugin_cmds |
129 |
try: |
130 |
previous = self.get(k_unsquished) |
|
131 |
except KeyError: |
|
5018.1.6
by Martin Pool
Avoid more cases of using a dict of all builtins |
132 |
previous = None |
133 |
if self.overridden_registry: |
|
134 |
try: |
|
135 |
previous = self.overridden_registry.get(k_unsquished) |
|
136 |
except KeyError: |
|
137 |
pass
|
|
3785.1.2
by Aaron Bentley
Avoid getting plugins unnecessarily |
138 |
info = CommandInfo.from_command(cmd) |
3785.1.1
by Aaron Bentley
Switch from dict to Registry for plugin_cmds |
139 |
try: |
140 |
registry.Registry.register(self, k_unsquished, cmd, |
|
3785.1.2
by Aaron Bentley
Avoid getting plugins unnecessarily |
141 |
override_existing=decorate, info=info) |
3785.1.1
by Aaron Bentley
Switch from dict to Registry for plugin_cmds |
142 |
except KeyError: |
4695.5.2
by Martin Pool
Remove trace.log_error |
143 |
trace.warning('Two plugins defined the same command: %r' % k) |
144 |
trace.warning('Not loading the one in %r' % |
|
7143.15.2
by Jelmer Vernooij
Run autopep8. |
145 |
sys.modules[cmd.__module__]) |
4695.5.2
by Martin Pool
Remove trace.log_error |
146 |
trace.warning('Previously this command was registered from %r' % |
7143.15.2
by Jelmer Vernooij
Run autopep8. |
147 |
sys.modules[previous.__module__]) |
5018.1.9
by Martin Pool
Handle aliases directly in CommandRegistry |
148 |
for a in cmd.aliases: |
149 |
self._alias_dict[a] = k_unsquished |
|
3785.1.1
by Aaron Bentley
Switch from dict to Registry for plugin_cmds |
150 |
return previous |
151 |
||
3785.1.4
by Aaron Bentley
Enable lazy-loading of commands |
152 |
def register_lazy(self, command_name, aliases, module_name): |
153 |
"""Register a command without loading its module. |
|
154 |
||
155 |
:param command_name: The primary name of the command.
|
|
156 |
:param aliases: A list of aliases for the command.
|
|
157 |
:module_name: The module that the command lives in.
|
|
158 |
"""
|
|
159 |
key = self._get_name(command_name) |
|
160 |
registry.Registry.register_lazy(self, key, module_name, command_name, |
|
161 |
info=CommandInfo(aliases)) |
|
5018.1.9
by Martin Pool
Handle aliases directly in CommandRegistry |
162 |
for a in aliases: |
163 |
self._alias_dict[a] = key |
|
3785.1.4
by Aaron Bentley
Enable lazy-loading of commands |
164 |
|
3785.1.1
by Aaron Bentley
Switch from dict to Registry for plugin_cmds |
165 |
|
166 |
plugin_cmds = CommandRegistry() |
|
5018.1.5
by Martin Pool
Rename registry to builtin_command_registry |
167 |
builtin_command_registry = CommandRegistry() |
5018.1.6
by Martin Pool
Avoid more cases of using a dict of all builtins |
168 |
plugin_cmds.overridden_registry = builtin_command_registry |
731
by Martin Pool
- merge plugin patch from john |
169 |
|
170 |
||
1492
by Robert Collins
Support decoration of commands. |
171 |
def register_command(cmd, decorate=False): |
5018.1.7
by Martin Pool
doc |
172 |
"""Register a plugin command. |
173 |
||
7143.15.5
by Jelmer Vernooij
More PEP8 fixes. |
174 |
Should generally be avoided in favor of lazy registration.
|
5018.1.7
by Martin Pool
doc |
175 |
"""
|
731
by Martin Pool
- merge plugin patch from john |
176 |
global plugin_cmds |
3785.1.1
by Aaron Bentley
Switch from dict to Registry for plugin_cmds |
177 |
return plugin_cmds.register(cmd, decorate) |
731
by Martin Pool
- merge plugin patch from john |
178 |
|
179 |
||
350
by Martin Pool
- refactor command aliases into command classes |
180 |
def _squish_command_name(cmd): |
181 |
return 'cmd_' + cmd.replace('-', '_') |
|
182 |
||
183 |
||
184 |
def _unsquish_command_name(cmd): |
|
6809.1.1
by Martin
Apply 2to3 ws_comma fixer |
185 |
return cmd[4:].replace('_', '-') |
350
by Martin Pool
- refactor command aliases into command classes |
186 |
|
914
by Martin Pool
- fix up breakage of 'bzr log -v' by root_id patch |
187 |
|
5018.1.3
by Martin Pool
Put builtin commands into a real registry |
188 |
def _register_builtin_commands(): |
5018.1.5
by Martin Pool
Rename registry to builtin_command_registry |
189 |
if builtin_command_registry.keys(): |
5018.1.3
by Martin Pool
Put builtin commands into a real registry |
190 |
# only load once
|
191 |
return
|
|
6622.1.34
by Jelmer Vernooij
Rename brzlib => breezy. |
192 |
import breezy.builtins |
6656.1.1
by Martin
Apply 2to3 dict fixer and clean up resulting mess using view helpers |
193 |
for cmd_class in _scan_module_for_commands(breezy.builtins): |
5018.1.5
by Martin Pool
Rename registry to builtin_command_registry |
194 |
builtin_command_registry.register(cmd_class) |
6622.1.34
by Jelmer Vernooij
Rename brzlib => breezy. |
195 |
breezy.builtins._register_lazy_builtins() |
4119.3.6
by Robert Collins
Refactor commands.__get_cmd_object to be default-installed hooks. |
196 |
|
197 |
||
198 |
def _scan_module_for_commands(module): |
|
6656.1.1
by Martin
Apply 2to3 dict fixer and clean up resulting mess using view helpers |
199 |
module_dict = module.__dict__ |
200 |
for name in module_dict: |
|
1147
by Martin Pool
- split builtin commands into separate module bzrlib.builtins; |
201 |
if name.startswith("cmd_"): |
6656.1.1
by Martin
Apply 2to3 dict fixer and clean up resulting mess using view helpers |
202 |
yield module_dict[name] |
3943.8.1
by Marius Kruger
remove all trailing whitespace from bzr source |
203 |
|
1162
by Martin Pool
- change Command infrastructure to use (mostly stateless) objects to |
204 |
|
4119.3.6
by Robert Collins
Refactor commands.__get_cmd_object to be default-installed hooks. |
205 |
def _list_bzr_commands(names): |
5018.1.7
by Martin Pool
doc |
206 |
"""Find commands from bzr's core and plugins. |
7143.15.2
by Jelmer Vernooij
Run autopep8. |
207 |
|
7143.15.5
by Jelmer Vernooij
More PEP8 fixes. |
208 |
This is not the public interface, just the default hook called by
|
209 |
all_command_names.
|
|
5018.1.7
by Martin Pool
doc |
210 |
"""
|
4119.3.6
by Robert Collins
Refactor commands.__get_cmd_object to be default-installed hooks. |
211 |
# to eliminate duplicates
|
212 |
names.update(builtin_command_names()) |
|
213 |
names.update(plugin_command_names()) |
|
214 |
return names |
|
215 |
||
216 |
||
4119.3.4
by Robert Collins
Add Command lookup hooks: list_commands and get_command. |
217 |
def all_command_names(): |
4119.3.10
by Robert Collins
More review feedback. |
218 |
"""Return a set of all command names.""" |
4119.3.6
by Robert Collins
Refactor commands.__get_cmd_object to be default-installed hooks. |
219 |
names = set() |
4119.3.4
by Robert Collins
Add Command lookup hooks: list_commands and get_command. |
220 |
for hook in Command.hooks['list_commands']: |
4119.3.10
by Robert Collins
More review feedback. |
221 |
names = hook(names) |
222 |
if names is None: |
|
4119.3.4
by Robert Collins
Add Command lookup hooks: list_commands and get_command. |
223 |
raise AssertionError( |
224 |
'hook %s returned None' % Command.hooks.get_hook_name(hook)) |
|
225 |
return names |
|
226 |
||
227 |
||
1162
by Martin Pool
- change Command infrastructure to use (mostly stateless) objects to |
228 |
def builtin_command_names(): |
4119.3.4
by Robert Collins
Add Command lookup hooks: list_commands and get_command. |
229 |
"""Return list of builtin command names. |
7143.15.2
by Jelmer Vernooij
Run autopep8. |
230 |
|
4119.3.4
by Robert Collins
Add Command lookup hooks: list_commands and get_command. |
231 |
Use of all_command_names() is encouraged rather than builtin_command_names
|
232 |
and/or plugin_command_names.
|
|
233 |
"""
|
|
5255.5.1
by Ian Clatworthy
Ensure builtin_command_names() is initialized correctly |
234 |
_register_builtin_commands() |
5018.1.5
by Martin Pool
Rename registry to builtin_command_registry |
235 |
return builtin_command_registry.keys() |
3943.8.1
by Marius Kruger
remove all trailing whitespace from bzr source |
236 |
|
1162
by Martin Pool
- change Command infrastructure to use (mostly stateless) objects to |
237 |
|
238 |
def plugin_command_names(): |
|
4119.3.4
by Robert Collins
Add Command lookup hooks: list_commands and get_command. |
239 |
"""Returns command names from commands registered by plugins.""" |
1162
by Martin Pool
- change Command infrastructure to use (mostly stateless) objects to |
240 |
return plugin_cmds.keys() |
241 |
||
242 |
||
6690.5.2
by Jelmer Vernooij
Add tests for guess_command. |
243 |
# Overrides for common mispellings that heuristics get wrong
|
244 |
_GUESS_OVERRIDES = { |
|
7143.15.2
by Jelmer Vernooij
Run autopep8. |
245 |
'ic': {'ci': 0}, # heuristic finds nick |
6690.5.2
by Jelmer Vernooij
Add tests for guess_command. |
246 |
}
|
247 |
||
248 |
||
249 |
def guess_command(cmd_name): |
|
250 |
"""Guess what command a user typoed. |
|
251 |
||
252 |
:param cmd_name: Command to search for
|
|
253 |
:return: None if no command was found, name of a command otherwise
|
|
254 |
"""
|
|
255 |
names = set() |
|
256 |
for name in all_command_names(): |
|
257 |
names.add(name) |
|
258 |
cmd = get_cmd_object(name) |
|
259 |
names.update(cmd.aliases) |
|
260 |
# candidate: modified levenshtein distance against cmd_name.
|
|
261 |
costs = {} |
|
7290.14.1
by Jelmer Vernooij
Use external patiencediff. |
262 |
import patiencediff |
6690.5.2
by Jelmer Vernooij
Add tests for guess_command. |
263 |
for name in sorted(names): |
264 |
matcher = patiencediff.PatienceSequenceMatcher(None, cmd_name, name) |
|
265 |
distance = 0.0 |
|
266 |
opcodes = matcher.get_opcodes() |
|
267 |
for opcode, l1, l2, r1, r2 in opcodes: |
|
268 |
if opcode == 'delete': |
|
7143.15.2
by Jelmer Vernooij
Run autopep8. |
269 |
distance += l2 - l1 |
6690.5.2
by Jelmer Vernooij
Add tests for guess_command. |
270 |
elif opcode == 'replace': |
7143.15.2
by Jelmer Vernooij
Run autopep8. |
271 |
distance += max(l2 - l1, r2 - l1) |
6690.5.2
by Jelmer Vernooij
Add tests for guess_command. |
272 |
elif opcode == 'insert': |
7143.15.2
by Jelmer Vernooij
Run autopep8. |
273 |
distance += r2 - r1 |
6690.5.2
by Jelmer Vernooij
Add tests for guess_command. |
274 |
elif opcode == 'equal': |
275 |
# Score equal ranges lower, making similar commands of equal
|
|
276 |
# length closer than arbitrary same length commands.
|
|
7143.15.2
by Jelmer Vernooij
Run autopep8. |
277 |
distance -= 0.1 * (l2 - l1) |
6690.5.2
by Jelmer Vernooij
Add tests for guess_command. |
278 |
costs[name] = distance |
279 |
costs.update(_GUESS_OVERRIDES.get(cmd_name, {})) |
|
6754.2.2
by Martin
Remove wayward dict.iteritems() call |
280 |
costs = sorted((costs[key], key) for key in costs) |
6690.5.2
by Jelmer Vernooij
Add tests for guess_command. |
281 |
if not costs: |
282 |
return
|
|
283 |
if costs[0][0] > 4: |
|
284 |
return
|
|
285 |
candidate = costs[0][1] |
|
286 |
return candidate |
|
287 |
||
288 |
||
1162
by Martin Pool
- change Command infrastructure to use (mostly stateless) objects to |
289 |
def get_cmd_object(cmd_name, plugins_override=True): |
4119.3.4
by Robert Collins
Add Command lookup hooks: list_commands and get_command. |
290 |
"""Return the command object for a command. |
1162
by Martin Pool
- change Command infrastructure to use (mostly stateless) objects to |
291 |
|
292 |
plugins_override
|
|
293 |
If true, plugin commands can override builtins.
|
|
350
by Martin Pool
- refactor command aliases into command classes |
294 |
"""
|
2432.1.13
by Robert Collins
HelpCommandContext now implementes get_topics. |
295 |
try: |
4119.3.4
by Robert Collins
Add Command lookup hooks: list_commands and get_command. |
296 |
return _get_cmd_object(cmd_name, plugins_override) |
2432.1.13
by Robert Collins
HelpCommandContext now implementes get_topics. |
297 |
except KeyError: |
6690.5.2
by Jelmer Vernooij
Add tests for guess_command. |
298 |
# No command found, see if this was a typo
|
299 |
candidate = guess_command(cmd_name) |
|
300 |
if candidate is not None: |
|
7490.61.1
by Jelmer Vernooij
Rename BzrCommandError to CommandError. |
301 |
raise errors.CommandError( |
7143.15.2
by Jelmer Vernooij
Run autopep8. |
302 |
gettext('unknown command "%s". Perhaps you meant "%s"') |
303 |
% (cmd_name, candidate)) |
|
7490.61.1
by Jelmer Vernooij
Rename BzrCommandError to CommandError. |
304 |
raise errors.CommandError(gettext('unknown command "%s"') |
7143.15.2
by Jelmer Vernooij
Run autopep8. |
305 |
% cmd_name) |
2432.1.13
by Robert Collins
HelpCommandContext now implementes get_topics. |
306 |
|
307 |
||
5058.2.1
by Robert Collins
* ``bzr help`` will no longer trigger the get_missing_command hook when |
308 |
def _get_cmd_object(cmd_name, plugins_override=True, check_missing=True): |
4119.3.4
by Robert Collins
Add Command lookup hooks: list_commands and get_command. |
309 |
"""Get a command object. |
310 |
||
311 |
:param cmd_name: The name of the command.
|
|
312 |
:param plugins_override: Allow plugins to override builtins.
|
|
5058.2.1
by Robert Collins
* ``bzr help`` will no longer trigger the get_missing_command hook when |
313 |
:param check_missing: Look up commands not found in the regular index via
|
314 |
the get_missing_command hook.
|
|
4119.3.4
by Robert Collins
Add Command lookup hooks: list_commands and get_command. |
315 |
:return: A Command object instance
|
4119.3.10
by Robert Collins
More review feedback. |
316 |
:raises KeyError: If no command is found.
|
4119.3.4
by Robert Collins
Add Command lookup hooks: list_commands and get_command. |
317 |
"""
|
4119.3.6
by Robert Collins
Refactor commands.__get_cmd_object to be default-installed hooks. |
318 |
# We want only 'ascii' command names, but the user may have typed
|
319 |
# in a Unicode name. In that case, they should just get a
|
|
320 |
# 'command not found' error later.
|
|
321 |
# In the future, we may actually support Unicode command names.
|
|
322 |
cmd = None |
|
323 |
# Get a command
|
|
4119.3.4
by Robert Collins
Add Command lookup hooks: list_commands and get_command. |
324 |
for hook in Command.hooks['get_command']: |
325 |
cmd = hook(cmd, cmd_name) |
|
4119.3.10
by Robert Collins
More review feedback. |
326 |
if cmd is not None and not plugins_override and not cmd.plugin_name(): |
4119.3.6
by Robert Collins
Refactor commands.__get_cmd_object to be default-installed hooks. |
327 |
# We've found a non-plugin command, don't permit it to be
|
328 |
# overridden.
|
|
4119.3.10
by Robert Collins
More review feedback. |
329 |
break
|
5058.2.1
by Robert Collins
* ``bzr help`` will no longer trigger the get_missing_command hook when |
330 |
if cmd is None and check_missing: |
4119.3.8
by Robert Collins
Get missing command support sorted out. |
331 |
for hook in Command.hooks['get_missing_command']: |
332 |
cmd = hook(cmd_name) |
|
333 |
if cmd is not None: |
|
334 |
break
|
|
335 |
if cmd is None: |
|
4119.3.4
by Robert Collins
Add Command lookup hooks: list_commands and get_command. |
336 |
# No command found.
|
337 |
raise KeyError |
|
338 |
# Allow plugins to extend commands
|
|
6240.5.7
by Jelmer Vernooij
Drop exception suppression support. |
339 |
for hook in Command.hooks['extend_command']: |
340 |
hook(cmd) |
|
5741.3.1
by Martin Pool
Add Command.invoked_as |
341 |
if getattr(cmd, 'invoked_as', None) is None: |
342 |
cmd.invoked_as = cmd_name |
|
4119.3.4
by Robert Collins
Add Command lookup hooks: list_commands and get_command. |
343 |
return cmd |
344 |
||
345 |
||
6734.1.1
by Jelmer Vernooij
Fix more imports. |
346 |
class NoPluginAvailable(errors.BzrError): |
347 |
pass
|
|
348 |
||
349 |
||
4119.3.8
by Robert Collins
Get missing command support sorted out. |
350 |
def _try_plugin_provider(cmd_name): |
351 |
"""Probe for a plugin provider having cmd_name.""" |
|
352 |
try: |
|
353 |
plugin_metadata, provider = probe_for_provider(cmd_name) |
|
6734.1.1
by Jelmer Vernooij
Fix more imports. |
354 |
raise CommandAvailableInPlugin(cmd_name, plugin_metadata, provider) |
355 |
except NoPluginAvailable: |
|
4119.3.8
by Robert Collins
Get missing command support sorted out. |
356 |
pass
|
357 |
||
358 |
||
4119.3.4
by Robert Collins
Add Command lookup hooks: list_commands and get_command. |
359 |
def probe_for_provider(cmd_name): |
360 |
"""Look for a provider for cmd_name. |
|
361 |
||
362 |
:param cmd_name: The command name.
|
|
363 |
:return: plugin_metadata, provider for getting cmd_name.
|
|
364 |
:raises NoPluginAvailable: When no provider can supply the plugin.
|
|
365 |
"""
|
|
366 |
# look for providers that provide this command but aren't installed
|
|
367 |
for provider in command_providers_registry: |
|
368 |
try: |
|
369 |
return provider.plugin_for_command(cmd_name), provider |
|
6734.1.1
by Jelmer Vernooij
Fix more imports. |
370 |
except NoPluginAvailable: |
4119.3.4
by Robert Collins
Add Command lookup hooks: list_commands and get_command. |
371 |
pass
|
6734.1.1
by Jelmer Vernooij
Fix more imports. |
372 |
raise NoPluginAvailable(cmd_name) |
4119.3.4
by Robert Collins
Add Command lookup hooks: list_commands and get_command. |
373 |
|
374 |
||
4119.3.6
by Robert Collins
Refactor commands.__get_cmd_object to be default-installed hooks. |
375 |
def _get_bzr_command(cmd_or_None, cmd_name): |
376 |
"""Get a command from bzr's core.""" |
|
272
by Martin Pool
- Add command aliases |
377 |
try: |
5018.1.6
by Martin Pool
Avoid more cases of using a dict of all builtins |
378 |
cmd_class = builtin_command_registry.get(cmd_name) |
272
by Martin Pool
- Add command aliases |
379 |
except KeyError: |
350
by Martin Pool
- refactor command aliases into command classes |
380 |
pass
|
5018.1.6
by Martin Pool
Avoid more cases of using a dict of all builtins |
381 |
else: |
382 |
return cmd_class() |
|
4119.3.6
by Robert Collins
Refactor commands.__get_cmd_object to be default-installed hooks. |
383 |
return cmd_or_None |
384 |
||
385 |
||
386 |
def _get_external_command(cmd_or_None, cmd_name): |
|
387 |
"""Lookup a command that is a shell script.""" |
|
388 |
# Only do external command lookups when no command is found so far.
|
|
389 |
if cmd_or_None is not None: |
|
390 |
return cmd_or_None |
|
6622.1.34
by Jelmer Vernooij
Rename brzlib => breezy. |
391 |
from breezy.externalcommand import ExternalCommand |
1162
by Martin Pool
- change Command infrastructure to use (mostly stateless) objects to |
392 |
cmd_obj = ExternalCommand.find_command(cmd_name) |
393 |
if cmd_obj: |
|
394 |
return cmd_obj |
|
4119.3.6
by Robert Collins
Refactor commands.__get_cmd_object to be default-installed hooks. |
395 |
|
396 |
||
397 |
def _get_plugin_command(cmd_or_None, cmd_name): |
|
6622.1.1
by Jelmer Vernooij
Rename bzrlib => brzlib, bzr => brz. |
398 |
"""Get a command from brz's plugins.""" |
4119.3.6
by Robert Collins
Refactor commands.__get_cmd_object to be default-installed hooks. |
399 |
try: |
400 |
return plugin_cmds.get(cmd_name)() |
|
401 |
except KeyError: |
|
402 |
pass
|
|
403 |
for key in plugin_cmds.keys(): |
|
404 |
info = plugin_cmds.get_info(key) |
|
405 |
if cmd_name in info.aliases: |
|
406 |
return plugin_cmds.get(key)() |
|
407 |
return cmd_or_None |
|
272
by Martin Pool
- Add command aliases |
408 |
|
329
by Martin Pool
- refactor command functions into command classes |
409 |
|
558
by Martin Pool
- All top-level classes inherit from object |
410 |
class Command(object): |
329
by Martin Pool
- refactor command functions into command classes |
411 |
"""Base class for commands. |
412 |
||
6622.1.1
by Jelmer Vernooij
Rename bzrlib => brzlib, bzr => brz. |
413 |
Commands are the heart of the command-line brz interface.
|
1162
by Martin Pool
- change Command infrastructure to use (mostly stateless) objects to |
414 |
|
415 |
The command object mostly handles the mapping of command-line
|
|
6622.1.34
by Jelmer Vernooij
Rename brzlib => breezy. |
416 |
parameters into one or more breezy operations, and of the results
|
1162
by Martin Pool
- change Command infrastructure to use (mostly stateless) objects to |
417 |
into textual output.
|
418 |
||
419 |
Commands normally don't have any state. All their arguments are
|
|
420 |
passed in to the run method. (Subclasses may take a different
|
|
421 |
policy if the behaviour of the instance needs to depend on e.g. a
|
|
422 |
shell plugin and not just its Python class.)
|
|
423 |
||
329
by Martin Pool
- refactor command functions into command classes |
424 |
The docstring for an actual command should give a single-line
|
425 |
summary, then a complete description of the command. A grammar
|
|
426 |
description will be inserted.
|
|
427 |
||
5891.1.3
by Andrew Bennetts
Move docstring formatting fixes. |
428 |
:cvar aliases: Other accepted names for this command.
|
429 |
||
430 |
:cvar takes_args: List of argument forms, marked with whether they are
|
|
431 |
optional, repeated, etc. Examples::
|
|
432 |
||
433 |
['to_location', 'from_branch?', 'file*']
|
|
434 |
||
435 |
* 'to_location' is required
|
|
436 |
* 'from_branch' is optional
|
|
437 |
* 'file' can be specified 0 or more times
|
|
438 |
||
439 |
:cvar takes_options: List of options that may be given for this command.
|
|
440 |
These can be either strings, referring to globally-defined options, or
|
|
441 |
option objects. Retrieve through options().
|
|
442 |
||
443 |
:cvar hidden: If true, this command isn't advertised. This is typically
|
|
1162
by Martin Pool
- change Command infrastructure to use (mostly stateless) objects to |
444 |
for commands intended for expert users.
|
1185.85.22
by John Arbash Meinel
Updated cmd_inventory. Changing from having each Command request an encoded stdout to providing one before calling run() |
445 |
|
5891.1.3
by Andrew Bennetts
Move docstring formatting fixes. |
446 |
:cvar encoding_type: Command objects will get a 'outf' attribute, which has
|
447 |
been setup to properly handle encoding of unicode strings.
|
|
448 |
encoding_type determines what will happen when characters cannot be
|
|
449 |
encoded:
|
|
450 |
||
451 |
* strict - abort if we cannot decode
|
|
452 |
* replace - put in a bogus character (typically '?')
|
|
453 |
* exact - do not encode sys.stdout
|
|
454 |
||
455 |
NOTE: by default on Windows, sys.stdout is opened as a text stream,
|
|
456 |
therefore LF line-endings are converted to CRLF. When a command uses
|
|
457 |
encoding_type = 'exact', then sys.stdout is forced to be a binary
|
|
458 |
stream, and line-endings will not mangled.
|
|
459 |
||
460 |
:cvar invoked_as:
|
|
5741.3.1
by Martin Pool
Add Command.invoked_as |
461 |
A string indicating the real name under which this command was
|
5891.1.3
by Andrew Bennetts
Move docstring formatting fixes. |
462 |
invoked, before expansion of aliases.
|
5741.3.1
by Martin Pool
Add Command.invoked_as |
463 |
(This may be None if the command was constructed and run in-process.)
|
464 |
||
4000.1.1
by Robert Collins
Add a new hook Commands['extend_command'] for plugins that want to alter commands without overriding the entire command. |
465 |
:cvar hooks: An instance of CommandHooks.
|
5741.3.1
by Martin Pool
Add Command.invoked_as |
466 |
|
6622.1.1
by Jelmer Vernooij
Rename bzrlib => brzlib, bzr => brz. |
467 |
:cvar __doc__: The help shown by 'brz help command' for this command.
|
5264.1.2
by Robert Collins
Final fix for 'no help for command' issue. We now show a clean message |
468 |
This is set by assigning explicitly to __doc__ so that -OO can
|
469 |
be used::
|
|
470 |
||
5891.1.3
by Andrew Bennetts
Move docstring formatting fixes. |
471 |
class Foo(Command):
|
472 |
__doc__ = "My help goes here"
|
|
329
by Martin Pool
- refactor command functions into command classes |
473 |
"""
|
474 |
aliases = [] |
|
475 |
takes_args = [] |
|
476 |
takes_options = [] |
|
1185.85.22
by John Arbash Meinel
Updated cmd_inventory. Changing from having each Command request an encoded stdout to providing one before calling run() |
477 |
encoding_type = 'strict' |
5741.3.1
by Martin Pool
Add Command.invoked_as |
478 |
invoked_as = None |
5875.4.6
by INADA Naoki
Call i18n.install in get_help_text. |
479 |
l10n = True |
329
by Martin Pool
- refactor command functions into command classes |
480 |
|
481 |
hidden = False |
|
3943.8.1
by Marius Kruger
remove all trailing whitespace from bzr source |
482 |
|
1162
by Martin Pool
- change Command infrastructure to use (mostly stateless) objects to |
483 |
def __init__(self): |
484 |
"""Construct an instance of this command.""" |
|
2768.1.4
by Ian Clatworthy
Process --verbose and --quiet standard options |
485 |
# List of standard options directly supported
|
486 |
self.supported_std_options = [] |
|
5141.2.1
by Robert Collins
``bzrlib.commands.Command.run_direct`` is no longer needed - the pre |
487 |
self._setup_run() |
5050.1.3
by Vincent Ladeuil
Delete spurious spaces. |
488 |
|
4900.1.1
by Andrew Bennetts
Add add_cleanup to Command. |
489 |
def add_cleanup(self, cleanup_func, *args, **kwargs): |
4900.1.3
by Andrew Bennetts
Replace lots of try/finally blocks in builtins.py with add_cleanup. Reduces line count by 80, and removes lots of indentation levels too. |
490 |
"""Register a function to call after self.run returns or raises. |
491 |
||
492 |
Functions will be called in LIFO order.
|
|
493 |
"""
|
|
7356.1.1
by Jelmer Vernooij
Use ExitStack context rather than brz-specific OperationWithCleanup. |
494 |
self._exit_stack.callback(cleanup_func, *args, **kwargs) |
4900.1.3
by Andrew Bennetts
Replace lots of try/finally blocks in builtins.py with add_cleanup. Reduces line count by 80, and removes lots of indentation levels too. |
495 |
|
496 |
def cleanup_now(self): |
|
497 |
"""Execute and empty pending cleanup functions immediately. |
|
498 |
||
499 |
After cleanup_now all registered cleanups are forgotten. add_cleanup
|
|
500 |
may be called again after cleanup_now; these cleanups will be called
|
|
501 |
after self.run returns or raises (or when cleanup_now is next called).
|
|
502 |
||
503 |
This is useful for releasing expensive or contentious resources (such
|
|
504 |
as write locks) before doing further work that does not require those
|
|
5141.2.1
by Robert Collins
``bzrlib.commands.Command.run_direct`` is no longer needed - the pre |
505 |
resources (such as writing results to self.outf). Note though, that
|
506 |
as it releases all resources, this may release locks that the command
|
|
507 |
wants to hold, so use should be done with care.
|
|
4900.1.3
by Andrew Bennetts
Replace lots of try/finally blocks in builtins.py with add_cleanup. Reduces line count by 80, and removes lots of indentation levels too. |
508 |
"""
|
7356.1.1
by Jelmer Vernooij
Use ExitStack context rather than brz-specific OperationWithCleanup. |
509 |
self._exit_stack.close() |
510 |
||
511 |
def enter_context(self, cm): |
|
512 |
return self._exit_stack.enter_context(cm) |
|
5050.1.3
by Vincent Ladeuil
Delete spurious spaces. |
513 |
|
2432.1.12
by Robert Collins
Relocate command help onto Command. |
514 |
def _usage(self): |
515 |
"""Return single-line grammar for this command. |
|
516 |
||
517 |
Only describes arguments, not options.
|
|
518 |
"""
|
|
6622.1.1
by Jelmer Vernooij
Rename bzrlib => brzlib, bzr => brz. |
519 |
s = 'brz ' + self.name() + ' ' |
2432.1.12
by Robert Collins
Relocate command help onto Command. |
520 |
for aname in self.takes_args: |
521 |
aname = aname.upper() |
|
522 |
if aname[-1] in ['$', '+']: |
|
523 |
aname = aname[:-1] + '...' |
|
524 |
elif aname[-1] == '?': |
|
525 |
aname = '[' + aname[:-1] + ']' |
|
526 |
elif aname[-1] == '*': |
|
527 |
aname = '[' + aname[:-1] + '...]' |
|
528 |
s += aname + ' ' |
|
3376.2.4
by Martin Pool
Remove every assert statement from bzrlib! |
529 |
s = s[:-1] # remove last space |
2432.1.12
by Robert Collins
Relocate command help onto Command. |
530 |
return s |
531 |
||
2677.1.2
by Alexander Belchenko
bzr_man: see also topics as cross-reference links |
532 |
def get_help_text(self, additional_see_also=None, plain=True, |
3984.4.1
by Ian Clatworthy
get_help_text() verbose parameter & keep custom sections ordered |
533 |
see_also_as_links=False, verbose=True): |
2432.1.21
by Robert Collins
Teach Command.get_help_text to show additional help cross references when supplied. |
534 |
"""Return a text string with help for this command. |
3943.8.1
by Marius Kruger
remove all trailing whitespace from bzr source |
535 |
|
2432.1.21
by Robert Collins
Teach Command.get_help_text to show additional help cross references when supplied. |
536 |
:param additional_see_also: Additional help topics to be
|
537 |
cross-referenced.
|
|
2666.1.1
by Ian Clatworthy
Bazaar User Reference generated from online help |
538 |
:param plain: if False, raw help (reStructuredText) is
|
539 |
returned instead of plain text.
|
|
2677.1.2
by Alexander Belchenko
bzr_man: see also topics as cross-reference links |
540 |
:param see_also_as_links: if True, convert items in 'See also'
|
2677.1.4
by Alexander Belchenko
fixes after John's review |
541 |
list to internal links (used by bzr_man rstx generator)
|
3984.4.1
by Ian Clatworthy
get_help_text() verbose parameter & keep custom sections ordered |
542 |
:param verbose: if True, display the full help, otherwise
|
543 |
leave out the descriptive sections and just display
|
|
3984.4.8
by Ian Clatworthy
tweak docstring |
544 |
usage help (e.g. Purpose, Usage, Options) with a
|
545 |
message explaining how to obtain full help.
|
|
2432.1.21
by Robert Collins
Teach Command.get_help_text to show additional help cross references when supplied. |
546 |
"""
|
6112.1.1
by Jonathan Riddell
check for installed i18n before doing install |
547 |
if self.l10n: |
5875.3.25
by Vincent Ladeuil
Fix test failures and make sure we don't rely on a default translation. |
548 |
i18n.install() # Install i18n only for get_help_text for now. |
2432.1.12
by Robert Collins
Relocate command help onto Command. |
549 |
doc = self.help() |
5875.3.1
by INADA Naoki
Implement command help l10n. |
550 |
if doc: |
5875.4.1
by INADA Naoki
Add comment about describing ":Usage:" section is not translated. |
551 |
# Note: If self.gettext() translates ':Usage:\n', the section will
|
552 |
# be shown after "Description" section and we don't want to
|
|
553 |
# translate the usage string.
|
|
6622.1.28
by Jelmer Vernooij
More renames; commands in output, environment variables. |
554 |
# Though, brz export-pot don't exports :Usage: section and it must
|
5875.4.1
by INADA Naoki
Add comment about describing ":Usage:" section is not translated. |
555 |
# not be translated.
|
5875.3.25
by Vincent Ladeuil
Fix test failures and make sure we don't rely on a default translation. |
556 |
doc = self.gettext(doc) |
5875.3.1
by INADA Naoki
Implement command help l10n. |
557 |
else: |
558 |
doc = gettext("No help for this command.") |
|
2432.1.12
by Robert Collins
Relocate command help onto Command. |
559 |
|
2666.1.1
by Ian Clatworthy
Bazaar User Reference generated from online help |
560 |
# Extract the summary (purpose) and sections out from the text
|
6809.1.1
by Martin
Apply 2to3 ws_comma fixer |
561 |
purpose, sections, order = self._get_help_parts(doc) |
2666.1.1
by Ian Clatworthy
Bazaar User Reference generated from online help |
562 |
|
563 |
# If a custom usage section was provided, use it
|
|
6619.3.1
by Jelmer Vernooij
Apply 2to3 has_key fix. |
564 |
if 'Usage' in sections: |
2666.1.1
by Ian Clatworthy
Bazaar User Reference generated from online help |
565 |
usage = sections.pop('Usage') |
566 |
else: |
|
567 |
usage = self._usage() |
|
568 |
||
569 |
# The header is the purpose and usage
|
|
2432.1.12
by Robert Collins
Relocate command help onto Command. |
570 |
result = "" |
5875.3.26
by Vincent Ladeuil
Tweak test_help some more. |
571 |
result += gettext(':Purpose: %s\n') % (purpose,) |
2666.1.1
by Ian Clatworthy
Bazaar User Reference generated from online help |
572 |
if usage.find('\n') >= 0: |
5875.3.23
by Vincent Ladeuil
Put the '\n' back into the formats and fix tests accordingly (reducing code duplication). |
573 |
result += gettext(':Usage:\n%s\n') % (usage,) |
2666.1.1
by Ian Clatworthy
Bazaar User Reference generated from online help |
574 |
else: |
5875.3.23
by Vincent Ladeuil
Put the '\n' back into the formats and fix tests accordingly (reducing code duplication). |
575 |
result += gettext(':Usage: %s\n') % (usage,) |
2666.1.1
by Ian Clatworthy
Bazaar User Reference generated from online help |
576 |
result += '\n' |
577 |
||
578 |
# Add the options
|
|
4070.11.3
by Martin Pool
doc |
579 |
#
|
580 |
# XXX: optparse implicitly rewraps the help, and not always perfectly,
|
|
581 |
# so we get <https://bugs.launchpad.net/bzr/+bug/249908>. -- mbp
|
|
582 |
# 20090319
|
|
7143.15.2
by Jelmer Vernooij
Run autopep8. |
583 |
parser = option.get_optparser( |
584 |
[v for k, v in sorted(self.options().items())]) |
|
5875.3.15
by INADA Naoki
Use better variable name. |
585 |
options = parser.format_option_help() |
5860.1.1
by Vincent Ladeuil
Fix some ReST typos in the configuration help and restore the workaround for dotted format names breaking sphinx. |
586 |
# FIXME: According to the spec, ReST option lists actually don't
|
587 |
# support options like --1.14 so that causes syntax errors (in Sphinx
|
|
588 |
# at least). As that pattern always appears in the commands that
|
|
589 |
# break, we trap on that and then format that block of 'format' options
|
|
590 |
# as a literal block. We use the most recent format still listed so we
|
|
591 |
# don't have to do that too often -- vila 20110514
|
|
592 |
if not plain and options.find(' --1.14 ') != -1: |
|
4634.39.39
by Ian Clatworthy
Fix ReST syntax errors in User Reference caused by options like --1.9 that ReST option lists don't permit |
593 |
options = options.replace(' format:\n', ' format::\n\n', 1) |
5875.3.14
by INADA Naoki
Change how to use gettext for section titles. |
594 |
if options.startswith('Options:'): |
595 |
result += gettext(':Options:%s') % (options[len('options:'):],) |
|
2666.1.1
by Ian Clatworthy
Bazaar User Reference generated from online help |
596 |
else: |
597 |
result += options |
|
598 |
result += '\n' |
|
599 |
||
3984.4.1
by Ian Clatworthy
get_help_text() verbose parameter & keep custom sections ordered |
600 |
if verbose: |
601 |
# Add the description, indenting it 2 spaces
|
|
602 |
# to match the indentation of the options
|
|
6619.3.1
by Jelmer Vernooij
Apply 2to3 has_key fix. |
603 |
if None in sections: |
3984.4.1
by Ian Clatworthy
get_help_text() verbose parameter & keep custom sections ordered |
604 |
text = sections.pop(None) |
605 |
text = '\n '.join(text.splitlines()) |
|
5875.3.23
by Vincent Ladeuil
Put the '\n' back into the formats and fix tests accordingly (reducing code duplication). |
606 |
result += gettext(':Description:\n %s\n\n') % (text,) |
2666.1.1
by Ian Clatworthy
Bazaar User Reference generated from online help |
607 |
|
3984.4.1
by Ian Clatworthy
get_help_text() verbose parameter & keep custom sections ordered |
608 |
# Add the custom sections (e.g. Examples). Note that there's no need
|
609 |
# to indent these as they must be indented already in the source.
|
|
610 |
if sections: |
|
611 |
for label in order: |
|
5875.3.1
by INADA Naoki
Implement command help l10n. |
612 |
if label in sections: |
613 |
result += ':%s:\n%s\n' % (label, sections[label]) |
|
3984.4.1
by Ian Clatworthy
get_help_text() verbose parameter & keep custom sections ordered |
614 |
result += '\n' |
615 |
else: |
|
6622.1.28
by Jelmer Vernooij
More renames; commands in output, environment variables. |
616 |
result += (gettext("See brz help %s for more details and examples.\n\n") |
7143.15.2
by Jelmer Vernooij
Run autopep8. |
617 |
% self.name()) |
2666.1.1
by Ian Clatworthy
Bazaar User Reference generated from online help |
618 |
|
619 |
# Add the aliases, source (plug-in) and see also links, if any
|
|
2432.1.12
by Robert Collins
Relocate command help onto Command. |
620 |
if self.aliases: |
5875.3.14
by INADA Naoki
Change how to use gettext for section titles. |
621 |
result += gettext(':Aliases: ') |
2432.1.12
by Robert Collins
Relocate command help onto Command. |
622 |
result += ', '.join(self.aliases) + '\n' |
623 |
plugin_name = self.plugin_name() |
|
624 |
if plugin_name is not None: |
|
5875.3.14
by INADA Naoki
Change how to use gettext for section titles. |
625 |
result += gettext(':From: plugin "%s"\n') % plugin_name |
2432.1.21
by Robert Collins
Teach Command.get_help_text to show additional help cross references when supplied. |
626 |
see_also = self.get_see_also(additional_see_also) |
2432.1.12
by Robert Collins
Relocate command help onto Command. |
627 |
if see_also: |
2677.1.4
by Alexander Belchenko
fixes after John's review |
628 |
if not plain and see_also_as_links: |
629 |
see_also_links = [] |
|
630 |
for item in see_also: |
|
631 |
if item == 'topics': |
|
632 |
# topics doesn't have an independent section
|
|
633 |
# so don't create a real link
|
|
634 |
see_also_links.append(item) |
|
635 |
else: |
|
4927.2.2
by Ian Clatworthy
User Reference as topics |
636 |
# Use a Sphinx link for this entry
|
6147.1.1
by Jonathan Riddell
use .format() instead of % for string formatting where there are multiple formats in one string to allow for translations |
637 |
link_text = gettext(":doc:`{0} <{1}-help>`").format( |
7143.15.2
by Jelmer Vernooij
Run autopep8. |
638 |
item, item) |
4927.2.2
by Ian Clatworthy
User Reference as topics |
639 |
see_also_links.append(link_text) |
2677.1.4
by Alexander Belchenko
fixes after John's review |
640 |
see_also = see_also_links |
5875.3.14
by INADA Naoki
Change how to use gettext for section titles. |
641 |
result += gettext(':See also: %s') % ', '.join(see_also) + '\n' |
2666.1.1
by Ian Clatworthy
Bazaar User Reference generated from online help |
642 |
|
3668.2.1
by Vincent Ladeuil
Fix bug #263249 by setting valid default _param_name. |
643 |
# If this will be rendered as plain text, convert it
|
2666.1.1
by Ian Clatworthy
Bazaar User Reference generated from online help |
644 |
if plain: |
6622.1.34
by Jelmer Vernooij
Rename brzlib => breezy. |
645 |
import breezy.help_topics |
646 |
result = breezy.help_topics.help_as_plain_text(result) |
|
2432.1.12
by Robert Collins
Relocate command help onto Command. |
647 |
return result |
648 |
||
2666.1.1
by Ian Clatworthy
Bazaar User Reference generated from online help |
649 |
@staticmethod
|
650 |
def _get_help_parts(text): |
|
651 |
"""Split help text into a summary and named sections. |
|
652 |
||
3974.1.1
by Ian Clatworthy
keep section ordering in help |
653 |
:return: (summary,sections,order) where summary is the top line and
|
2666.1.1
by Ian Clatworthy
Bazaar User Reference generated from online help |
654 |
sections is a dictionary of the rest indexed by section name.
|
3974.1.1
by Ian Clatworthy
keep section ordering in help |
655 |
order is the order the section appear in the text.
|
2666.1.1
by Ian Clatworthy
Bazaar User Reference generated from online help |
656 |
A section starts with a heading line of the form ":xxx:".
|
657 |
Indented text on following lines is the section value.
|
|
658 |
All text found outside a named section is assigned to the
|
|
659 |
default section which is given the key of None.
|
|
660 |
"""
|
|
3974.1.1
by Ian Clatworthy
keep section ordering in help |
661 |
def save_section(sections, order, label, section): |
2666.1.1
by Ian Clatworthy
Bazaar User Reference generated from online help |
662 |
if len(section) > 0: |
6619.3.1
by Jelmer Vernooij
Apply 2to3 has_key fix. |
663 |
if label in sections: |
2666.1.1
by Ian Clatworthy
Bazaar User Reference generated from online help |
664 |
sections[label] += '\n' + section |
665 |
else: |
|
3974.1.1
by Ian Clatworthy
keep section ordering in help |
666 |
order.append(label) |
2666.1.1
by Ian Clatworthy
Bazaar User Reference generated from online help |
667 |
sections[label] = section |
3668.2.1
by Vincent Ladeuil
Fix bug #263249 by setting valid default _param_name. |
668 |
|
2666.1.1
by Ian Clatworthy
Bazaar User Reference generated from online help |
669 |
lines = text.rstrip().splitlines() |
670 |
summary = lines.pop(0) |
|
671 |
sections = {} |
|
3974.1.1
by Ian Clatworthy
keep section ordering in help |
672 |
order = [] |
6809.1.1
by Martin
Apply 2to3 ws_comma fixer |
673 |
label, section = None, '' |
2666.1.1
by Ian Clatworthy
Bazaar User Reference generated from online help |
674 |
for line in lines: |
675 |
if line.startswith(':') and line.endswith(':') and len(line) > 2: |
|
3974.1.1
by Ian Clatworthy
keep section ordering in help |
676 |
save_section(sections, order, label, section) |
6809.1.1
by Martin
Apply 2to3 ws_comma fixer |
677 |
label, section = line[1:-1], '' |
7143.15.5
by Jelmer Vernooij
More PEP8 fixes. |
678 |
elif (label is not None and len(line) > 1 and |
679 |
not line[0].isspace()): |
|
3974.1.1
by Ian Clatworthy
keep section ordering in help |
680 |
save_section(sections, order, label, section) |
6809.1.1
by Martin
Apply 2to3 ws_comma fixer |
681 |
label, section = None, line |
2666.1.1
by Ian Clatworthy
Bazaar User Reference generated from online help |
682 |
else: |
683 |
if len(section) > 0: |
|
684 |
section += '\n' + line |
|
685 |
else: |
|
686 |
section = line |
|
3974.1.1
by Ian Clatworthy
keep section ordering in help |
687 |
save_section(sections, order, label, section) |
688 |
return summary, sections, order |
|
2666.1.1
by Ian Clatworthy
Bazaar User Reference generated from online help |
689 |
|
2432.1.28
by Robert Collins
Add a get_help_topic method to commands.Command. |
690 |
def get_help_topic(self): |
691 |
"""Return the commands help topic - its name.""" |
|
692 |
return self.name() |
|
693 |
||
2432.1.21
by Robert Collins
Teach Command.get_help_text to show additional help cross references when supplied. |
694 |
def get_see_also(self, additional_terms=None): |
2677.1.2
by Alexander Belchenko
bzr_man: see also topics as cross-reference links |
695 |
"""Return a list of help topics that are related to this command. |
3943.8.1
by Marius Kruger
remove all trailing whitespace from bzr source |
696 |
|
2425.2.1
by Robert Collins
Command objects can now declare related help topics by having _see_also |
697 |
The list is derived from the content of the _see_also attribute. Any
|
698 |
duplicates are removed and the result is in lexical order.
|
|
2432.1.21
by Robert Collins
Teach Command.get_help_text to show additional help cross references when supplied. |
699 |
:param additional_terms: Additional help topics to cross-reference.
|
2425.2.1
by Robert Collins
Command objects can now declare related help topics by having _see_also |
700 |
:return: A list of help topics.
|
701 |
"""
|
|
2432.1.21
by Robert Collins
Teach Command.get_help_text to show additional help cross references when supplied. |
702 |
see_also = set(getattr(self, '_see_also', [])) |
703 |
if additional_terms: |
|
704 |
see_also.update(additional_terms) |
|
705 |
return sorted(see_also) |
|
2425.2.1
by Robert Collins
Command objects can now declare related help topics by having _see_also |
706 |
|
1185.16.43
by Martin Pool
- clean up handling of option objects |
707 |
def options(self): |
708 |
"""Return dict of valid options for this command. |
|
709 |
||
710 |
Maps from long option name to option object."""
|
|
2768.1.4
by Ian Clatworthy
Process --verbose and --quiet standard options |
711 |
r = Option.STD_OPTIONS.copy() |
6656.1.1
by Martin
Apply 2to3 dict fixer and clean up resulting mess using view helpers |
712 |
std_names = set(r) |
1185.16.43
by Martin Pool
- clean up handling of option objects |
713 |
for o in self.takes_options: |
7479.2.1
by Jelmer Vernooij
Drop python2 support. |
714 |
if isinstance(o, str): |
1996.3.1
by John Arbash Meinel
Demandloading builtins.py drops our load time from 350ms to 291ms |
715 |
o = option.Option.OPTIONS[o] |
1185.16.43
by Martin Pool
- clean up handling of option objects |
716 |
r[o.name] = o |
2768.1.4
by Ian Clatworthy
Process --verbose and --quiet standard options |
717 |
if o.name in std_names: |
718 |
self.supported_std_options.append(o.name) |
|
1185.16.43
by Martin Pool
- clean up handling of option objects |
719 |
return r |
1165
by Martin Pool
- move parsing of argv into arguments and options into Command.run_argv |
720 |
|
1685.1.80
by Wouter van Heyst
more code cleanup |
721 |
def _setup_outf(self): |
1185.85.22
by John Arbash Meinel
Updated cmd_inventory. Changing from having each Command request an encoded stdout to providing one before calling run() |
722 |
"""Return a file linked to stdout, which has proper encoding.""" |
4792.8.9
by Martin Pool
Send Command.outf through UIFactory |
723 |
self.outf = ui.ui_factory.make_output_stream( |
724 |
encoding_type=self.encoding_type) |
|
1185.85.22
by John Arbash Meinel
Updated cmd_inventory. Changing from having each Command request an encoded stdout to providing one before calling run() |
725 |
|
1581.1.1
by Robert Collins
Bugfix aliases to be backwards compatible with plugins providing command.run_argv. |
726 |
def run_argv_aliases(self, argv, alias_argv=None): |
727 |
"""Parse the command line and run with extra aliases in alias_argv.""" |
|
1553.6.8
by Erik Bågfors
support for overrides |
728 |
args, opts = parse_args(self, argv, alias_argv) |
5875.4.2
by INADA Naoki
Command.run_argv_aliases() always calls self._setup_outf. |
729 |
self._setup_outf() |
2768.1.4
by Ian Clatworthy
Process --verbose and --quiet standard options |
730 |
|
731 |
# Process the standard options
|
|
6622.1.28
by Jelmer Vernooij
More renames; commands in output, environment variables. |
732 |
if 'help' in opts: # e.g. brz add --help |
5875.3.1
by INADA Naoki
Implement command help l10n. |
733 |
self.outf.write(self.get_help_text()) |
3984.4.6
by Ian Clatworthy
Show usage on --usage, not -h |
734 |
return 0 |
6622.1.28
by Jelmer Vernooij
More renames; commands in output, environment variables. |
735 |
if 'usage' in opts: # e.g. brz add --usage |
5875.3.16
by INADA Naoki
Use _outf for '--using' too. |
736 |
self.outf.write(self.get_help_text(verbose=False)) |
3984.4.5
by Ian Clatworthy
help xxx is full help; xxx -h is concise help |
737 |
return 0 |
2768.1.4
by Ian Clatworthy
Process --verbose and --quiet standard options |
738 |
trace.set_verbosity_level(option._verbosity_level) |
739 |
if 'verbose' in self.supported_std_options: |
|
740 |
opts['verbose'] = trace.is_verbose() |
|
6619.3.1
by Jelmer Vernooij
Apply 2to3 has_key fix. |
741 |
elif 'verbose' in opts: |
2768.1.4
by Ian Clatworthy
Process --verbose and --quiet standard options |
742 |
del opts['verbose'] |
743 |
if 'quiet' in self.supported_std_options: |
|
744 |
opts['quiet'] = trace.is_quiet() |
|
6619.3.1
by Jelmer Vernooij
Apply 2to3 has_key fix. |
745 |
elif 'quiet' in opts: |
2768.1.4
by Ian Clatworthy
Process --verbose and --quiet standard options |
746 |
del opts['quiet'] |
1165
by Martin Pool
- move parsing of argv into arguments and options into Command.run_argv |
747 |
# mix arguments and options into one dictionary
|
748 |
cmdargs = _match_argform(self.name(), self.takes_args, args) |
|
749 |
cmdopts = {} |
|
750 |
for k, v in opts.items(): |
|
751 |
cmdopts[k.replace('-', '_')] = v |
|
752 |
||
753 |
all_cmd_args = cmdargs.copy() |
|
754 |
all_cmd_args.update(cmdopts) |
|
755 |
||
5463.1.2
by Martin Pool
Make run_argv_aliases reset the global verbosity after running |
756 |
try: |
757 |
return self.run(**all_cmd_args) |
|
758 |
finally: |
|
759 |
# reset it, so that other commands run in the same process won't
|
|
5609.16.1
by John Arbash Meinel
Fix bug #713258. Restore logging of bytes transferred. |
760 |
# inherit state. Before we reset it, log any activity, so that it
|
761 |
# gets properly tracked.
|
|
762 |
ui.ui_factory.log_transport_activity( |
|
763 |
display=('bytes' in debug.debug_flags)) |
|
5463.1.2
by Martin Pool
Make run_argv_aliases reset the global verbosity after running |
764 |
trace.set_verbosity_level(0) |
5141.2.1
by Robert Collins
``bzrlib.commands.Command.run_direct`` is no longer needed - the pre |
765 |
|
766 |
def _setup_run(self): |
|
767 |
"""Wrap the defined run method on self with a cleanup. |
|
768 |
||
769 |
This is called by __init__ to make the Command be able to be run
|
|
770 |
by just calling run(), as it could be before cleanups were added.
|
|
771 |
||
772 |
If a different form of cleanups are in use by your Command subclass,
|
|
773 |
you can override this method.
|
|
774 |
"""
|
|
775 |
class_run = self.run |
|
7143.15.2
by Jelmer Vernooij
Run autopep8. |
776 |
|
5141.2.1
by Robert Collins
``bzrlib.commands.Command.run_direct`` is no longer needed - the pre |
777 |
def run(*args, **kwargs): |
6240.5.7
by Jelmer Vernooij
Drop exception suppression support. |
778 |
for hook in Command.hooks['pre_command']: |
779 |
hook(self) |
|
5141.2.1
by Robert Collins
``bzrlib.commands.Command.run_direct`` is no longer needed - the pre |
780 |
try: |
7479.2.1
by Jelmer Vernooij
Drop python2 support. |
781 |
with contextlib.ExitStack() as self._exit_stack: |
7356.1.1
by Jelmer Vernooij
Use ExitStack context rather than brz-specific OperationWithCleanup. |
782 |
return class_run(*args, **kwargs) |
5141.2.1
by Robert Collins
``bzrlib.commands.Command.run_direct`` is no longer needed - the pre |
783 |
finally: |
6240.5.7
by Jelmer Vernooij
Drop exception suppression support. |
784 |
for hook in Command.hooks['post_command']: |
785 |
hook(self) |
|
5141.2.1
by Robert Collins
``bzrlib.commands.Command.run_direct`` is no longer needed - the pre |
786 |
self.run = run |
787 |
||
1162
by Martin Pool
- change Command infrastructure to use (mostly stateless) objects to |
788 |
def run(self): |
789 |
"""Actually run the command. |
|
329
by Martin Pool
- refactor command functions into command classes |
790 |
|
791 |
This is invoked with the options and arguments bound to
|
|
792 |
keyword parameters.
|
|
793 |
||
1162
by Martin Pool
- change Command infrastructure to use (mostly stateless) objects to |
794 |
Return 0 or None if the command was successful, or a non-zero
|
795 |
shell error code if not. It's OK for this method to allow
|
|
796 |
an exception to raise up.
|
|
5141.2.1
by Robert Collins
``bzrlib.commands.Command.run_direct`` is no longer needed - the pre |
797 |
|
7143.15.5
by Jelmer Vernooij
More PEP8 fixes. |
798 |
This method is automatically wrapped by Command.__init__ with a
|
7356.1.1
by Jelmer Vernooij
Use ExitStack context rather than brz-specific OperationWithCleanup. |
799 |
ExitStack, stored as self._exit_stack. This can be used
|
5141.2.1
by Robert Collins
``bzrlib.commands.Command.run_direct`` is no longer needed - the pre |
800 |
via self.add_cleanup to perform automatic cleanups at the end of
|
801 |
run().
|
|
802 |
||
803 |
The argument for run are assembled by introspection. So for instance,
|
|
804 |
if your command takes an argument files, you would declare::
|
|
805 |
||
806 |
def run(self, files=None):
|
|
807 |
pass
|
|
329
by Martin Pool
- refactor command functions into command classes |
808 |
"""
|
2155.2.1
by Marius Kruger
* Get command aliases to respect quoted arguments. |
809 |
raise NotImplementedError('no implementation of command %r' |
1610.1.3
by Martin Pool
Better error message for Command.run() not implemented |
810 |
% self.name()) |
329
by Martin Pool
- refactor command functions into command classes |
811 |
|
1162
by Martin Pool
- change Command infrastructure to use (mostly stateless) objects to |
812 |
def help(self): |
813 |
"""Return help message for this class.""" |
|
1610.1.2
by Martin Pool
Move rarely-used import into Command.help() |
814 |
from inspect import getdoc |
1162
by Martin Pool
- change Command infrastructure to use (mostly stateless) objects to |
815 |
if self.__doc__ is Command.__doc__: |
816 |
return None |
|
817 |
return getdoc(self) |
|
818 |
||
5875.4.3
by INADA Naoki
Don't use property |
819 |
def gettext(self, message): |
5875.3.1
by INADA Naoki
Implement command help l10n. |
820 |
"""Returns the gettext function used to translate this command's help. |
821 |
||
5875.3.18
by INADA Naoki
Fix docstring of Command.get_gettext |
822 |
Commands provided by plugins should override this to use their
|
823 |
own i18n system.
|
|
5875.3.1
by INADA Naoki
Implement command help l10n. |
824 |
"""
|
5875.3.25
by Vincent Ladeuil
Fix test failures and make sure we don't rely on a default translation. |
825 |
return i18n.gettext_per_paragraph(message) |
5875.3.1
by INADA Naoki
Implement command help l10n. |
826 |
|
1162
by Martin Pool
- change Command infrastructure to use (mostly stateless) objects to |
827 |
def name(self): |
5741.3.1
by Martin Pool
Add Command.invoked_as |
828 |
"""Return the canonical name for this command. |
829 |
||
7143.15.5
by Jelmer Vernooij
More PEP8 fixes. |
830 |
The name under which it was actually invoked is available in invoked_as
|
5741.3.1
by Martin Pool
Add Command.invoked_as |
831 |
"""
|
1162
by Martin Pool
- change Command infrastructure to use (mostly stateless) objects to |
832 |
return _unsquish_command_name(self.__class__.__name__) |
833 |
||
1733.2.5
by Michael Ellerman
Show which plugin (if any) provides a command. |
834 |
def plugin_name(self): |
835 |
"""Get the name of the plugin that provides this command. |
|
836 |
||
837 |
:return: The name of the plugin or None if the command is builtin.
|
|
838 |
"""
|
|
6651.4.2
by Martin
Move plugin_name logic from commands to plugin to fix test |
839 |
return plugin_name(self.__module__) |
1733.2.5
by Michael Ellerman
Show which plugin (if any) provides a command. |
840 |
|
1162
by Martin Pool
- change Command infrastructure to use (mostly stateless) objects to |
841 |
|
4000.1.1
by Robert Collins
Add a new hook Commands['extend_command'] for plugins that want to alter commands without overriding the entire command. |
842 |
class CommandHooks(Hooks): |
843 |
"""Hooks related to Command object creation/enumeration.""" |
|
844 |
||
5622.3.10
by Jelmer Vernooij
Don't require arguments to hooks. |
845 |
def __init__(self): |
4000.1.1
by Robert Collins
Add a new hook Commands['extend_command'] for plugins that want to alter commands without overriding the entire command. |
846 |
"""Create the default hooks. |
847 |
||
848 |
These are all empty initially, because by default nothing should get
|
|
849 |
notified.
|
|
850 |
"""
|
|
6622.1.34
by Jelmer Vernooij
Rename brzlib => breezy. |
851 |
Hooks.__init__(self, "breezy.commands", "Command.hooks") |
7143.15.5
by Jelmer Vernooij
More PEP8 fixes. |
852 |
self.add_hook( |
853 |
'extend_command', |
|
854 |
"Called after creating a command object to allow modifications "
|
|
855 |
"such as adding or removing options, docs etc. Called with the "
|
|
856 |
"new breezy.commands.Command object.", (1, 13)) |
|
857 |
self.add_hook( |
|
858 |
'get_command', |
|
859 |
"Called when creating a single command. Called with "
|
|
860 |
"(cmd_or_None, command_name). get_command should either return "
|
|
861 |
"the cmd_or_None parameter, or a replacement Command object that "
|
|
862 |
"should be used for the command. Note that the Command.hooks "
|
|
863 |
"hooks are core infrastructure. Many users will prefer to use "
|
|
864 |
"breezy.commands.register_command or plugin_cmds.register_lazy.", |
|
865 |
(1, 17)) |
|
866 |
self.add_hook( |
|
867 |
'get_missing_command', |
|
868 |
"Called when creating a single command if no command could be "
|
|
869 |
"found. Called with (command_name). get_missing_command should "
|
|
870 |
"either return None, or a Command object to be used for the "
|
|
871 |
"command.", (1, 17)) |
|
872 |
self.add_hook( |
|
873 |
'list_commands', |
|
874 |
"Called when enumerating commands. Called with a set of "
|
|
875 |
"cmd_name strings for all the commands found so far. This set "
|
|
876 |
" is safe to mutate - e.g. to remove a command. "
|
|
877 |
"list_commands should return the updated set of command names.", |
|
878 |
(1, 17)) |
|
879 |
self.add_hook( |
|
880 |
'pre_command', |
|
881 |
"Called prior to executing a command. Called with the command "
|
|
882 |
"object.", (2, 6)) |
|
883 |
self.add_hook( |
|
884 |
'post_command', |
|
885 |
"Called after executing a command. Called with the command "
|
|
886 |
"object.", (2, 6)) |
|
7143.15.2
by Jelmer Vernooij
Run autopep8. |
887 |
|
4000.1.1
by Robert Collins
Add a new hook Commands['extend_command'] for plugins that want to alter commands without overriding the entire command. |
888 |
|
5622.3.10
by Jelmer Vernooij
Don't require arguments to hooks. |
889 |
Command.hooks = CommandHooks() |
4000.1.1
by Robert Collins
Add a new hook Commands['extend_command'] for plugins that want to alter commands without overriding the entire command. |
890 |
|
891 |
||
1553.6.11
by Erik Bågfors
small bugfixes, all tests pass now |
892 |
def parse_args(command, argv, alias_argv=None): |
1
by mbp at sourcefrog
import from baz patch-364 |
893 |
"""Parse command line. |
3943.8.1
by Marius Kruger
remove all trailing whitespace from bzr source |
894 |
|
1
by mbp at sourcefrog
import from baz patch-364 |
895 |
Arguments and options are parsed at this level before being passed
|
896 |
down to specific command handlers. This routine knows, from a
|
|
897 |
lookup table, something about the available options, what optargs
|
|
898 |
they take, and which commands will accept them.
|
|
899 |
"""
|
|
1857.1.1
by Aaron Bentley
Use optparse for parsing options |
900 |
# TODO: make it a method of the Command?
|
7045.4.23
by Jelmer Vernooij
Fix some help tests. |
901 |
parser = option.get_optparser( |
7143.15.2
by Jelmer Vernooij
Run autopep8. |
902 |
[v for k, v in sorted(command.options().items())]) |
1857.1.1
by Aaron Bentley
Use optparse for parsing options |
903 |
if alias_argv is not None: |
904 |
args = alias_argv + argv |
|
905 |
else: |
|
906 |
args = argv |
|
683
by Martin Pool
- short option stacking patch from John A Meinel |
907 |
|
7078.15.1
by Jelmer Vernooij
Fix some more tests. |
908 |
# python 2's optparse raises this exception if a non-ascii
|
5514.3.2
by Rory Yorke
Added comment on try-except around pargse_args(), w/ pointer to Python bug. |
909 |
# option name is given. See http://bugs.python.org/issue2931
|
5514.3.1
by Rory Yorke
Report an error if a non-ASCII option name is given (bug 140563). |
910 |
try: |
911 |
options, args = parser.parse_args(args) |
|
7143.15.5
by Jelmer Vernooij
More PEP8 fixes. |
912 |
except UnicodeEncodeError: |
7490.61.1
by Jelmer Vernooij
Rename BzrCommandError to CommandError. |
913 |
raise errors.CommandError( |
6171.2.1
by Vincent Ladeuil
Global options respect their hidden attribute |
914 |
gettext('Only ASCII permitted in option names')) |
5514.3.1
by Rory Yorke
Report an error if a non-ASCII option name is given (bug 140563). |
915 |
|
6656.1.1
by Martin
Apply 2to3 dict fixer and clean up resulting mess using view helpers |
916 |
opts = dict((k, v) for k, v in options.__dict__.items() if |
917 |
v is not option.OptionParser.DEFAULT_VALUE) |
|
1
by mbp at sourcefrog
import from baz patch-364 |
918 |
return args, opts |
919 |
||
920 |
||
329
by Martin Pool
- refactor command functions into command classes |
921 |
def _match_argform(cmd, takes_args, args): |
1
by mbp at sourcefrog
import from baz patch-364 |
922 |
argdict = {} |
26
by mbp at sourcefrog
fix StopIteration error on python2.3(?) |
923 |
|
329
by Martin Pool
- refactor command functions into command classes |
924 |
# step through args and takes_args, allowing appropriate 0-many matches
|
925 |
for ap in takes_args: |
|
1
by mbp at sourcefrog
import from baz patch-364 |
926 |
argname = ap[:-1] |
927 |
if ap[-1] == '?': |
|
62
by mbp at sourcefrog
- new find_branch_root function; based on suggestion from aaron |
928 |
if args: |
929 |
argdict[argname] = args.pop(0) |
|
7143.15.2
by Jelmer Vernooij
Run autopep8. |
930 |
elif ap[-1] == '*': # all remaining arguments |
196
by mbp at sourcefrog
selected-file diff |
931 |
if args: |
932 |
argdict[argname + '_list'] = args[:] |
|
933 |
args = [] |
|
934 |
else: |
|
935 |
argdict[argname + '_list'] = None |
|
1
by mbp at sourcefrog
import from baz patch-364 |
936 |
elif ap[-1] == '+': |
937 |
if not args: |
|
7490.61.1
by Jelmer Vernooij
Rename BzrCommandError to CommandError. |
938 |
raise errors.CommandError(gettext( |
7143.15.2
by Jelmer Vernooij
Run autopep8. |
939 |
"command {0!r} needs one or more {1}").format( |
940 |
cmd, argname.upper())) |
|
1
by mbp at sourcefrog
import from baz patch-364 |
941 |
else: |
942 |
argdict[argname + '_list'] = args[:] |
|
943 |
args = [] |
|
7143.15.2
by Jelmer Vernooij
Run autopep8. |
944 |
elif ap[-1] == '$': # all but one |
160
by mbp at sourcefrog
- basic support for moving files to different directories - have not done support for renaming them yet, but should be straightforward - some tests, but many cases are not handled yet i think |
945 |
if len(args) < 2: |
7490.61.1
by Jelmer Vernooij
Rename BzrCommandError to CommandError. |
946 |
raise errors.CommandError( |
7143.15.2
by Jelmer Vernooij
Run autopep8. |
947 |
gettext("command {0!r} needs one or more {1}").format( |
948 |
cmd, argname.upper())) |
|
160
by mbp at sourcefrog
- basic support for moving files to different directories - have not done support for renaming them yet, but should be straightforward - some tests, but many cases are not handled yet i think |
949 |
argdict[argname + '_list'] = args[:-1] |
1740.5.6
by Martin Pool
Clean up many exception classes. |
950 |
args[:-1] = [] |
1
by mbp at sourcefrog
import from baz patch-364 |
951 |
else: |
952 |
# just a plain arg
|
|
953 |
argname = ap |
|
954 |
if not args: |
|
7490.61.1
by Jelmer Vernooij
Rename BzrCommandError to CommandError. |
955 |
raise errors.CommandError( |
7143.15.2
by Jelmer Vernooij
Run autopep8. |
956 |
gettext("command {0!r} requires argument {1}").format( |
957 |
cmd, argname.upper())) |
|
1
by mbp at sourcefrog
import from baz patch-364 |
958 |
else: |
959 |
argdict[argname] = args.pop(0) |
|
3943.8.1
by Marius Kruger
remove all trailing whitespace from bzr source |
960 |
|
1
by mbp at sourcefrog
import from baz patch-364 |
961 |
if args: |
7490.61.1
by Jelmer Vernooij
Rename BzrCommandError to CommandError. |
962 |
raise errors.CommandError(gettext( |
7143.15.2
by Jelmer Vernooij
Run autopep8. |
963 |
"extra argument to command {0}: {1}").format( |
964 |
cmd, args[0])) |
|
1
by mbp at sourcefrog
import from baz patch-364 |
965 |
|
966 |
return argdict |
|
967 |
||
6759.3.2
by Jelmer Vernooij
Just use an absolute import for trace. :) |
968 |
|
6954.1.7
by Jelmer Vernooij
Switch to coverage. |
969 |
def apply_coveraged(the_callable, *args, **kwargs): |
970 |
import coverage |
|
971 |
cov = coverage.Coverage() |
|
7481.1.1
by Jelmer Vernooij
Fix support for newer versions of coverage. |
972 |
try: |
973 |
config_file = cov.config.config_file |
|
974 |
except AttributeError: # older versions of coverage |
|
975 |
config_file = cov.config_file |
|
7482.1.1
by Jelmer Vernooij
Fix compatibility with newer versions of coverage module. |
976 |
os.environ['COVERAGE_PROCESS_START'] = config_file |
6954.1.7
by Jelmer Vernooij
Switch to coverage. |
977 |
cov.start() |
4084.6.1
by Robert Collins
Refactor profiling exception handling to restore clear layers - command handling in commands.py, profiling in lsprof.py. |
978 |
try: |
979 |
return exception_to_return_code(the_callable, *args, **kwargs) |
|
980 |
finally: |
|
6954.1.7
by Jelmer Vernooij
Switch to coverage. |
981 |
cov.stop() |
982 |
cov.save() |
|
1
by mbp at sourcefrog
import from baz patch-364 |
983 |
|
984 |
||
1162
by Martin Pool
- change Command infrastructure to use (mostly stateless) objects to |
985 |
def apply_profiled(the_callable, *args, **kwargs): |
986 |
import hotshot |
|
987 |
import tempfile |
|
1393.1.27
by Martin Pool
- clean up profile code and change default sort order |
988 |
import hotshot.stats |
1162
by Martin Pool
- change Command infrastructure to use (mostly stateless) objects to |
989 |
pffileno, pfname = tempfile.mkstemp() |
990 |
try: |
|
991 |
prof = hotshot.Profile(pfname) |
|
992 |
try: |
|
4084.6.1
by Robert Collins
Refactor profiling exception handling to restore clear layers - command handling in commands.py, profiling in lsprof.py. |
993 |
ret = prof.runcall(exception_to_return_code, the_callable, *args, |
7143.15.2
by Jelmer Vernooij
Run autopep8. |
994 |
**kwargs) or 0 |
1162
by Martin Pool
- change Command infrastructure to use (mostly stateless) objects to |
995 |
finally: |
996 |
prof.close() |
|
997 |
stats = hotshot.stats.load(pfname) |
|
1393.1.27
by Martin Pool
- clean up profile code and change default sort order |
998 |
stats.strip_dirs() |
999 |
stats.sort_stats('cum') # 'time' |
|
7143.15.2
by Jelmer Vernooij
Run autopep8. |
1000 |
# XXX: Might like to write to stderr or the trace file instead but
|
1001 |
# print_stats seems hardcoded to stdout
|
|
1162
by Martin Pool
- change Command infrastructure to use (mostly stateless) objects to |
1002 |
stats.print_stats(20) |
1003 |
return ret |
|
1004 |
finally: |
|
1005 |
os.close(pffileno) |
|
1006 |
os.remove(pfname) |
|
1007 |
||
1008 |
||
4084.6.1
by Robert Collins
Refactor profiling exception handling to restore clear layers - command handling in commands.py, profiling in lsprof.py. |
1009 |
def exception_to_return_code(the_callable, *args, **kwargs): |
1010 |
"""UI level helper for profiling and coverage. |
|
1011 |
||
4084.6.3
by Robert Collins
Disagreement on trailing whitespace with the test suite. |
1012 |
This transforms exceptions into a return value of 3. As such its only
|
4084.6.1
by Robert Collins
Refactor profiling exception handling to restore clear layers - command handling in commands.py, profiling in lsprof.py. |
1013 |
relevant to the UI layer, and should never be called where catching
|
1014 |
exceptions may be desirable.
|
|
1015 |
"""
|
|
1016 |
try: |
|
1017 |
return the_callable(*args, **kwargs) |
|
7143.15.5
by Jelmer Vernooij
More PEP8 fixes. |
1018 |
except (KeyboardInterrupt, Exception): |
4084.6.1
by Robert Collins
Refactor profiling exception handling to restore clear layers - command handling in commands.py, profiling in lsprof.py. |
1019 |
# used to handle AssertionError and KeyboardInterrupt
|
1020 |
# specially here, but hopefully they're handled ok by the logger now
|
|
1021 |
exc_info = sys.exc_info() |
|
1022 |
exitcode = trace.report_exception(exc_info, sys.stderr) |
|
6622.1.28
by Jelmer Vernooij
More renames; commands in output, environment variables. |
1023 |
if os.environ.get('BRZ_PDB'): |
6619.3.3
by Jelmer Vernooij
Apply 2to3 print fix. |
1024 |
print('**** entering debugger') |
4084.6.1
by Robert Collins
Refactor profiling exception handling to restore clear layers - command handling in commands.py, profiling in lsprof.py. |
1025 |
import pdb |
6555.1.2
by Jelmer Vernooij
Inline traceback specification. |
1026 |
pdb.post_mortem(exc_info[2]) |
4084.6.1
by Robert Collins
Refactor profiling exception handling to restore clear layers - command handling in commands.py, profiling in lsprof.py. |
1027 |
return exitcode |
1028 |
||
1029 |
||
1553.7.1
by Robey Pointer
add --lsprof-file option to specify a file for writing lsprof data to (instead of dumping a pretty-print to the terminal) |
1030 |
def apply_lsprofiled(filename, the_callable, *args, **kwargs): |
6622.1.34
by Jelmer Vernooij
Rename brzlib => breezy. |
1031 |
from breezy.lsprof import profile |
6027.1.3
by Vincent Ladeuil
Remove bzrlib.commands deprecated stuff. |
1032 |
ret, stats = profile(exception_to_return_code, the_callable, |
1033 |
*args, **kwargs) |
|
1185.33.85
by Martin Pool
New --lsprof option from Denys Duchier |
1034 |
stats.sort() |
1553.7.1
by Robey Pointer
add --lsprof-file option to specify a file for writing lsprof data to (instead of dumping a pretty-print to the terminal) |
1035 |
if filename is None: |
1036 |
stats.pprint() |
|
1037 |
else: |
|
2654.2.2
by Ian Clatworthy
Put all format detection stuff in one spot as requested by John Arbash Meinel |
1038 |
stats.save(filename) |
6138.3.2
by Jonathan Riddell
gettext-ify bzrlib/commit.py |
1039 |
trace.note(gettext('Profile data written to "%s".'), filename) |
1185.33.85
by Martin Pool
New --lsprof option from Denys Duchier |
1040 |
return ret |
1041 |
||
1553.6.9
by Erik Bågfors
PEP8-ify |
1042 |
|
2155.2.1
by Marius Kruger
* Get command aliases to respect quoted arguments. |
1043 |
def get_alias(cmd, config=None): |
1044 |
"""Return an expanded alias, or None if no alias exists. |
|
1045 |
||
1046 |
cmd
|
|
1047 |
Command to be checked for an alias.
|
|
1048 |
config
|
|
1049 |
Used to specify an alternative config to use,
|
|
2155.2.3
by Marius Kruger
* commands.py |
1050 |
which is especially useful for testing.
|
2155.2.1
by Marius Kruger
* Get command aliases to respect quoted arguments. |
1051 |
If it is unspecified, the global config will be used.
|
1052 |
"""
|
|
1053 |
if config is None: |
|
6622.1.34
by Jelmer Vernooij
Rename brzlib => breezy. |
1054 |
import breezy.config |
1055 |
config = breezy.config.GlobalConfig() |
|
2155.2.1
by Marius Kruger
* Get command aliases to respect quoted arguments. |
1056 |
alias = config.get_alias(cmd) |
1553.6.1
by Erik Bågfors
support for aliases in bazaar.conf |
1057 |
if (alias): |
4913.5.24
by Gordon Tyler
Added cmdline.split function, which replaces commands.shlex_split_unicode. |
1058 |
return cmdline.split(alias) |
1553.6.8
by Erik Bågfors
support for overrides |
1059 |
return None |
1553.6.1
by Erik Bågfors
support for aliases in bazaar.conf |
1060 |
|
1553.6.9
by Erik Bågfors
PEP8-ify |
1061 |
|
5051.1.1
by Robert Collins
* ``bzrlib.comands.run_bzr`` is more extensible: callers can supply the |
1062 |
def run_bzr(argv, load_plugins=load_plugins, disable_plugins=disable_plugins): |
1
by mbp at sourcefrog
import from baz patch-364 |
1063 |
"""Execute a command. |
1064 |
||
5051.1.1
by Robert Collins
* ``bzrlib.comands.run_bzr`` is more extensible: callers can supply the |
1065 |
:param argv: The command-line arguments, without the program name from
|
1066 |
argv[0] These should already be decoded. All library/test code calling
|
|
1067 |
run_bzr should be passing valid strings (don't need decoding).
|
|
1068 |
:param load_plugins: What function to call when triggering plugin loading.
|
|
1069 |
This function should take no arguments and cause all plugins to be
|
|
1070 |
loaded.
|
|
1071 |
:param disable_plugins: What function to call when disabling plugin
|
|
1072 |
loading. This function should take no arguments and cause all plugin
|
|
1073 |
loading to be prohibited (so that code paths in your application that
|
|
1074 |
know about some plugins possibly being present will fail to import
|
|
1075 |
those plugins even if they are installed.)
|
|
1076 |
:return: Returns a command exit code or raises an exception.
|
|
974.1.26
by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472 |
1077 |
|
1078 |
Special master options: these must come before the command because
|
|
1079 |
they control how the command is interpreted.
|
|
1080 |
||
1081 |
--no-plugins
|
|
1082 |
Do not load plugin modules at all
|
|
1083 |
||
1553.6.1
by Erik Bågfors
support for aliases in bazaar.conf |
1084 |
--no-aliases
|
1085 |
Do not allow aliases
|
|
1086 |
||
974.1.26
by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472 |
1087 |
--builtin
|
1088 |
Only use builtin commands. (Plugins are still allowed to change
|
|
1089 |
other behaviour.)
|
|
1090 |
||
1091 |
--profile
|
|
1185.33.85
by Martin Pool
New --lsprof option from Denys Duchier |
1092 |
Run under the Python hotshot profiler.
|
1093 |
||
1094 |
--lsprof
|
|
1095 |
Run under the Python lsprof profiler.
|
|
3169.3.1
by Andrew Bennetts
Make --coverage a global option. |
1096 |
|
1097 |
--coverage
|
|
6954.1.7
by Jelmer Vernooij
Switch to coverage. |
1098 |
Generate code coverage report
|
4766.3.7
by Vincent Ladeuil
Mix BZR_CONCURRENCY and --concurrency so both are available. |
1099 |
|
1100 |
--concurrency
|
|
7143.15.5
by Jelmer Vernooij
More PEP8 fixes. |
1101 |
Specify the number of processes that can be run concurrently
|
1102 |
(selftest).
|
|
1
by mbp at sourcefrog
import from baz patch-364 |
1103 |
"""
|
6622.1.34
by Jelmer Vernooij
Rename brzlib => breezy. |
1104 |
trace.mutter("breezy version: " + breezy.__version__) |
5785.1.2
by Martin
Move _specified_or_unicode_argv call inside run_bzr as it may raise an error that should be reported |
1105 |
argv = _specified_or_unicode_argv(argv) |
6622.1.1
by Jelmer Vernooij
Rename bzrlib => brzlib, bzr => brz. |
1106 |
trace.mutter("brz arguments: %r", argv) |
907.1.21
by John Arbash Meinel
Adding http transport as a valid transport protocol. |
1107 |
|
5875.3.1
by INADA Naoki
Implement command help l10n. |
1108 |
opt_lsprof = opt_profile = opt_no_plugins = opt_builtin = \ |
7143.15.2
by Jelmer Vernooij
Run autopep8. |
1109 |
opt_coverage = opt_no_l10n = opt_no_aliases = False |
6954.1.7
by Jelmer Vernooij
Switch to coverage. |
1110 |
opt_lsprof_file = None |
974.1.26
by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472 |
1111 |
|
1112 |
# --no-plugins is handled specially at a very early stage. We need
|
|
1113 |
# to load plugins before doing other command parsing so that they
|
|
1114 |
# can override commands, but this needs to happen first.
|
|
1115 |
||
1553.7.1
by Robey Pointer
add --lsprof-file option to specify a file for writing lsprof data to (instead of dumping a pretty-print to the terminal) |
1116 |
argv_copy = [] |
1117 |
i = 0 |
|
6161.1.4
by Vincent Ladeuil
Follow the lead of other 'global' options which are not declared in option.py but handled in bzrlib.commands.run_bzr instead. |
1118 |
override_config = [] |
1553.7.1
by Robey Pointer
add --lsprof-file option to specify a file for writing lsprof data to (instead of dumping a pretty-print to the terminal) |
1119 |
while i < len(argv): |
1120 |
a = argv[i] |
|
974.1.26
by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472 |
1121 |
if a == '--profile': |
1122 |
opt_profile = True |
|
1185.33.85
by Martin Pool
New --lsprof option from Denys Duchier |
1123 |
elif a == '--lsprof': |
1124 |
opt_lsprof = True |
|
1553.7.1
by Robey Pointer
add --lsprof-file option to specify a file for writing lsprof data to (instead of dumping a pretty-print to the terminal) |
1125 |
elif a == '--lsprof-file': |
1706.2.6
by Robey Pointer
when giving --lsprof-file, assume --lsprof |
1126 |
opt_lsprof = True |
1553.7.1
by Robey Pointer
add --lsprof-file option to specify a file for writing lsprof data to (instead of dumping a pretty-print to the terminal) |
1127 |
opt_lsprof_file = argv[i + 1] |
1128 |
i += 1 |
|
974.1.26
by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472 |
1129 |
elif a == '--no-plugins': |
1130 |
opt_no_plugins = True |
|
1553.6.1
by Erik Bågfors
support for aliases in bazaar.conf |
1131 |
elif a == '--no-aliases': |
1132 |
opt_no_aliases = True |
|
5875.3.22
by INADA Naoki
s/i18n/l10n/ |
1133 |
elif a == '--no-l10n': |
1134 |
opt_no_l10n = True |
|
974.1.26
by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472 |
1135 |
elif a == '--builtin': |
1136 |
opt_builtin = True |
|
4766.3.4
by Matt Nordhoff
Change the environment variable to a global option. |
1137 |
elif a == '--concurrency': |
6622.1.28
by Jelmer Vernooij
More renames; commands in output, environment variables. |
1138 |
os.environ['BRZ_CONCURRENCY'] = argv[i + 1] |
4766.3.4
by Matt Nordhoff
Change the environment variable to a global option. |
1139 |
i += 1 |
3169.3.1
by Andrew Bennetts
Make --coverage a global option. |
1140 |
elif a == '--coverage': |
6954.1.7
by Jelmer Vernooij
Switch to coverage. |
1141 |
opt_coverage = True |
5274.4.10
by Jason Spashett
Take away removal of --profile-imports from bzr script. Instead ignore this in global options bzrlib/commands.py run_bzr |
1142 |
elif a == '--profile-imports': |
7143.15.2
by Jelmer Vernooij
Run autopep8. |
1143 |
pass # already handled in startup script Bug #588277 |
2095.5.1
by Martin Pool
Add new -Derror global option to always display tracebacks |
1144 |
elif a.startswith('-D'): |
2095.5.2
by Martin Pool
save commit message if commit fails (#32054) |
1145 |
debug.debug_flags.add(a[2:]) |
6161.1.4
by Vincent Ladeuil
Follow the lead of other 'global' options which are not declared in option.py but handled in bzrlib.commands.run_bzr instead. |
1146 |
elif a.startswith('-O'): |
1147 |
override_config.append(a[2:]) |
|
974.1.26
by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472 |
1148 |
else: |
1553.7.1
by Robey Pointer
add --lsprof-file option to specify a file for writing lsprof data to (instead of dumping a pretty-print to the terminal) |
1149 |
argv_copy.append(a) |
1150 |
i += 1 |
|
974.1.26
by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472 |
1151 |
|
6759.4.2
by Jelmer Vernooij
Use get_global_state> |
1152 |
cmdline_overrides = breezy.get_global_state().cmdline_overrides |
6437.6.1
by Vincent Ladeuil
Support scripts that don't call bzrlib.initialize() but still call run_bzr(). |
1153 |
cmdline_overrides._from_cmdline(override_config) |
6161.1.4
by Vincent Ladeuil
Follow the lead of other 'global' options which are not declared in option.py but handled in bzrlib.commands.run_bzr instead. |
1154 |
|
4070.8.2
by Martin Pool
Initial support for debug_flags config option |
1155 |
debug.set_debug_flags_from_config() |
1156 |
||
5051.1.1
by Robert Collins
* ``bzrlib.comands.run_bzr`` is more extensible: callers can supply the |
1157 |
if not opt_no_plugins: |
7490.98.2
by Jelmer Vernooij
Don't hide problems from plugins by default. |
1158 |
from breezy import config |
1159 |
c = config.GlobalConfig() |
|
1160 |
warn_load_problems = not c.suppress_warning('plugin_load_failure') |
|
1161 |
load_plugins(warn_load_problems=warn_load_problems) |
|
5051.1.1
by Robert Collins
* ``bzrlib.comands.run_bzr`` is more extensible: callers can supply the |
1162 |
else: |
1163 |
disable_plugins() |
|
1164 |
||
1553.7.1
by Robey Pointer
add --lsprof-file option to specify a file for writing lsprof data to (instead of dumping a pretty-print to the terminal) |
1165 |
argv = argv_copy |
1616.1.15
by Martin Pool
Handle 'bzr ?', etc. |
1166 |
if (not argv): |
5051.1.1
by Robert Collins
* ``bzrlib.comands.run_bzr`` is more extensible: callers can supply the |
1167 |
get_cmd_object('help').run_argv_aliases([]) |
1165
by Martin Pool
- move parsing of argv into arguments and options into Command.run_argv |
1168 |
return 0 |
1169 |
||
1170 |
if argv[0] == '--version': |
|
5051.1.1
by Robert Collins
* ``bzrlib.comands.run_bzr`` is more extensible: callers can supply the |
1171 |
get_cmd_object('version').run_argv_aliases([]) |
1165
by Martin Pool
- move parsing of argv into arguments and options into Command.run_argv |
1172 |
return 0 |
3755.1.1
by Vincent Ladeuil
Fix --verbose leaking into blackbox tests. |
1173 |
|
1553.6.17
by Erik Bågfors
fix for broken --no-aliases |
1174 |
alias_argv = None |
1175 |
||
1553.6.1
by Erik Bågfors
support for aliases in bazaar.conf |
1176 |
if not opt_no_aliases: |
1553.6.8
by Erik Bågfors
support for overrides |
1177 |
alias_argv = get_alias(argv[0]) |
1178 |
if alias_argv: |
|
1179 |
argv[0] = alias_argv.pop(0) |
|
1553.6.1
by Erik Bågfors
support for aliases in bazaar.conf |
1180 |
|
1948.1.1
by John Arbash Meinel
Raise a reasonable error when a command is non-ascii |
1181 |
cmd = argv.pop(0) |
1162
by Martin Pool
- change Command infrastructure to use (mostly stateless) objects to |
1182 |
cmd_obj = get_cmd_object(cmd, plugins_override=not opt_builtin) |
5875.4.6
by INADA Naoki
Call i18n.install in get_help_text. |
1183 |
if opt_no_l10n: |
6621.2.26
by Martin
Misc set of changes to get started with selftest on Python 3 |
1184 |
cmd_obj.l10n = False |
2367.2.1
by Robert Collins
Remove bzrlib 0.8 compatability where it was making the code unclear or messy. (Robert Collins) |
1185 |
run = cmd_obj.run_argv_aliases |
1186 |
run_argv = [argv, alias_argv] |
|
1534.7.154
by Aaron Bentley
Removed changes from bzr.ab 1529..1536 |
1187 |
|
1185.33.42
by Martin Pool
[patch] make --quiet a global option (robey) |
1188 |
try: |
3755.1.1
by Vincent Ladeuil
Fix --verbose leaking into blackbox tests. |
1189 |
# We can be called recursively (tests for example), but we don't want
|
1190 |
# the verbosity level to propagate.
|
|
1191 |
saved_verbosity_level = option._verbosity_level |
|
1192 |
option._verbosity_level = 0 |
|
1185.33.85
by Martin Pool
New --lsprof option from Denys Duchier |
1193 |
if opt_lsprof: |
6954.1.7
by Jelmer Vernooij
Switch to coverage. |
1194 |
if opt_coverage: |
3169.3.4
by Andrew Bennetts
Warn if --coverage is used with a conflicting global option. |
1195 |
trace.warning( |
1196 |
'--coverage ignored, because --lsprof is in use.') |
|
1581.1.1
by Robert Collins
Bugfix aliases to be backwards compatible with plugins providing command.run_argv. |
1197 |
ret = apply_lsprofiled(opt_lsprof_file, run, *run_argv) |
1185.33.85
by Martin Pool
New --lsprof option from Denys Duchier |
1198 |
elif opt_profile: |
6954.1.7
by Jelmer Vernooij
Switch to coverage. |
1199 |
if opt_coverage: |
3169.3.4
by Andrew Bennetts
Warn if --coverage is used with a conflicting global option. |
1200 |
trace.warning( |
1201 |
'--coverage ignored, because --profile is in use.') |
|
1581.1.1
by Robert Collins
Bugfix aliases to be backwards compatible with plugins providing command.run_argv. |
1202 |
ret = apply_profiled(run, *run_argv) |
6954.1.7
by Jelmer Vernooij
Switch to coverage. |
1203 |
elif opt_coverage: |
1204 |
ret = apply_coveraged(run, *run_argv) |
|
1185.33.42
by Martin Pool
[patch] make --quiet a global option (robey) |
1205 |
else: |
1581.1.1
by Robert Collins
Bugfix aliases to be backwards compatible with plugins providing command.run_argv. |
1206 |
ret = run(*run_argv) |
1185.33.42
by Martin Pool
[patch] make --quiet a global option (robey) |
1207 |
return ret or 0 |
1208 |
finally: |
|
3755.1.1
by Vincent Ladeuil
Fix --verbose leaking into blackbox tests. |
1209 |
# reset, in case we may do other commands later within the same
|
1210 |
# process. Commands that want to execute sub-commands must propagate
|
|
1211 |
# --verbose in their own way.
|
|
4682.1.1
by John Arbash Meinel
Put the 'debug_memory' check into the finally clause. |
1212 |
if 'memory' in debug.debug_flags: |
1213 |
trace.debug_memory('Process status after command:', short=False) |
|
3755.1.1
by Vincent Ladeuil
Fix --verbose leaking into blackbox tests. |
1214 |
option._verbosity_level = saved_verbosity_level |
7143.15.2
by Jelmer Vernooij
Run autopep8. |
1215 |
# Reset the overrides
|
6437.6.1
by Vincent Ladeuil
Support scripts that don't call bzrlib.initialize() but still call run_bzr(). |
1216 |
cmdline_overrides._reset() |
267
by Martin Pool
- better reporting of errors |
1217 |
|
4000.1.1
by Robert Collins
Add a new hook Commands['extend_command'] for plugins that want to alter commands without overriding the entire command. |
1218 |
|
1185.12.56
by Aaron Bentley
Prevented display commands from printing broken pipe errors |
1219 |
def display_command(func): |
1185.33.18
by Martin Pool
[patch] handle bad IOError subclass raised by urlopen |
1220 |
"""Decorator that suppresses pipe/interrupt errors.""" |
1185.12.56
by Aaron Bentley
Prevented display commands from printing broken pipe errors |
1221 |
def ignore_pipe(*args, **kwargs): |
1222 |
try: |
|
1185.35.22
by Aaron Bentley
Handled more pipe errors for display commands. |
1223 |
result = func(*args, **kwargs) |
1224 |
sys.stdout.flush() |
|
1225 |
return result |
|
6619.3.2
by Jelmer Vernooij
Apply 2to3 except fix. |
1226 |
except IOError as e: |
1963.2.6
by Robey Pointer
pychecker is on crack; go back to using 'is None'. |
1227 |
if getattr(e, 'errno', None) is None: |
1185.33.18
by Martin Pool
[patch] handle bad IOError subclass raised by urlopen |
1228 |
raise
|
1185.12.56
by Aaron Bentley
Prevented display commands from printing broken pipe errors |
1229 |
if e.errno != errno.EPIPE: |
1711.4.31
by John Arbash Meinel
Catch proper error instead of EPIPE on win32, also don't double flush |
1230 |
# Win32 raises IOError with errno=0 on a broken pipe
|
2304.2.1
by Alexander Belchenko
Suppress IOError with errno=22 (Invalid argument) on win32 when pipe is broken |
1231 |
if sys.platform != 'win32' or (e.errno not in (0, errno.EINVAL)): |
1711.4.31
by John Arbash Meinel
Catch proper error instead of EPIPE on win32, also don't double flush |
1232 |
raise
|
1185.33.18
by Martin Pool
[patch] handle bad IOError subclass raised by urlopen |
1233 |
pass
|
1185.12.69
by Aaron Bentley
Ignored ^C in display commands |
1234 |
except KeyboardInterrupt: |
1490
by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1. |
1235 |
pass
|
1185.12.56
by Aaron Bentley
Prevented display commands from printing broken pipe errors |
1236 |
return ignore_pipe |
267
by Martin Pool
- better reporting of errors |
1237 |
|
1185.43.6
by Martin Pool
Enable logging early enough to save argv |
1238 |
|
4119.3.8
by Robert Collins
Get missing command support sorted out. |
1239 |
def install_bzr_command_hooks(): |
1240 |
"""Install the hooks to supply bzr's own commands.""" |
|
4119.3.13
by Robert Collins
Unbreak blackbox tests. |
1241 |
if _list_bzr_commands in Command.hooks["list_commands"]: |
1242 |
return
|
|
4119.3.8
by Robert Collins
Get missing command support sorted out. |
1243 |
Command.hooks.install_named_hook("list_commands", _list_bzr_commands, |
7143.15.2
by Jelmer Vernooij
Run autopep8. |
1244 |
"bzr commands") |
4119.3.8
by Robert Collins
Get missing command support sorted out. |
1245 |
Command.hooks.install_named_hook("get_command", _get_bzr_command, |
7143.15.2
by Jelmer Vernooij
Run autopep8. |
1246 |
"bzr commands") |
4119.3.8
by Robert Collins
Get missing command support sorted out. |
1247 |
Command.hooks.install_named_hook("get_command", _get_plugin_command, |
7143.15.2
by Jelmer Vernooij
Run autopep8. |
1248 |
"bzr plugin commands") |
4119.3.8
by Robert Collins
Get missing command support sorted out. |
1249 |
Command.hooks.install_named_hook("get_command", _get_external_command, |
7143.15.2
by Jelmer Vernooij
Run autopep8. |
1250 |
"bzr external command lookup") |
6161.1.1
by Vincent Ladeuil
Allow config options to be overridden from the command line |
1251 |
Command.hooks.install_named_hook("get_missing_command", |
1252 |
_try_plugin_provider, |
|
1253 |
"bzr plugin-provider-db check") |
|
4119.3.8
by Robert Collins
Get missing command support sorted out. |
1254 |
|
1255 |
||
5017.1.1
by Martin Pool
Add bzrlib.initialize |
1256 |
def _specified_or_unicode_argv(argv): |
1257 |
# For internal or testing use, argv can be passed. Otherwise, get it from
|
|
7502.3.1
by Jelmer Vernooij
Cleanup Windows functions. |
1258 |
# the process arguments.
|
4355.2.1
by Alexander Belchenko
Using unicode Windows API to obtain command-line arguments. |
1259 |
if argv is None: |
7502.3.1
by Jelmer Vernooij
Cleanup Windows functions. |
1260 |
return sys.argv[1:] |
6754.2.1
by Martin
Fix _specified_or_unicode_argv for Python 3after osutils helper removal |
1261 |
new_argv = [] |
1262 |
try: |
|
1263 |
# ensure all arguments are unicode strings
|
|
1264 |
for a in argv: |
|
7479.2.1
by Jelmer Vernooij
Drop python2 support. |
1265 |
if not isinstance(a, str): |
6754.2.1
by Martin
Fix _specified_or_unicode_argv for Python 3after osutils helper removal |
1266 |
raise ValueError('not native str or unicode: %r' % (a,)) |
1267 |
new_argv.append(a) |
|
1268 |
except (ValueError, UnicodeDecodeError): |
|
1269 |
raise errors.BzrError("argv should be list of unicode strings.") |
|
1270 |
return new_argv |
|
5017.1.1
by Martin Pool
Add bzrlib.initialize |
1271 |
|
1272 |
||
1273 |
def main(argv=None): |
|
1274 |
"""Main entry point of command-line interface. |
|
1275 |
||
6622.1.34
by Jelmer Vernooij
Rename brzlib => breezy. |
1276 |
Typically `breezy.initialize` should be called first.
|
5017.1.1
by Martin Pool
Add bzrlib.initialize |
1277 |
|
1278 |
:param argv: list of unicode command-line arguments similar to sys.argv.
|
|
1279 |
argv[0] is script name usually, it will be ignored.
|
|
1280 |
Don't pass here sys.argv because this list contains plain strings
|
|
1281 |
and not unicode; pass None instead.
|
|
1282 |
||
6622.1.1
by Jelmer Vernooij
Rename bzrlib => brzlib, bzr => brz. |
1283 |
:return: exit code of brz command.
|
5017.1.1
by Martin Pool
Add bzrlib.initialize |
1284 |
"""
|
5785.1.2
by Martin
Move _specified_or_unicode_argv call inside run_bzr as it may raise an error that should be reported |
1285 |
if argv is not None: |
1286 |
argv = argv[1:] |
|
5018.1.3
by Martin Pool
Put builtin commands into a real registry |
1287 |
_register_builtin_commands() |
1185.85.4
by John Arbash Meinel
currently broken, trying to fix things up. |
1288 |
ret = run_bzr_catch_errors(argv) |
1996.3.1
by John Arbash Meinel
Demandloading builtins.py drops our load time from 350ms to 291ms |
1289 |
trace.mutter("return code %d", ret) |
1185.43.6
by Martin Pool
Enable logging early enough to save argv |
1290 |
return ret |
1185.3.19
by Martin Pool
- split out commandline error reporting for ease of testing |
1291 |
|
1292 |
||
1293 |
def run_bzr_catch_errors(argv): |
|
4084.6.1
by Robert Collins
Refactor profiling exception handling to restore clear layers - command handling in commands.py, profiling in lsprof.py. |
1294 |
"""Run a bzr command with parameters as described by argv. |
4084.6.3
by Robert Collins
Disagreement on trailing whitespace with the test suite. |
1295 |
|
4084.6.1
by Robert Collins
Refactor profiling exception handling to restore clear layers - command handling in commands.py, profiling in lsprof.py. |
1296 |
This function assumed that that UI layer is setup, that symbol deprecations
|
7143.15.5
by Jelmer Vernooij
More PEP8 fixes. |
1297 |
are already applied, and that unicode decoding has already been performed
|
1298 |
on argv.
|
|
4084.6.1
by Robert Collins
Refactor profiling exception handling to restore clear layers - command handling in commands.py, profiling in lsprof.py. |
1299 |
"""
|
5017.1.1
by Martin Pool
Add bzrlib.initialize |
1300 |
# done here so that they're covered for every test run
|
4119.3.13
by Robert Collins
Unbreak blackbox tests. |
1301 |
install_bzr_command_hooks() |
4084.6.1
by Robert Collins
Refactor profiling exception handling to restore clear layers - command handling in commands.py, profiling in lsprof.py. |
1302 |
return exception_to_return_code(run_bzr, argv) |
1
by mbp at sourcefrog
import from baz patch-364 |
1303 |
|
2432.1.2
by Robert Collins
Add a HelpCommandContext class for help from commands. |
1304 |
|
2830.2.1
by Martin Pool
If TestCase.run_bzr hits an internal exception, don't catch it but rather propagate up into the test suite |
1305 |
def run_bzr_catch_user_errors(argv): |
6622.1.28
by Jelmer Vernooij
More renames; commands in output, environment variables. |
1306 |
"""Run brz and report user errors, but let internal errors propagate. |
2830.2.1
by Martin Pool
If TestCase.run_bzr hits an internal exception, don't catch it but rather propagate up into the test suite |
1307 |
|
1308 |
This is used for the test suite, and might be useful for other programs
|
|
1309 |
that want to wrap the commandline interface.
|
|
1310 |
"""
|
|
5017.1.1
by Martin Pool
Add bzrlib.initialize |
1311 |
# done here so that they're covered for every test run
|
4119.3.13
by Robert Collins
Unbreak blackbox tests. |
1312 |
install_bzr_command_hooks() |
2830.2.1
by Martin Pool
If TestCase.run_bzr hits an internal exception, don't catch it but rather propagate up into the test suite |
1313 |
try: |
1314 |
return run_bzr(argv) |
|
6619.3.2
by Jelmer Vernooij
Apply 2to3 except fix. |
1315 |
except Exception as e: |
2830.2.1
by Martin Pool
If TestCase.run_bzr hits an internal exception, don't catch it but rather propagate up into the test suite |
1316 |
if (isinstance(e, (OSError, IOError)) |
7143.15.2
by Jelmer Vernooij
Run autopep8. |
1317 |
or not getattr(e, 'internal_error', True)): |
2830.2.1
by Martin Pool
If TestCase.run_bzr hits an internal exception, don't catch it but rather propagate up into the test suite |
1318 |
trace.report_exception(sys.exc_info(), sys.stderr) |
1319 |
return 3 |
|
1320 |
else: |
|
1321 |
raise
|
|
1322 |
||
1323 |
||
2432.1.15
by Robert Collins
Rename Context (in bzrlib.help) to Index, for a clearer name. |
1324 |
class HelpCommandIndex(object): |
1325 |
"""A index for bzr help that returns commands.""" |
|
2432.1.2
by Robert Collins
Add a HelpCommandContext class for help from commands. |
1326 |
|
2432.1.17
by Robert Collins
Add prefixes to HelpIndexes. |
1327 |
def __init__(self): |
1328 |
self.prefix = 'commands/' |
|
1329 |
||
2432.1.13
by Robert Collins
HelpCommandContext now implementes get_topics. |
1330 |
def get_topics(self, topic): |
1331 |
"""Search for topic amongst commands. |
|
1332 |
||
1333 |
:param topic: A topic to search for.
|
|
1334 |
:return: A list which is either empty or contains a single
|
|
1335 |
Command entry.
|
|
1336 |
"""
|
|
2432.1.18
by Robert Collins
Add support for doing bzr help commands/COMMANDNAME. |
1337 |
if topic and topic.startswith(self.prefix): |
1338 |
topic = topic[len(self.prefix):] |
|
2432.1.13
by Robert Collins
HelpCommandContext now implementes get_topics. |
1339 |
try: |
5058.2.1
by Robert Collins
* ``bzr help`` will no longer trigger the get_missing_command hook when |
1340 |
cmd = _get_cmd_object(topic, check_missing=False) |
2432.1.13
by Robert Collins
HelpCommandContext now implementes get_topics. |
1341 |
except KeyError: |
1342 |
return [] |
|
1343 |
else: |
|
1344 |
return [cmd] |
|
1345 |
||
2432.1.2
by Robert Collins
Add a HelpCommandContext class for help from commands. |
1346 |
|
3246.7.1
by Martin Albisetti
Core code for automatic plugin suggestion |
1347 |
class Provider(object): |
5891.1.3
by Andrew Bennetts
Move docstring formatting fixes. |
1348 |
"""Generic class to be overriden by plugins""" |
3246.7.1
by Martin Albisetti
Core code for automatic plugin suggestion |
1349 |
|
1350 |
def plugin_for_command(self, cmd_name): |
|
5891.1.3
by Andrew Bennetts
Move docstring formatting fixes. |
1351 |
"""Takes a command and returns the information for that plugin |
3943.8.1
by Marius Kruger
remove all trailing whitespace from bzr source |
1352 |
|
1353 |
:return: A dictionary with all the available information
|
|
5891.1.3
by Andrew Bennetts
Move docstring formatting fixes. |
1354 |
for the requested plugin
|
1355 |
"""
|
|
3246.7.1
by Martin Albisetti
Core code for automatic plugin suggestion |
1356 |
raise NotImplementedError |
1357 |
||
1358 |
||
1359 |
class ProvidersRegistry(registry.Registry): |
|
5891.1.3
by Andrew Bennetts
Move docstring formatting fixes. |
1360 |
"""This registry exists to allow other providers to exist""" |
3246.7.3
by Martin Albisetti
Code cleanup and documentation |
1361 |
|
3246.7.1
by Martin Albisetti
Core code for automatic plugin suggestion |
1362 |
def __iter__(self): |
6621.2.26
by Martin
Misc set of changes to get started with selftest on Python 3 |
1363 |
for key, provider in self.items(): |
3246.7.1
by Martin Albisetti
Core code for automatic plugin suggestion |
1364 |
yield provider |
1365 |
||
7143.15.2
by Jelmer Vernooij
Run autopep8. |
1366 |
|
3246.7.1
by Martin Albisetti
Core code for automatic plugin suggestion |
1367 |
command_providers_registry = ProvidersRegistry() |