23
23
from itertools import chain
24
24
from bzrlib.errors import BzrError
25
25
from bzrlib.commands import get_cmd_object, get_all_cmds
26
from bzrlib.branch import Branch
28
27
SHELL_BLACKLIST = set(['rm', 'ls'])
29
28
COMPLETION_BLACKLIST = set(['shell'])
33
32
BzrError.__init__(self, "The command %s is blacklisted for shell use" %
36
class CompletionContext(object):
37
def __init__(self, text, command=None, prev_opt=None, arg_pos=None):
39
self.command = command
40
self.prev_opt = prev_opt
43
def get_completions(self):
45
return self.get_completions_or_raise()
50
def get_option_completions(self):
52
command_obj = get_cmd_object(self.command)
55
opts = [o+" " for o in iter_opt_completions(command_obj)]
56
return list(filter_completions(opts, self.text))
58
def get_completions_or_raise(self):
59
if self.command is None:
60
iter = (c+" " for c in iter_command_names() if
61
c not in COMPLETION_BLACKLIST)
62
return list(filter_completions(iter, self.text))
63
if self.prev_opt is None:
64
completions = self.get_option_completions()
65
if self.command == "cd":
66
iter = iter_dir_completions(self.text)
67
completions.extend(list(filter_completions(iter, self.text)))
69
iter = iter_file_completions(self.text)
70
completions.extend([f+" " for f in
71
filter_completions(iter, self.text)])
75
35
class PromptCmd(cmd.Cmd):
76
36
def __init__(self):
77
37
cmd.Cmd.__init__(self)
78
38
self.prompt = "bzr> "
80
self.branch = Branch.open_containing('.')[0]
40
self.tree = arch.tree_root(".")
85
45
self.identchars += '-'
111
71
def set_prompt(self):
112
if self.branch is not None:
72
if self.tree is not None:
114
prompt_data = (self.branch.nick, self.branch.revno(),
115
self.branch.working_tree().relpath('.'))
116
prompt = " %s:%d/%s" % prompt_data
74
prompt = pylon.alias_or_version(self.tree.tree_version,
77
if prompt is not None:
78
prompt = " " + prompt +":"+ pylon.tree_cwd(self.tree)
123
85
def set_title(self, command=None):
125
b = Branch.open_containing('.')[0]
126
version = "%s:%d" % (b.nick, b.revno())
87
version = pylon.alias_or_version(self.tree.tree_version, self.tree,
128
90
version = "[no version]"
129
91
if command is None:
183
145
def completenames(self, text, line, begidx, endidx):
184
return CompletionContext(text).get_completions()
147
iter = (c for c in iter_command_names() if
148
c not in COMPLETION_BLACKLIST)
151
arg = line.split()[-1]
154
iter = list(iter_munged_completions(iter, arg, text))
186
159
def completedefault(self, text, line, begidx, endidx):
187
160
"""Perform completion for native commands.
198
171
(cmd, args, foo) = self.parseline(line)
201
return CompletionContext(text, command=cmd).get_completions()
174
return self.completenames(text, line, begidx, endidx)
178
command_obj = get_cmd_object(cmd)
182
if command_obj is not None:
184
for option_name, option in command_obj.options().items():
185
opts.append("--" + option_name)
186
short_name = option.short_name()
188
opts.append("-" + short_name)
189
q = list(iter_munged_completions(opts, args, text))
190
return list(iter_munged_completions(opts, args, text))
193
arg = args.split()[-1]
196
iter = iter_dir_completions(arg)
197
iter = iter_munged_completions(iter, arg, text)
200
arg = args.split()[-1]
201
iter = iter_file_completions(arg)
202
return list(iter_munged_completions(iter, arg, text))
204
return self.completenames(text, line, begidx, endidx)
210
215
except StopIteration:
213
def iter_opt_completions(command_obj):
214
for option_name, option in command_obj.options().items():
215
yield "--" + option_name
216
short_name = option.short_name()
218
yield "-" + short_name
220
218
def iter_file_completions(arg, only_dirs = False):
221
219
"""Generate an iterator that iterates through filename completions.
265
263
if name == real_cmd_name or not real_cmd_name.startswith(name):
268
def filter_completions(iter, arg):
269
return (c for c in iter if c.startswith(arg))
271
266
def iter_munged_completions(iter, arg, text):
272
267
for completion in iter:
273
268
completion = str(completion)