~bzr-pqm/bzr/bzr.dev

1091 by Martin Pool
- new shell-complete command to help zsh completion
1
import sys
2
3
4
def shellcomplete(context=None, outfile = None):
5
    if outfile == None:
6
        outfile = sys.stdout
7
    if context == None:
8
        shellcomplete_commands(outfile = outfile)
9
    else:
10
        shellcomplete_on_command(context, outfile = outfile)
11
12
def shellcomplete_on_command(cmdname, outfile = None):
13
    cmdname = str(cmdname)
14
15
    if outfile == None:
16
        outfile = sys.stdout
17
18
    from inspect import getdoc
19
    import commands
1185.1.9 by Robert Collins
Clint Adams patch for shell completion hints
20
    cmdobj = commands.get_cmd_object(cmdname)
1091 by Martin Pool
- new shell-complete command to help zsh completion
21
1185.1.9 by Robert Collins
Clint Adams patch for shell completion hints
22
    doc = getdoc(cmdobj)
1091 by Martin Pool
- new shell-complete command to help zsh completion
23
    if doc == None:
24
        raise NotImplementedError("sorry, no detailed shellcomplete yet for %r" % cmdname)
25
1185.1.9 by Robert Collins
Clint Adams patch for shell completion hints
26
    shellcomplete_on_option(cmdobj.takes_options, outfile = None)
27
    for aname in cmdobj.takes_args:
28
        outfile.write(aname + '\n')
1091 by Martin Pool
- new shell-complete command to help zsh completion
29
30
1185.16.45 by Martin Pool
- refactor handling of short option names
31
def shellcomplete_on_option(options, outfile=None):
32
    from bzrlib.option import Option
1091 by Martin Pool
- new shell-complete command to help zsh completion
33
    if not options:
34
        return
35
    if outfile == None:
36
        outfile = sys.stdout
37
    for on in options:
1185.16.45 by Martin Pool
- refactor handling of short option names
38
        for shortname, longname in Option.SHORT_OPTIONS.items():
1091 by Martin Pool
- new shell-complete command to help zsh completion
39
            if longname == on:
40
                l = '"(--' + on + ' -' + shortname + ')"{--' + on + ',-' + shortname + '}'
41
                break
42
	    else:
43
		l = '--' + on
44
        outfile.write(l + '\n')
45
46
47
def shellcomplete_commands(outfile = None):
48
    """List all commands"""
49
    import inspect
50
    import commands
51
    from inspect import getdoc
52
    
53
    if outfile == None:
54
        outfile = sys.stdout
55
    
56
    cmds = []
57
    for cmdname, cmdclass in commands.get_all_cmds():
58
        cmds.append((cmdname, cmdclass))
59
	for alias in cmdclass.aliases:
60
	    cmds.append((alias, cmdclass))
61
    cmds.sort()
62
    for cmdname, cmdclass in cmds:
63
        if cmdclass.hidden:
64
            continue
65
        doc = getdoc(cmdclass)
66
        if doc == None:
67
	    outfile.write(cmdname + '\n')
68
        else:
69
	    doclines = doc.splitlines()
70
	    firstline = doclines[0].lower()
71
	    outfile.write(cmdname + ':' + firstline[0:-1] + '\n')