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