~bzr-pqm/bzr/bzr.dev

4763.2.4 by John Arbash Meinel
merge bzr.2.1 in preparation for NEWS entry.
1
# Copyright (C) 2005, 2006, 2007, 2009, 2010 Canonical Ltd
2052.3.1 by John Arbash Meinel
Add tests to cleanup the copyright of all source files
2
#
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.
7
#
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.
12
#
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
2052.3.1 by John Arbash Meinel
Add tests to cleanup the copyright of all source files
16
6379.6.3 by Jelmer Vernooij
Use absolute_import.
17
from __future__ import absolute_import
18
1091 by Martin Pool
- new shell-complete command to help zsh completion
19
import sys
20
21
22
def shellcomplete(context=None, outfile = None):
1963.2.6 by Robey Pointer
pychecker is on crack; go back to using 'is None'.
23
    if outfile is None:
1091 by Martin Pool
- new shell-complete command to help zsh completion
24
        outfile = sys.stdout
1963.2.6 by Robey Pointer
pychecker is on crack; go back to using 'is None'.
25
    if context is None:
1091 by Martin Pool
- new shell-complete command to help zsh completion
26
        shellcomplete_commands(outfile = outfile)
27
    else:
28
        shellcomplete_on_command(context, outfile = outfile)
29
2190.2.1 by Martin Pool
remove global registration of short options
30
31
def shellcomplete_on_command(cmdname, outfile=None):
1091 by Martin Pool
- new shell-complete command to help zsh completion
32
    cmdname = str(cmdname)
33
1963.2.6 by Robey Pointer
pychecker is on crack; go back to using 'is None'.
34
    if outfile is None:
1091 by Martin Pool
- new shell-complete command to help zsh completion
35
        outfile = sys.stdout
36
37
    from inspect import getdoc
38
    import commands
1185.1.9 by Robert Collins
Clint Adams patch for shell completion hints
39
    cmdobj = commands.get_cmd_object(cmdname)
1091 by Martin Pool
- new shell-complete command to help zsh completion
40
1185.1.9 by Robert Collins
Clint Adams patch for shell completion hints
41
    doc = getdoc(cmdobj)
1963.2.6 by Robey Pointer
pychecker is on crack; go back to using 'is None'.
42
    if doc is None:
1091 by Martin Pool
- new shell-complete command to help zsh completion
43
        raise NotImplementedError("sorry, no detailed shellcomplete yet for %r" % cmdname)
44
2190.2.1 by Martin Pool
remove global registration of short options
45
    shellcomplete_on_options(cmdobj.options().values(), outfile=outfile)
1185.1.9 by Robert Collins
Clint Adams patch for shell completion hints
46
    for aname in cmdobj.takes_args:
47
        outfile.write(aname + '\n')
1091 by Martin Pool
- new shell-complete command to help zsh completion
48
49
2190.2.1 by Martin Pool
remove global registration of short options
50
def shellcomplete_on_options(options, outfile=None):
51
    for opt in options:
4634.95.1 by Benoît Pierre
Small fix for handling of short option names in shellcomplete_on_options.
52
        short_name = opt.short_name()
53
        if short_name:
2190.2.1 by Martin Pool
remove global registration of short options
54
            outfile.write('"(--%s -%s)"{--%s,-%s}\n'
4634.95.1 by Benoît Pierre
Small fix for handling of short option names in shellcomplete_on_options.
55
                    % (opt.name, short_name, opt.name, short_name))
2190.2.1 by Martin Pool
remove global registration of short options
56
        else:
57
            outfile.write('--%s\n' % opt.name)
1091 by Martin Pool
- new shell-complete command to help zsh completion
58
59
60
def shellcomplete_commands(outfile = None):
61
    """List all commands"""
62
    import inspect
63
    import commands
64
    from inspect import getdoc
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
65
4119.3.16 by Robert Collins
Shellcompletion apparently isn't tested.
66
    commands.install_bzr_command_hooks()
67
1963.2.6 by Robey Pointer
pychecker is on crack; go back to using 'is None'.
68
    if outfile is None:
1091 by Martin Pool
- new shell-complete command to help zsh completion
69
        outfile = sys.stdout
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
70
1091 by Martin Pool
- new shell-complete command to help zsh completion
71
    cmds = []
4119.3.8 by Robert Collins
Get missing command support sorted out.
72
    for cmdname in commands.all_command_names():
4119.3.16 by Robert Collins
Shellcompletion apparently isn't tested.
73
        cmd = commands.get_cmd_object(cmdname)
4119.3.8 by Robert Collins
Get missing command support sorted out.
74
        cmds.append((cmdname, cmd))
75
        for alias in cmd.aliases:
76
            cmds.append((alias, cmd))
1091 by Martin Pool
- new shell-complete command to help zsh completion
77
    cmds.sort()
4119.3.8 by Robert Collins
Get missing command support sorted out.
78
    for cmdname, cmd in cmds:
79
        if cmd.hidden:
1091 by Martin Pool
- new shell-complete command to help zsh completion
80
            continue
4119.3.8 by Robert Collins
Get missing command support sorted out.
81
        doc = getdoc(cmd)
1963.2.6 by Robey Pointer
pychecker is on crack; go back to using 'is None'.
82
        if doc is None:
2120.2.1 by John Arbash Meinel
Remove tabs from source files, and add a test to keep it that way.
83
            outfile.write(cmdname + '\n')
1091 by Martin Pool
- new shell-complete command to help zsh completion
84
        else:
2120.2.1 by John Arbash Meinel
Remove tabs from source files, and add a test to keep it that way.
85
            doclines = doc.splitlines()
86
            firstline = doclines[0].lower()
87
            outfile.write(cmdname + ':' + firstline[0:-1] + '\n')