~abentley/bzrtools/bzrtools.dev

« back to all changes in this revision

Viewing changes to shell.py

  • Committer: Aaron Bentley
  • Date: 2011-04-12 04:51:37 UTC
  • Revision ID: aaron@aaronbentley.com-20110412045137-ni3eart33v4wnlst
Allow zap --branch --store if no uncommitted changes.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
# Copyright (C) 2004, 2005 Aaron Bentley
2
 
# <aaron.bentley@utoronto.ca>
 
2
# <aaron@aaronbentley.com>
3
3
#
4
4
#    This program is free software; you can redistribute it and/or modify
5
5
#    it under the terms of the GNU General Public License as published by
24
24
import string
25
25
import sys
26
26
 
 
27
from bzrlib import osutils, trace
27
28
from bzrlib.branch import Branch
28
 
from bzrlib.commands import get_cmd_object, get_all_cmds, get_alias
 
29
from bzrlib.config import config_dir, ensure_config_dir_exists
 
30
from bzrlib.commands import get_cmd_object, all_command_names, get_alias
29
31
from bzrlib.errors import BzrError
30
32
from bzrlib.workingtree import WorkingTree
31
33
 
84
86
 
85
87
 
86
88
class PromptCmd(cmd.Cmd):
 
89
 
87
90
    def __init__(self):
88
91
        cmd.Cmd.__init__(self)
89
92
        self.prompt = "bzr> "
94
97
        self.set_title()
95
98
        self.set_prompt()
96
99
        self.identchars += '-'
97
 
        self.history_file = os.path.expanduser("~/.bazaar/shell-history")
98
 
        readline.set_completer_delims(string.whitespace)
 
100
        ensure_config_dir_exists()
 
101
        self.history_file = osutils.pathjoin(config_dir(), 'shell-history')
 
102
        whitespace = ''.join(c for c in string.whitespace if c < chr(127))
 
103
        readline.set_completer_delims(whitespace)
99
104
        if os.access(self.history_file, os.R_OK) and \
100
105
            os.path.isfile(self.history_file):
101
106
            readline.read_history_file(self.history_file)
164
169
        self.default("help "+line)
165
170
 
166
171
    def default(self, line):
167
 
        args = shlex.split(line)
 
172
        try:
 
173
            args = shlex.split(line)
 
174
        except ValueError, e:
 
175
            print 'Parse error:', e
 
176
            return
 
177
 
168
178
        alias_args = get_alias(args[0])
169
179
        if alias_args is not None:
170
180
            args[0] = alias_args.pop(0)
182
192
            return os.system(line)
183
193
 
184
194
        try:
185
 
            if too_complicated(line):
 
195
            is_qbzr = cmd_obj.__module__.startswith('bzrlib.plugins.qbzr.')
 
196
            if too_complicated(line) or is_qbzr:
186
197
                return os.system("bzr "+line)
187
198
            else:
188
199
                return (cmd_obj.run_argv_aliases(args, alias_args) or 0)
189
200
        except BzrError, e:
 
201
            trace.log_exception_quietly()
190
202
            print e
191
203
        except KeyboardInterrupt, e:
192
204
            print "Interrupted"
193
205
        except Exception, e:
194
 
#            print "Unhandled error:\n%s" % errors.exception_str(e)
 
206
            trace.log_exception_quietly()
195
207
            print "Unhandled error:\n%s" % (e)
196
208
 
197
209
 
216
228
        return CompletionContext(text, command=cmd).get_completions()
217
229
 
218
230
 
219
 
def run_shell():
 
231
def run_shell(directory=None):
220
232
    try:
 
233
        if not directory is None:
 
234
            os.chdir(directory)
221
235
        prompt = PromptCmd()
222
 
        try:
223
 
            prompt.cmdloop()
224
 
        finally:
225
 
            prompt.write_history()
 
236
        while True:
 
237
            try:
 
238
                try:
 
239
                    prompt.cmdloop()
 
240
                except KeyboardInterrupt:
 
241
                    print
 
242
            finally:
 
243
                prompt.write_history()
226
244
    except StopIteration:
227
245
        pass
228
246
 
276
294
 
277
295
 
278
296
def iter_command_names(hidden=False):
279
 
    for real_cmd_name, cmd_class in get_all_cmds():
280
 
        if not hidden and cmd_class.hidden:
 
297
    for real_cmd_name in all_command_names():
 
298
        cmd_obj = get_cmd_object(real_cmd_name)
 
299
        if not hidden and cmd_obj.hidden:
281
300
            continue
282
 
        for name in [real_cmd_name] + cmd_class.aliases:
 
301
        for name in [real_cmd_name] + cmd_obj.aliases:
283
302
            # Don't complete on aliases that are prefixes of the canonical name
284
303
            if name == real_cmd_name or not real_cmd_name.startswith(name):
285
304
                yield name