2052.3.2
by John Arbash Meinel
Change Copyright .. by Canonical to Copyright ... Canonical |
1 |
# Copyright (C) 2006 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
|
|
15 |
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
16 |
||
17 |
||
974.1.26
by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472 |
18 |
# TODO: probably should say which arguments are candidates for glob
|
19 |
# expansion on windows and do that at the command level.
|
|
20 |
||
1095
by Martin Pool
todo |
21 |
# TODO: Define arguments by objects, rather than just using names.
|
22 |
# Those objects can specify the expected type of the argument, which
|
|
1610.1.4
by Martin Pool
Doc |
23 |
# would help with validation and shell completion. They could also provide
|
24 |
# help/explanation for that argument in a structured way.
|
|
25 |
||
26 |
# TODO: Specific "examples" property on commands for consistent formatting.
|
|
1095
by Martin Pool
todo |
27 |
|
1393.1.27
by Martin Pool
- clean up profile code and change default sort order |
28 |
# TODO: "--profile=cum", to change sort order. Is there any value in leaving
|
29 |
# the profile output behind so it can be interactively examined?
|
|
30 |
||
1996.3.1
by John Arbash Meinel
Demandloading builtins.py drops our load time from 350ms to 291ms |
31 |
import os |
32 |
import sys |
|
33 |
||
34 |
from bzrlib.lazy_import import lazy_import |
|
35 |
lazy_import(globals(), """ |
|
1857.1.1
by Aaron Bentley
Use optparse for parsing options |
36 |
import codecs
|
37 |
import errno
|
|
1162
by Martin Pool
- change Command infrastructure to use (mostly stateless) objects to |
38 |
from warnings import warn
|
1
by mbp at sourcefrog
import from baz patch-364 |
39 |
|
40 |
import bzrlib
|
|
1996.3.1
by John Arbash Meinel
Demandloading builtins.py drops our load time from 350ms to 291ms |
41 |
from bzrlib import (
|
2095.5.2
by Martin Pool
save commit message if commit fails (#32054) |
42 |
debug,
|
1996.3.1
by John Arbash Meinel
Demandloading builtins.py drops our load time from 350ms to 291ms |
43 |
errors,
|
44 |
option,
|
|
45 |
osutils,
|
|
46 |
trace,
|
|
2568.2.2
by Robert Collins
* New method ``_glob_expand_file_list_if_needed`` on the ``Command`` class |
47 |
win32utils,
|
1996.3.1
by John Arbash Meinel
Demandloading builtins.py drops our load time from 350ms to 291ms |
48 |
)
|
49 |
""") |
|
50 |
||
1996.3.5
by John Arbash Meinel
Cleanup, deprecated, and get the tests passing again. |
51 |
from bzrlib.symbol_versioning import ( |
52 |
deprecated_function, |
|
53 |
deprecated_method, |
|
54 |
zero_eight, |
|
55 |
zero_eleven, |
|
56 |
)
|
|
1996.3.1
by John Arbash Meinel
Demandloading builtins.py drops our load time from 350ms to 291ms |
57 |
# Compatibility
|
1581.1.1
by Robert Collins
Bugfix aliases to be backwards compatible with plugins providing command.run_argv. |
58 |
from bzrlib.option import Option |
1996.3.1
by John Arbash Meinel
Demandloading builtins.py drops our load time from 350ms to 291ms |
59 |
|
1
by mbp at sourcefrog
import from baz patch-364 |
60 |
|
731
by Martin Pool
- merge plugin patch from john |
61 |
plugin_cmds = {} |
62 |
||
63 |
||
1492
by Robert Collins
Support decoration of commands. |
64 |
def register_command(cmd, decorate=False): |
1616.1.6
by Martin Pool
doc |
65 |
"""Utility function to help register a command
|
66 |
||
67 |
:param cmd: Command subclass to register
|
|
68 |
:param decorate: If true, allow overriding an existing command
|
|
69 |
of the same name; the old command is returned by this function.
|
|
70 |
Otherwise it is an error to try to override an existing command.
|
|
71 |
"""
|
|
731
by Martin Pool
- merge plugin patch from john |
72 |
global plugin_cmds |
73 |
k = cmd.__name__ |
|
74 |
if k.startswith("cmd_"): |
|
75 |
k_unsquished = _unsquish_command_name(k) |
|
76 |
else: |
|
77 |
k_unsquished = k |
|
1963.2.1
by Robey Pointer
remove usage of has_key() |
78 |
if k_unsquished not in plugin_cmds: |
731
by Martin Pool
- merge plugin patch from john |
79 |
plugin_cmds[k_unsquished] = cmd |
2127.5.1
by mbp at sourcefrog
record command-line arguments in .bzr.log, drop some mutter statements |
80 |
## trace.mutter('registered plugin command %s', k_unsquished)
|
1492
by Robert Collins
Support decoration of commands. |
81 |
if decorate and k_unsquished in builtin_command_names(): |
82 |
return _builtin_commands()[k_unsquished] |
|
83 |
elif decorate: |
|
84 |
result = plugin_cmds[k_unsquished] |
|
85 |
plugin_cmds[k_unsquished] = cmd |
|
86 |
return result |
|
731
by Martin Pool
- merge plugin patch from john |
87 |
else: |
1996.3.1
by John Arbash Meinel
Demandloading builtins.py drops our load time from 350ms to 291ms |
88 |
trace.log_error('Two plugins defined the same command: %r' % k) |
89 |
trace.log_error('Not loading the one in %r' % sys.modules[cmd.__module__]) |
|
731
by Martin Pool
- merge plugin patch from john |
90 |
|
91 |
||
350
by Martin Pool
- refactor command aliases into command classes |
92 |
def _squish_command_name(cmd): |
93 |
return 'cmd_' + cmd.replace('-', '_') |
|
94 |
||
95 |
||
96 |
def _unsquish_command_name(cmd): |
|
97 |
assert cmd.startswith("cmd_") |
|
98 |
return cmd[4:].replace('_','-') |
|
99 |
||
914
by Martin Pool
- fix up breakage of 'bzr log -v' by root_id patch |
100 |
|
1162
by Martin Pool
- change Command infrastructure to use (mostly stateless) objects to |
101 |
def _builtin_commands(): |
1147
by Martin Pool
- split builtin commands into separate module bzrlib.builtins; |
102 |
import bzrlib.builtins |
1162
by Martin Pool
- change Command infrastructure to use (mostly stateless) objects to |
103 |
r = {} |
1147
by Martin Pool
- split builtin commands into separate module bzrlib.builtins; |
104 |
builtins = bzrlib.builtins.__dict__ |
105 |
for name in builtins: |
|
106 |
if name.startswith("cmd_"): |
|
1616.1.6
by Martin Pool
doc |
107 |
real_name = _unsquish_command_name(name) |
1162
by Martin Pool
- change Command infrastructure to use (mostly stateless) objects to |
108 |
r[real_name] = builtins[name] |
109 |
return r |
|
2172.1.1
by Aaron Bentley
Merge shell-like quote handling for aliases |
110 |
|
1162
by Martin Pool
- change Command infrastructure to use (mostly stateless) objects to |
111 |
|
112 |
def builtin_command_names(): |
|
113 |
"""Return list of builtin command names."""
|
|
114 |
return _builtin_commands().keys() |
|
2172.1.1
by Aaron Bentley
Merge shell-like quote handling for aliases |
115 |
|
1162
by Martin Pool
- change Command infrastructure to use (mostly stateless) objects to |
116 |
|
117 |
def plugin_command_names(): |
|
118 |
return plugin_cmds.keys() |
|
119 |
||
120 |
||
121 |
def _get_cmd_dict(plugins_override=True): |
|
122 |
"""Return name->class mapping for all commands."""
|
|
123 |
d = _builtin_commands() |
|
731
by Martin Pool
- merge plugin patch from john |
124 |
if plugins_override: |
125 |
d.update(plugin_cmds) |
|
641
by Martin Pool
- improved external-command patch from john |
126 |
return d |
731
by Martin Pool
- merge plugin patch from john |
127 |
|
2172.1.1
by Aaron Bentley
Merge shell-like quote handling for aliases |
128 |
|
731
by Martin Pool
- merge plugin patch from john |
129 |
def get_all_cmds(plugins_override=True): |
641
by Martin Pool
- improved external-command patch from john |
130 |
"""Return canonical name and class for all registered commands."""
|
731
by Martin Pool
- merge plugin patch from john |
131 |
for k, v in _get_cmd_dict(plugins_override=plugins_override).iteritems(): |
641
by Martin Pool
- improved external-command patch from john |
132 |
yield k,v |
133 |
||
134 |
||
1162
by Martin Pool
- change Command infrastructure to use (mostly stateless) objects to |
135 |
def get_cmd_object(cmd_name, plugins_override=True): |
350
by Martin Pool
- refactor command aliases into command classes |
136 |
"""Return the canonical name and command class for a command.
|
1162
by Martin Pool
- change Command infrastructure to use (mostly stateless) objects to |
137 |
|
138 |
plugins_override
|
|
139 |
If true, plugin commands can override builtins.
|
|
350
by Martin Pool
- refactor command aliases into command classes |
140 |
"""
|
2432.1.13
by Robert Collins
HelpCommandContext now implementes get_topics. |
141 |
try: |
142 |
return _get_cmd_object(cmd_name, plugins_override) |
|
143 |
except KeyError: |
|
144 |
raise errors.BzrCommandError('unknown command "%s"' % cmd_name) |
|
145 |
||
146 |
||
147 |
def _get_cmd_object(cmd_name, plugins_override=True): |
|
148 |
"""Worker for get_cmd_object which raises KeyError rather than BzrCommandError."""
|
|
1163
by Martin Pool
- split ExternalCommand class into its own file |
149 |
from bzrlib.externalcommand import ExternalCommand |
150 |
||
1948.1.10
by John Arbash Meinel
Simplify changes to command.py |
151 |
# We want only 'ascii' command names, but the user may have typed
|
152 |
# in a Unicode name. In that case, they should just get a
|
|
153 |
# 'command not found' error later.
|
|
154 |
# In the future, we may actually support Unicode command names.
|
|
350
by Martin Pool
- refactor command aliases into command classes |
155 |
|
156 |
# first look up this command under the specified name
|
|
731
by Martin Pool
- merge plugin patch from john |
157 |
cmds = _get_cmd_dict(plugins_override=plugins_override) |
272
by Martin Pool
- Add command aliases |
158 |
try: |
1162
by Martin Pool
- change Command infrastructure to use (mostly stateless) objects to |
159 |
return cmds[cmd_name]() |
272
by Martin Pool
- Add command aliases |
160 |
except KeyError: |
350
by Martin Pool
- refactor command aliases into command classes |
161 |
pass
|
162 |
||
163 |
# look for any command which claims this as an alias
|
|
1162
by Martin Pool
- change Command infrastructure to use (mostly stateless) objects to |
164 |
for real_cmd_name, cmd_class in cmds.iteritems(): |
165 |
if cmd_name in cmd_class.aliases: |
|
166 |
return cmd_class() |
|
167 |
||
168 |
cmd_obj = ExternalCommand.find_command(cmd_name) |
|
169 |
if cmd_obj: |
|
170 |
return cmd_obj |
|
2432.1.13
by Robert Collins
HelpCommandContext now implementes get_topics. |
171 |
raise KeyError |
272
by Martin Pool
- Add command aliases |
172 |
|
329
by Martin Pool
- refactor command functions into command classes |
173 |
|
558
by Martin Pool
- All top-level classes inherit from object |
174 |
class Command(object): |
329
by Martin Pool
- refactor command functions into command classes |
175 |
"""Base class for commands.
|
176 |
||
1162
by Martin Pool
- change Command infrastructure to use (mostly stateless) objects to |
177 |
Commands are the heart of the command-line bzr interface.
|
178 |
||
179 |
The command object mostly handles the mapping of command-line
|
|
180 |
parameters into one or more bzrlib operations, and of the results
|
|
181 |
into textual output.
|
|
182 |
||
183 |
Commands normally don't have any state. All their arguments are
|
|
184 |
passed in to the run method. (Subclasses may take a different
|
|
185 |
policy if the behaviour of the instance needs to depend on e.g. a
|
|
186 |
shell plugin and not just its Python class.)
|
|
187 |
||
329
by Martin Pool
- refactor command functions into command classes |
188 |
The docstring for an actual command should give a single-line
|
189 |
summary, then a complete description of the command. A grammar
|
|
190 |
description will be inserted.
|
|
191 |
||
1162
by Martin Pool
- change Command infrastructure to use (mostly stateless) objects to |
192 |
aliases
|
193 |
Other accepted names for this command.
|
|
194 |
||
329
by Martin Pool
- refactor command functions into command classes |
195 |
takes_args
|
196 |
List of argument forms, marked with whether they are optional,
|
|
197 |
repeated, etc.
|
|
198 |
||
1534.4.25
by Robert Collins
Add a --transport parameter to the test suite to set the default transport to be used in the test suite. |
199 |
Examples:
|
200 |
||
201 |
['to_location', 'from_branch?', 'file*']
|
|
202 |
||
203 |
'to_location' is required
|
|
204 |
'from_branch' is optional
|
|
205 |
'file' can be specified 0 or more times
|
|
1185.37.4
by Jamie Wilkinson
add some examples to the documentation for Command.takes_args |
206 |
|
329
by Martin Pool
- refactor command functions into command classes |
207 |
takes_options
|
1185.16.43
by Martin Pool
- clean up handling of option objects |
208 |
List of options that may be given for this command. These can
|
209 |
be either strings, referring to globally-defined options,
|
|
210 |
or option objects. Retrieve through options().
|
|
329
by Martin Pool
- refactor command functions into command classes |
211 |
|
212 |
hidden
|
|
1162
by Martin Pool
- change Command infrastructure to use (mostly stateless) objects to |
213 |
If true, this command isn't advertised. This is typically
|
214 |
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() |
215 |
|
216 |
encoding_type
|
|
217 |
Command objects will get a 'outf' attribute, which has been
|
|
218 |
setup to properly handle encoding of unicode strings.
|
|
219 |
encoding_type determines what will happen when characters cannot
|
|
220 |
be encoded
|
|
221 |
strict - abort if we cannot decode
|
|
222 |
replace - put in a bogus character (typically '?')
|
|
223 |
exact - do not encode sys.stdout
|
|
224 |
||
2178.4.5
by Alexander Belchenko
Spell-checking (thanks to Aaron) |
225 |
NOTE: by default on Windows, sys.stdout is opened as a text
|
226 |
stream, therefore LF line-endings are converted to CRLF.
|
|
227 |
When a command uses encoding_type = 'exact', then
|
|
228 |
sys.stdout is forced to be a binary stream, and line-endings
|
|
2178.4.4
by Alexander Belchenko
encoding_type = 'exact' force sys.stdout to be binary stream on win32 |
229 |
will not mangled.
|
2178.4.5
by Alexander Belchenko
Spell-checking (thanks to Aaron) |
230 |
|
329
by Martin Pool
- refactor command functions into command classes |
231 |
"""
|
232 |
aliases = [] |
|
233 |
takes_args = [] |
|
234 |
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() |
235 |
encoding_type = 'strict' |
329
by Martin Pool
- refactor command functions into command classes |
236 |
|
237 |
hidden = False |
|
2172.1.1
by Aaron Bentley
Merge shell-like quote handling for aliases |
238 |
|
1162
by Martin Pool
- change Command infrastructure to use (mostly stateless) objects to |
239 |
def __init__(self): |
240 |
"""Construct an instance of this command."""
|
|
973
by Martin Pool
- various refactorings of command interpreter |
241 |
if self.__doc__ == Command.__doc__: |
242 |
warn("No help message set for %r" % self) |
|
329
by Martin Pool
- refactor command functions into command classes |
243 |
|
2568.2.6
by Robert Collins
Review feedback. |
244 |
def _maybe_expand_globs(self, file_list): |
2568.2.2
by Robert Collins
* New method ``_glob_expand_file_list_if_needed`` on the ``Command`` class |
245 |
"""Glob expand file_list if the platform does not do that itself.
|
246 |
|
|
247 |
:return: A possibly empty list of unicode paths.
|
|
248 |
||
249 |
Introduced in bzrlib 0.18.
|
|
250 |
"""
|
|
251 |
if not file_list: |
|
252 |
file_list = [] |
|
253 |
if sys.platform == 'win32': |
|
254 |
file_list = win32utils.glob_expand(file_list) |
|
255 |
return list(file_list) |
|
256 |
||
2432.1.12
by Robert Collins
Relocate command help onto Command. |
257 |
def _usage(self): |
258 |
"""Return single-line grammar for this command.
|
|
259 |
||
260 |
Only describes arguments, not options.
|
|
261 |
"""
|
|
262 |
s = 'bzr ' + self.name() + ' ' |
|
263 |
for aname in self.takes_args: |
|
264 |
aname = aname.upper() |
|
265 |
if aname[-1] in ['$', '+']: |
|
266 |
aname = aname[:-1] + '...' |
|
267 |
elif aname[-1] == '?': |
|
268 |
aname = '[' + aname[:-1] + ']' |
|
269 |
elif aname[-1] == '*': |
|
270 |
aname = '[' + aname[:-1] + '...]' |
|
271 |
s += aname + ' ' |
|
272 |
||
273 |
assert s[-1] == ' ' |
|
274 |
s = s[:-1] |
|
275 |
return s |
|
276 |
||
2432.1.21
by Robert Collins
Teach Command.get_help_text to show additional help cross references when supplied. |
277 |
def get_help_text(self, additional_see_also=None): |
278 |
"""Return a text string with help for this command.
|
|
279 |
|
|
280 |
:param additional_see_also: Additional help topics to be
|
|
281 |
cross-referenced.
|
|
282 |
"""
|
|
2432.1.12
by Robert Collins
Relocate command help onto Command. |
283 |
doc = self.help() |
284 |
if doc is None: |
|
285 |
raise NotImplementedError("sorry, no detailed help yet for %r" % self.name()) |
|
286 |
||
287 |
result = "" |
|
2432.1.31
by Robert Collins
Review feedback and put help.command_usage back in as a deprecated function. |
288 |
result += 'usage: %s\n' % self._usage() |
2432.1.12
by Robert Collins
Relocate command help onto Command. |
289 |
|
290 |
if self.aliases: |
|
2472.1.1
by John Arbash Meinel
(John Arbash Meinel) Change aliases: help text to be on one line. |
291 |
result += 'aliases: ' |
2432.1.12
by Robert Collins
Relocate command help onto Command. |
292 |
result += ', '.join(self.aliases) + '\n' |
293 |
||
294 |
result += '\n' |
|
295 |
||
296 |
plugin_name = self.plugin_name() |
|
297 |
if plugin_name is not None: |
|
298 |
result += '(From plugin "%s")' % plugin_name |
|
299 |
result += '\n\n' |
|
300 |
||
301 |
result += doc |
|
302 |
if result[-1] != '\n': |
|
303 |
result += '\n' |
|
304 |
result += '\n' |
|
305 |
result += option.get_optparser(self.options()).format_option_help() |
|
2432.1.21
by Robert Collins
Teach Command.get_help_text to show additional help cross references when supplied. |
306 |
see_also = self.get_see_also(additional_see_also) |
2432.1.12
by Robert Collins
Relocate command help onto Command. |
307 |
if see_also: |
308 |
result += '\nSee also: ' |
|
309 |
result += ', '.join(see_also) |
|
310 |
result += '\n' |
|
311 |
return result |
|
312 |
||
2432.1.28
by Robert Collins
Add a get_help_topic method to commands.Command. |
313 |
def get_help_topic(self): |
314 |
"""Return the commands help topic - its name."""
|
|
315 |
return self.name() |
|
316 |
||
2432.1.21
by Robert Collins
Teach Command.get_help_text to show additional help cross references when supplied. |
317 |
def get_see_also(self, additional_terms=None): |
2425.2.1
by Robert Collins
Command objects can now declare related help topics by having _see_also |
318 |
"""Return a list of help topics that are related to this ommand.
|
319 |
|
|
320 |
The list is derived from the content of the _see_also attribute. Any
|
|
321 |
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. |
322 |
: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 |
323 |
:return: A list of help topics.
|
324 |
"""
|
|
2432.1.21
by Robert Collins
Teach Command.get_help_text to show additional help cross references when supplied. |
325 |
see_also = set(getattr(self, '_see_also', [])) |
326 |
if additional_terms: |
|
327 |
see_also.update(additional_terms) |
|
328 |
return sorted(see_also) |
|
2425.2.1
by Robert Collins
Command objects can now declare related help topics by having _see_also |
329 |
|
1185.16.43
by Martin Pool
- clean up handling of option objects |
330 |
def options(self): |
331 |
"""Return dict of valid options for this command.
|
|
332 |
||
333 |
Maps from long option name to option object."""
|
|
334 |
r = dict() |
|
1996.3.1
by John Arbash Meinel
Demandloading builtins.py drops our load time from 350ms to 291ms |
335 |
r['help'] = option.Option.OPTIONS['help'] |
1185.16.43
by Martin Pool
- clean up handling of option objects |
336 |
for o in self.takes_options: |
1857.1.8
by Aaron Bentley
Group enum options and add enum options to init and init-repo |
337 |
if isinstance(o, basestring): |
1996.3.1
by John Arbash Meinel
Demandloading builtins.py drops our load time from 350ms to 291ms |
338 |
o = option.Option.OPTIONS[o] |
1185.16.43
by Martin Pool
- clean up handling of option objects |
339 |
r[o.name] = o |
340 |
return r |
|
1165
by Martin Pool
- move parsing of argv into arguments and options into Command.run_argv |
341 |
|
1685.1.80
by Wouter van Heyst
more code cleanup |
342 |
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() |
343 |
"""Return a file linked to stdout, which has proper encoding."""
|
344 |
assert self.encoding_type in ['strict', 'exact', 'replace'] |
|
345 |
||
346 |
# Originally I was using self.stdout, but that looks
|
|
347 |
# *way* too much like sys.stdout
|
|
348 |
if self.encoding_type == 'exact': |
|
2178.4.4
by Alexander Belchenko
encoding_type = 'exact' force sys.stdout to be binary stream on win32 |
349 |
# force sys.stdout to be binary stream on win32
|
350 |
if sys.platform == 'win32': |
|
351 |
fileno = getattr(sys.stdout, 'fileno', None) |
|
352 |
if fileno: |
|
353 |
import msvcrt |
|
354 |
msvcrt.setmode(fileno(), os.O_BINARY) |
|
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() |
355 |
self.outf = sys.stdout |
356 |
return
|
|
357 |
||
1996.3.1
by John Arbash Meinel
Demandloading builtins.py drops our load time from 350ms to 291ms |
358 |
output_encoding = osutils.get_terminal_encoding() |
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() |
359 |
|
360 |
# use 'replace' so that we don't abort if trying to write out
|
|
361 |
# in e.g. the default C locale.
|
|
362 |
self.outf = codecs.getwriter(output_encoding)(sys.stdout, errors=self.encoding_type) |
|
1711.2.40
by John Arbash Meinel
codecs.getwriter() doesn't set '.encoding' properly, so do the work for it. |
363 |
# For whatever reason codecs.getwriter() does not advertise its encoding
|
364 |
# it just returns the encoding of the wrapped file, which is completely
|
|
365 |
# bogus. So set the attribute, so we can find the correct encoding later.
|
|
366 |
self.outf.encoding = output_encoding |
|
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() |
367 |
|
1581.1.1
by Robert Collins
Bugfix aliases to be backwards compatible with plugins providing command.run_argv. |
368 |
def run_argv_aliases(self, argv, alias_argv=None): |
369 |
"""Parse the command line and run with extra aliases in alias_argv."""
|
|
1857.1.21
by Aaron Bentley
Fix bug from cmd_shelf passing Non to run_argv_aliases |
370 |
if argv is None: |
2155.2.1
by Marius Kruger
* Get command aliases to respect quoted arguments. |
371 |
warn("Passing None for [] is deprecated from bzrlib 0.10", |
1857.1.21
by Aaron Bentley
Fix bug from cmd_shelf passing Non to run_argv_aliases |
372 |
DeprecationWarning, stacklevel=2) |
373 |
argv = [] |
|
1553.6.8
by Erik Bågfors
support for overrides |
374 |
args, opts = parse_args(self, argv, alias_argv) |
1165
by Martin Pool
- move parsing of argv into arguments and options into Command.run_argv |
375 |
if 'help' in opts: # e.g. bzr add --help |
2432.1.12
by Robert Collins
Relocate command help onto Command. |
376 |
sys.stdout.write(self.get_help_text()) |
1165
by Martin Pool
- move parsing of argv into arguments and options into Command.run_argv |
377 |
return 0 |
378 |
# mix arguments and options into one dictionary
|
|
379 |
cmdargs = _match_argform(self.name(), self.takes_args, args) |
|
380 |
cmdopts = {} |
|
381 |
for k, v in opts.items(): |
|
382 |
cmdopts[k.replace('-', '_')] = v |
|
383 |
||
384 |
all_cmd_args = cmdargs.copy() |
|
385 |
all_cmd_args.update(cmdopts) |
|
386 |
||
1685.1.80
by Wouter van Heyst
more code cleanup |
387 |
self._setup_outf() |
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() |
388 |
|
1165
by Martin Pool
- move parsing of argv into arguments and options into Command.run_argv |
389 |
return self.run(**all_cmd_args) |
2172.1.1
by Aaron Bentley
Merge shell-like quote handling for aliases |
390 |
|
1162
by Martin Pool
- change Command infrastructure to use (mostly stateless) objects to |
391 |
def run(self): |
392 |
"""Actually run the command.
|
|
329
by Martin Pool
- refactor command functions into command classes |
393 |
|
394 |
This is invoked with the options and arguments bound to
|
|
395 |
keyword parameters.
|
|
396 |
||
1162
by Martin Pool
- change Command infrastructure to use (mostly stateless) objects to |
397 |
Return 0 or None if the command was successful, or a non-zero
|
398 |
shell error code if not. It's OK for this method to allow
|
|
399 |
an exception to raise up.
|
|
329
by Martin Pool
- refactor command functions into command classes |
400 |
"""
|
2155.2.1
by Marius Kruger
* Get command aliases to respect quoted arguments. |
401 |
raise NotImplementedError('no implementation of command %r' |
1610.1.3
by Martin Pool
Better error message for Command.run() not implemented |
402 |
% self.name()) |
329
by Martin Pool
- refactor command functions into command classes |
403 |
|
1162
by Martin Pool
- change Command infrastructure to use (mostly stateless) objects to |
404 |
def help(self): |
405 |
"""Return help message for this class."""
|
|
1610.1.2
by Martin Pool
Move rarely-used import into Command.help() |
406 |
from inspect import getdoc |
1162
by Martin Pool
- change Command infrastructure to use (mostly stateless) objects to |
407 |
if self.__doc__ is Command.__doc__: |
408 |
return None |
|
409 |
return getdoc(self) |
|
410 |
||
411 |
def name(self): |
|
412 |
return _unsquish_command_name(self.__class__.__name__) |
|
413 |
||
1733.2.5
by Michael Ellerman
Show which plugin (if any) provides a command. |
414 |
def plugin_name(self): |
415 |
"""Get the name of the plugin that provides this command.
|
|
416 |
||
417 |
:return: The name of the plugin or None if the command is builtin.
|
|
418 |
"""
|
|
419 |
mod_parts = self.__module__.split('.') |
|
420 |
if len(mod_parts) >= 3 and mod_parts[1] == 'plugins': |
|
421 |
return mod_parts[2] |
|
422 |
else: |
|
423 |
return None |
|
424 |
||
1162
by Martin Pool
- change Command infrastructure to use (mostly stateless) objects to |
425 |
|
1996.3.5
by John Arbash Meinel
Cleanup, deprecated, and get the tests passing again. |
426 |
# Technically, this function hasn't been use in a *really* long time
|
427 |
# but we are only deprecating it now.
|
|
428 |
@deprecated_function(zero_eleven) |
|
493
by Martin Pool
- Merge aaron's merge command |
429 |
def parse_spec(spec): |
622
by Martin Pool
Updated merge patch from Aaron |
430 |
"""
|
431 |
>>> parse_spec(None)
|
|
432 |
[None, None]
|
|
433 |
>>> parse_spec("./")
|
|
434 |
['./', None]
|
|
435 |
>>> parse_spec("../@")
|
|
436 |
['..', -1]
|
|
437 |
>>> parse_spec("../f/@35")
|
|
438 |
['../f', 35]
|
|
897
by Martin Pool
- merge john's revision-naming code |
439 |
>>> parse_spec('./@revid:john@arbash-meinel.com-20050711044610-3ca0327c6a222f67')
|
440 |
['.', 'revid:john@arbash-meinel.com-20050711044610-3ca0327c6a222f67']
|
|
622
by Martin Pool
Updated merge patch from Aaron |
441 |
"""
|
442 |
if spec is None: |
|
443 |
return [None, None] |
|
493
by Martin Pool
- Merge aaron's merge command |
444 |
if '/@' in spec: |
445 |
parsed = spec.split('/@') |
|
446 |
assert len(parsed) == 2 |
|
447 |
if parsed[1] == "": |
|
448 |
parsed[1] = -1 |
|
449 |
else: |
|
897
by Martin Pool
- merge john's revision-naming code |
450 |
try: |
451 |
parsed[1] = int(parsed[1]) |
|
452 |
except ValueError: |
|
453 |
pass # We can allow stuff like ./@revid:blahblahblah |
|
454 |
else: |
|
455 |
assert parsed[1] >=0 |
|
493
by Martin Pool
- Merge aaron's merge command |
456 |
else: |
457 |
parsed = [spec, None] |
|
458 |
return parsed |
|
459 |
||
1553.6.11
by Erik Bågfors
small bugfixes, all tests pass now |
460 |
def parse_args(command, argv, alias_argv=None): |
1
by mbp at sourcefrog
import from baz patch-364 |
461 |
"""Parse command line.
|
2172.1.1
by Aaron Bentley
Merge shell-like quote handling for aliases |
462 |
|
1
by mbp at sourcefrog
import from baz patch-364 |
463 |
Arguments and options are parsed at this level before being passed
|
464 |
down to specific command handlers. This routine knows, from a
|
|
465 |
lookup table, something about the available options, what optargs
|
|
466 |
they take, and which commands will accept them.
|
|
467 |
"""
|
|
1857.1.1
by Aaron Bentley
Use optparse for parsing options |
468 |
# TODO: make it a method of the Command?
|
1857.1.3
by Aaron Bentley
Make option adding depend on Option type |
469 |
parser = option.get_optparser(command.options()) |
1857.1.1
by Aaron Bentley
Use optparse for parsing options |
470 |
if alias_argv is not None: |
471 |
args = alias_argv + argv |
|
472 |
else: |
|
473 |
args = argv |
|
683
by Martin Pool
- short option stacking patch from John A Meinel |
474 |
|
1857.1.1
by Aaron Bentley
Use optparse for parsing options |
475 |
options, args = parser.parse_args(args) |
2155.2.1
by Marius Kruger
* Get command aliases to respect quoted arguments. |
476 |
opts = dict([(k, v) for k, v in options.__dict__.iteritems() if |
1857.1.3
by Aaron Bentley
Make option adding depend on Option type |
477 |
v is not option.OptionParser.DEFAULT_VALUE]) |
1
by mbp at sourcefrog
import from baz patch-364 |
478 |
return args, opts |
479 |
||
480 |
||
329
by Martin Pool
- refactor command functions into command classes |
481 |
def _match_argform(cmd, takes_args, args): |
1
by mbp at sourcefrog
import from baz patch-364 |
482 |
argdict = {} |
26
by mbp at sourcefrog
fix StopIteration error on python2.3(?) |
483 |
|
329
by Martin Pool
- refactor command functions into command classes |
484 |
# step through args and takes_args, allowing appropriate 0-many matches
|
485 |
for ap in takes_args: |
|
1
by mbp at sourcefrog
import from baz patch-364 |
486 |
argname = ap[:-1] |
487 |
if ap[-1] == '?': |
|
62
by mbp at sourcefrog
- new find_branch_root function; based on suggestion from aaron |
488 |
if args: |
489 |
argdict[argname] = args.pop(0) |
|
196
by mbp at sourcefrog
selected-file diff |
490 |
elif ap[-1] == '*': # all remaining arguments |
491 |
if args: |
|
492 |
argdict[argname + '_list'] = args[:] |
|
493 |
args = [] |
|
494 |
else: |
|
495 |
argdict[argname + '_list'] = None |
|
1
by mbp at sourcefrog
import from baz patch-364 |
496 |
elif ap[-1] == '+': |
497 |
if not args: |
|
1996.3.1
by John Arbash Meinel
Demandloading builtins.py drops our load time from 350ms to 291ms |
498 |
raise errors.BzrCommandError("command %r needs one or more %s" |
499 |
% (cmd, argname.upper())) |
|
1
by mbp at sourcefrog
import from baz patch-364 |
500 |
else: |
501 |
argdict[argname + '_list'] = args[:] |
|
502 |
args = [] |
|
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 |
503 |
elif ap[-1] == '$': # all but one |
504 |
if len(args) < 2: |
|
1996.3.1
by John Arbash Meinel
Demandloading builtins.py drops our load time from 350ms to 291ms |
505 |
raise errors.BzrCommandError("command %r needs one or more %s" |
506 |
% (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 |
507 |
argdict[argname + '_list'] = args[:-1] |
1740.5.6
by Martin Pool
Clean up many exception classes. |
508 |
args[:-1] = [] |
1
by mbp at sourcefrog
import from baz patch-364 |
509 |
else: |
510 |
# just a plain arg
|
|
511 |
argname = ap |
|
512 |
if not args: |
|
1996.3.1
by John Arbash Meinel
Demandloading builtins.py drops our load time from 350ms to 291ms |
513 |
raise errors.BzrCommandError("command %r requires argument %s" |
514 |
% (cmd, argname.upper())) |
|
1
by mbp at sourcefrog
import from baz patch-364 |
515 |
else: |
516 |
argdict[argname] = args.pop(0) |
|
2172.1.1
by Aaron Bentley
Merge shell-like quote handling for aliases |
517 |
|
1
by mbp at sourcefrog
import from baz patch-364 |
518 |
if args: |
1996.3.1
by John Arbash Meinel
Demandloading builtins.py drops our load time from 350ms to 291ms |
519 |
raise errors.BzrCommandError("extra argument to command %s: %s" |
520 |
% (cmd, args[0])) |
|
1
by mbp at sourcefrog
import from baz patch-364 |
521 |
|
522 |
return argdict |
|
523 |
||
524 |
||
525 |
||
1162
by Martin Pool
- change Command infrastructure to use (mostly stateless) objects to |
526 |
def apply_profiled(the_callable, *args, **kwargs): |
527 |
import hotshot |
|
528 |
import tempfile |
|
1393.1.27
by Martin Pool
- clean up profile code and change default sort order |
529 |
import hotshot.stats |
1162
by Martin Pool
- change Command infrastructure to use (mostly stateless) objects to |
530 |
pffileno, pfname = tempfile.mkstemp() |
531 |
try: |
|
532 |
prof = hotshot.Profile(pfname) |
|
533 |
try: |
|
534 |
ret = prof.runcall(the_callable, *args, **kwargs) or 0 |
|
535 |
finally: |
|
536 |
prof.close() |
|
537 |
stats = hotshot.stats.load(pfname) |
|
1393.1.27
by Martin Pool
- clean up profile code and change default sort order |
538 |
stats.strip_dirs() |
539 |
stats.sort_stats('cum') # 'time' |
|
1162
by Martin Pool
- change Command infrastructure to use (mostly stateless) objects to |
540 |
## XXX: Might like to write to stderr or the trace file instead but
|
541 |
## print_stats seems hardcoded to stdout
|
|
542 |
stats.print_stats(20) |
|
543 |
return ret |
|
544 |
finally: |
|
545 |
os.close(pffileno) |
|
546 |
os.remove(pfname) |
|
547 |
||
548 |
||
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) |
549 |
def apply_lsprofiled(filename, the_callable, *args, **kwargs): |
1185.33.85
by Martin Pool
New --lsprof option from Denys Duchier |
550 |
from bzrlib.lsprof import profile |
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) |
551 |
ret, stats = profile(the_callable, *args, **kwargs) |
1185.33.85
by Martin Pool
New --lsprof option from Denys Duchier |
552 |
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) |
553 |
if filename is None: |
554 |
stats.pprint() |
|
555 |
else: |
|
2493.2.3
by Ian Clatworthy
changes requested in jameinel's review incorporated |
556 |
stats.save(filename) |
1551.15.30
by Aaron Bentley
Write lsprof file name to stderr, not stdout |
557 |
trace.note('Profile data written to "%s".', filename) |
1185.33.85
by Martin Pool
New --lsprof option from Denys Duchier |
558 |
return ret |
559 |
||
1553.6.9
by Erik Bågfors
PEP8-ify |
560 |
|
2155.2.1
by Marius Kruger
* Get command aliases to respect quoted arguments. |
561 |
def get_alias(cmd, config=None): |
562 |
"""Return an expanded alias, or None if no alias exists.
|
|
563 |
||
564 |
cmd
|
|
565 |
Command to be checked for an alias.
|
|
566 |
config
|
|
567 |
Used to specify an alternative config to use,
|
|
2155.2.3
by Marius Kruger
* commands.py |
568 |
which is especially useful for testing.
|
2155.2.1
by Marius Kruger
* Get command aliases to respect quoted arguments. |
569 |
If it is unspecified, the global config will be used.
|
570 |
"""
|
|
571 |
if config is None: |
|
572 |
import bzrlib.config |
|
573 |
config = bzrlib.config.GlobalConfig() |
|
574 |
alias = config.get_alias(cmd) |
|
1553.6.1
by Erik Bågfors
support for aliases in bazaar.conf |
575 |
if (alias): |
2155.2.1
by Marius Kruger
* Get command aliases to respect quoted arguments. |
576 |
import shlex |
577 |
return [a.decode('utf-8') for a in shlex.split(alias.encode('utf-8'))] |
|
1553.6.8
by Erik Bågfors
support for overrides |
578 |
return None |
1553.6.1
by Erik Bågfors
support for aliases in bazaar.conf |
579 |
|
1553.6.9
by Erik Bågfors
PEP8-ify |
580 |
|
1
by mbp at sourcefrog
import from baz patch-364 |
581 |
def run_bzr(argv): |
582 |
"""Execute a command.
|
|
583 |
||
584 |
This is similar to main(), but without all the trappings for
|
|
2172.1.1
by Aaron Bentley
Merge shell-like quote handling for aliases |
585 |
logging and error handling.
|
586 |
|
|
973
by Martin Pool
- various refactorings of command interpreter |
587 |
argv
|
974.1.26
by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472 |
588 |
The command-line arguments, without the program name from argv[0]
|
1185.85.4
by John Arbash Meinel
currently broken, trying to fix things up. |
589 |
These should already be decoded. All library/test code calling
|
590 |
run_bzr should be passing valid strings (don't need decoding).
|
|
2172.1.1
by Aaron Bentley
Merge shell-like quote handling for aliases |
591 |
|
973
by Martin Pool
- various refactorings of command interpreter |
592 |
Returns a command status or raises an exception.
|
974.1.26
by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472 |
593 |
|
594 |
Special master options: these must come before the command because
|
|
595 |
they control how the command is interpreted.
|
|
596 |
||
597 |
--no-plugins
|
|
598 |
Do not load plugin modules at all
|
|
599 |
||
1553.6.1
by Erik Bågfors
support for aliases in bazaar.conf |
600 |
--no-aliases
|
601 |
Do not allow aliases
|
|
602 |
||
974.1.26
by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472 |
603 |
--builtin
|
604 |
Only use builtin commands. (Plugins are still allowed to change
|
|
605 |
other behaviour.)
|
|
606 |
||
607 |
--profile
|
|
1185.33.85
by Martin Pool
New --lsprof option from Denys Duchier |
608 |
Run under the Python hotshot profiler.
|
609 |
||
610 |
--lsprof
|
|
611 |
Run under the Python lsprof profiler.
|
|
1
by mbp at sourcefrog
import from baz patch-364 |
612 |
"""
|
1185.85.4
by John Arbash Meinel
currently broken, trying to fix things up. |
613 |
argv = list(argv) |
2127.5.1
by mbp at sourcefrog
record command-line arguments in .bzr.log, drop some mutter statements |
614 |
trace.mutter("bzr arguments: %r", argv) |
907.1.21
by John Arbash Meinel
Adding http transport as a valid transport protocol. |
615 |
|
1553.6.1
by Erik Bågfors
support for aliases in bazaar.conf |
616 |
opt_lsprof = opt_profile = opt_no_plugins = opt_builtin = \ |
617 |
opt_no_aliases = False |
|
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) |
618 |
opt_lsprof_file = None |
974.1.26
by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472 |
619 |
|
620 |
# --no-plugins is handled specially at a very early stage. We need
|
|
621 |
# to load plugins before doing other command parsing so that they
|
|
622 |
# can override commands, but this needs to happen first.
|
|
623 |
||
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) |
624 |
argv_copy = [] |
625 |
i = 0 |
|
626 |
while i < len(argv): |
|
627 |
a = argv[i] |
|
974.1.26
by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472 |
628 |
if a == '--profile': |
629 |
opt_profile = True |
|
1185.33.85
by Martin Pool
New --lsprof option from Denys Duchier |
630 |
elif a == '--lsprof': |
631 |
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) |
632 |
elif a == '--lsprof-file': |
1706.2.6
by Robey Pointer
when giving --lsprof-file, assume --lsprof |
633 |
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) |
634 |
opt_lsprof_file = argv[i + 1] |
635 |
i += 1 |
|
974.1.26
by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472 |
636 |
elif a == '--no-plugins': |
637 |
opt_no_plugins = True |
|
1553.6.1
by Erik Bågfors
support for aliases in bazaar.conf |
638 |
elif a == '--no-aliases': |
639 |
opt_no_aliases = True |
|
974.1.26
by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472 |
640 |
elif a == '--builtin': |
641 |
opt_builtin = True |
|
1185.33.42
by Martin Pool
[patch] make --quiet a global option (robey) |
642 |
elif a in ('--quiet', '-q'): |
1996.3.1
by John Arbash Meinel
Demandloading builtins.py drops our load time from 350ms to 291ms |
643 |
trace.be_quiet() |
2095.5.1
by Martin Pool
Add new -Derror global option to always display tracebacks |
644 |
elif a.startswith('-D'): |
2095.5.2
by Martin Pool
save commit message if commit fails (#32054) |
645 |
debug.debug_flags.add(a[2:]) |
974.1.26
by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472 |
646 |
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) |
647 |
argv_copy.append(a) |
648 |
i += 1 |
|
974.1.26
by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472 |
649 |
|
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) |
650 |
argv = argv_copy |
1616.1.15
by Martin Pool
Handle 'bzr ?', etc. |
651 |
if (not argv): |
652 |
from bzrlib.builtins import cmd_help |
|
1558.14.2
by Aaron Bentley
Removed deprecation warning when bzr invoked with no arguments |
653 |
cmd_help().run_argv_aliases([]) |
1165
by Martin Pool
- move parsing of argv into arguments and options into Command.run_argv |
654 |
return 0 |
655 |
||
656 |
if argv[0] == '--version': |
|
1819.1.8
by Martin Pool
Improved reporting of bzrlib revision_id |
657 |
from bzrlib.version import show_version |
1165
by Martin Pool
- move parsing of argv into arguments and options into Command.run_argv |
658 |
show_version() |
659 |
return 0 |
|
2172.1.1
by Aaron Bentley
Merge shell-like quote handling for aliases |
660 |
|
974.1.26
by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472 |
661 |
if not opt_no_plugins: |
973
by Martin Pool
- various refactorings of command interpreter |
662 |
from bzrlib.plugin import load_plugins |
663 |
load_plugins() |
|
1551.3.11
by Aaron Bentley
Merge from Robert |
664 |
else: |
665 |
from bzrlib.plugin import disable_plugins |
|
666 |
disable_plugins() |
|
973
by Martin Pool
- various refactorings of command interpreter |
667 |
|
1553.6.17
by Erik Bågfors
fix for broken --no-aliases |
668 |
alias_argv = None |
669 |
||
1553.6.1
by Erik Bågfors
support for aliases in bazaar.conf |
670 |
if not opt_no_aliases: |
1553.6.8
by Erik Bågfors
support for overrides |
671 |
alias_argv = get_alias(argv[0]) |
672 |
if alias_argv: |
|
673 |
alias_argv = [a.decode(bzrlib.user_encoding) for a in alias_argv] |
|
674 |
argv[0] = alias_argv.pop(0) |
|
1553.6.1
by Erik Bågfors
support for aliases in bazaar.conf |
675 |
|
1948.1.1
by John Arbash Meinel
Raise a reasonable error when a command is non-ascii |
676 |
cmd = argv.pop(0) |
1948.1.10
by John Arbash Meinel
Simplify changes to command.py |
677 |
# We want only 'ascii' command names, but the user may have typed
|
678 |
# in a Unicode name. In that case, they should just get a
|
|
679 |
# 'command not found' error later.
|
|
974.1.26
by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472 |
680 |
|
1162
by Martin Pool
- change Command infrastructure to use (mostly stateless) objects to |
681 |
cmd_obj = get_cmd_object(cmd, plugins_override=not opt_builtin) |
2367.2.1
by Robert Collins
Remove bzrlib 0.8 compatability where it was making the code unclear or messy. (Robert Collins) |
682 |
run = cmd_obj.run_argv_aliases |
683 |
run_argv = [argv, alias_argv] |
|
1534.7.154
by Aaron Bentley
Removed changes from bzr.ab 1529..1536 |
684 |
|
1185.33.42
by Martin Pool
[patch] make --quiet a global option (robey) |
685 |
try: |
1185.33.85
by Martin Pool
New --lsprof option from Denys Duchier |
686 |
if opt_lsprof: |
1581.1.1
by Robert Collins
Bugfix aliases to be backwards compatible with plugins providing command.run_argv. |
687 |
ret = apply_lsprofiled(opt_lsprof_file, run, *run_argv) |
1185.33.85
by Martin Pool
New --lsprof option from Denys Duchier |
688 |
elif opt_profile: |
1581.1.1
by Robert Collins
Bugfix aliases to be backwards compatible with plugins providing command.run_argv. |
689 |
ret = apply_profiled(run, *run_argv) |
1185.33.42
by Martin Pool
[patch] make --quiet a global option (robey) |
690 |
else: |
1581.1.1
by Robert Collins
Bugfix aliases to be backwards compatible with plugins providing command.run_argv. |
691 |
ret = run(*run_argv) |
1185.33.42
by Martin Pool
[patch] make --quiet a global option (robey) |
692 |
return ret or 0 |
693 |
finally: |
|
694 |
# reset, in case we may do other commands later within the same process
|
|
1996.3.1
by John Arbash Meinel
Demandloading builtins.py drops our load time from 350ms to 291ms |
695 |
trace.be_quiet(False) |
267
by Martin Pool
- better reporting of errors |
696 |
|
1185.12.56
by Aaron Bentley
Prevented display commands from printing broken pipe errors |
697 |
def display_command(func): |
1185.33.18
by Martin Pool
[patch] handle bad IOError subclass raised by urlopen |
698 |
"""Decorator that suppresses pipe/interrupt errors."""
|
1185.12.56
by Aaron Bentley
Prevented display commands from printing broken pipe errors |
699 |
def ignore_pipe(*args, **kwargs): |
700 |
try: |
|
1185.35.22
by Aaron Bentley
Handled more pipe errors for display commands. |
701 |
result = func(*args, **kwargs) |
702 |
sys.stdout.flush() |
|
703 |
return result |
|
1185.12.56
by Aaron Bentley
Prevented display commands from printing broken pipe errors |
704 |
except IOError, e: |
1963.2.6
by Robey Pointer
pychecker is on crack; go back to using 'is None'. |
705 |
if getattr(e, 'errno', None) is None: |
1185.33.18
by Martin Pool
[patch] handle bad IOError subclass raised by urlopen |
706 |
raise
|
1185.12.56
by Aaron Bentley
Prevented display commands from printing broken pipe errors |
707 |
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 |
708 |
# 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 |
709 |
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 |
710 |
raise
|
1185.33.18
by Martin Pool
[patch] handle bad IOError subclass raised by urlopen |
711 |
pass
|
1185.12.69
by Aaron Bentley
Ignored ^C in display commands |
712 |
except KeyboardInterrupt: |
1490
by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1. |
713 |
pass
|
1185.12.56
by Aaron Bentley
Prevented display commands from printing broken pipe errors |
714 |
return ignore_pipe |
267
by Martin Pool
- better reporting of errors |
715 |
|
1185.43.6
by Martin Pool
Enable logging early enough to save argv |
716 |
|
1
by mbp at sourcefrog
import from baz patch-364 |
717 |
def main(argv): |
1104
by Martin Pool
- Add a simple UIFactory |
718 |
import bzrlib.ui |
1185.49.21
by John Arbash Meinel
Refactored bzrlib/ui.py into a module with the possibility for multiple ui forms. |
719 |
from bzrlib.ui.text import TextUIFactory |
720 |
bzrlib.ui.ui_factory = TextUIFactory() |
|
1185.85.4
by John Arbash Meinel
currently broken, trying to fix things up. |
721 |
argv = [a.decode(bzrlib.user_encoding) for a in argv[1:]] |
722 |
ret = run_bzr_catch_errors(argv) |
|
1996.3.1
by John Arbash Meinel
Demandloading builtins.py drops our load time from 350ms to 291ms |
723 |
trace.mutter("return code %d", ret) |
1185.43.6
by Martin Pool
Enable logging early enough to save argv |
724 |
return ret |
1185.3.19
by Martin Pool
- split out commandline error reporting for ease of testing |
725 |
|
726 |
||
727 |
def run_bzr_catch_errors(argv): |
|
1
by mbp at sourcefrog
import from baz patch-364 |
728 |
try: |
2548.1.1
by Aaron Bentley
Don't suppress pipe errors for non-display commaneds (Belchenko, #87178) |
729 |
return run_bzr(argv) |
2027.2.3
by Marien Zwart
Fix another python 2.5 issue. |
730 |
except (KeyboardInterrupt, Exception), e: |
1185.33.19
by Martin Pool
Run postmortem debugger if BZR_PDB is set |
731 |
# used to handle AssertionError and KeyboardInterrupt
|
732 |
# specially here, but hopefully they're handled ok by the logger now
|
|
1996.3.1
by John Arbash Meinel
Demandloading builtins.py drops our load time from 350ms to 291ms |
733 |
trace.report_exception(sys.exc_info(), sys.stderr) |
1740.5.3
by Martin Pool
Cleanup more exception-formatting code |
734 |
if os.environ.get('BZR_PDB'): |
735 |
print '**** entering debugger' |
|
736 |
import pdb |
|
737 |
pdb.post_mortem(sys.exc_traceback) |
|
738 |
return 3 |
|
1
by mbp at sourcefrog
import from baz patch-364 |
739 |
|
2432.1.2
by Robert Collins
Add a HelpCommandContext class for help from commands. |
740 |
|
2432.1.15
by Robert Collins
Rename Context (in bzrlib.help) to Index, for a clearer name. |
741 |
class HelpCommandIndex(object): |
742 |
"""A index for bzr help that returns commands."""
|
|
2432.1.2
by Robert Collins
Add a HelpCommandContext class for help from commands. |
743 |
|
2432.1.17
by Robert Collins
Add prefixes to HelpIndexes. |
744 |
def __init__(self): |
745 |
self.prefix = 'commands/' |
|
746 |
||
2432.1.13
by Robert Collins
HelpCommandContext now implementes get_topics. |
747 |
def get_topics(self, topic): |
748 |
"""Search for topic amongst commands.
|
|
749 |
||
750 |
:param topic: A topic to search for.
|
|
751 |
:return: A list which is either empty or contains a single
|
|
752 |
Command entry.
|
|
753 |
"""
|
|
2432.1.18
by Robert Collins
Add support for doing bzr help commands/COMMANDNAME. |
754 |
if topic and topic.startswith(self.prefix): |
755 |
topic = topic[len(self.prefix):] |
|
2432.1.13
by Robert Collins
HelpCommandContext now implementes get_topics. |
756 |
try: |
757 |
cmd = _get_cmd_object(topic) |
|
758 |
except KeyError: |
|
759 |
return [] |
|
760 |
else: |
|
761 |
return [cmd] |
|
762 |
||
2432.1.2
by Robert Collins
Add a HelpCommandContext class for help from commands. |
763 |
|
1
by mbp at sourcefrog
import from baz patch-364 |
764 |
if __name__ == '__main__': |
765 |
sys.exit(main(sys.argv)) |