~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bashcomp.py

First programmatic generation of completions.

The list of commands is generated, as is the list of possible switches for
each command. Commands requiring arguments aren't treated specially yet.

For every option name there is a list of switches, and if any switch for the
option is given, then the others will be suppressed.  This might be
incorrect in some cases, but closely mimics the old, static function.  The
list of these switch suppressions might be incomplete, as some switches
might have different alternative forms for different commands, in which
cases only the intersection of all alternatives gets suppressed.  A future
version might do this suppression based on the current command, or drop it
completely.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#!/usr/bin/python
 
2
 
 
3
from bzrlib import plugin
 
4
from bzrlib import commands
 
5
 
 
6
template="""\
1
7
# Programmable completion for the Bazaar-NG bzr command under bash. Source
2
8
# this file (or on some systems add it to ~/.bash_completion and start a new
3
9
# shell) and bash's completion mechanism will know all about bzr's options!
8
14
 
9
15
# Based originally on the svn bash completition script.
10
16
# Customized by Sven Wilhelm/Icecrash.com
 
17
# Adjusted for automatic generation by Martin von Gagern
11
18
 
12
19
_bzr ()
13
20
{
16
23
        COMPREPLY=()
17
24
        cur=${COMP_WORDS[COMP_CWORD]}
18
25
 
19
 
        cmds='status diff commit ci checkin move remove log info check ignored'
 
26
        cmds='%(cmds)s'
20
27
 
21
28
        if [[ $COMP_CWORD -eq 1 ]] ; then
22
29
                COMPREPLY=( $( compgen -W "$cmds" -- $cur ) )
33
40
 
34
41
        cmdOpts=
35
42
        case ${COMP_WORDS[1]} in
36
 
        status)
37
 
                cmdOpts="--all --show-ids"
38
 
                ;;
39
 
        diff)
40
 
                cmdOpts="-r --revision --diff-options"
41
 
                ;;
42
 
        commit|ci|checkin)
43
 
                cmdOpts="-r --message -F --file -v --verbose"
44
 
                ;;
45
 
        move)
46
 
                cmdOpts=""
47
 
                ;;
48
 
        remove)
49
 
                cmdOpts="-v --verbose"
50
 
                ;;
51
 
        log)
52
 
                cmdOpts="--forward --timezone -v --verbose --show-ids -r --revision"
53
 
                ;;
54
 
        info)
55
 
                cmdOpts=""
56
 
                ;;
57
 
        ignored)
58
 
                cmdOpts=""
59
 
                ;;
60
 
        check)
61
 
                cmdOpts=""
62
 
                ;;
63
 
        help|h|\?)
64
 
                cmdOpts="$cmds $qOpts"
65
 
                ;;
 
43
%(cases)s\
66
44
        *)
 
45
                cmdOpts='--help -h'
67
46
                ;;
68
47
        esac
69
48
 
70
 
        cmdOpts="$cmdOpts --help -h"
 
49
        cmdOpts=" $cmdOpts "
71
50
 
72
51
        # take out options already given
73
52
        for (( i=2; i<=$COMP_CWORD-1; ++i )) ; do
81
60
                cmdOpts=" $cmdOpts "
82
61
                cmdOpts=${cmdOpts/ ${optBase} / }
83
62
 
84
 
                # take out alternatives
 
63
                # take out some alternatives
85
64
                case $optBase in
86
 
                -v)              cmdOpts=${cmdOpts/ --verbose / } ;;
87
 
                --verbose)       cmdOpts=${cmdOpts/ -v / } ;;
88
 
                -h)              cmdOpts=${cmdOpts/ --help / } ;;
89
 
                --help)          cmdOpts=${cmdOpts/ -h / } ;;
90
 
                -r)              cmdOpts=${cmdOpts/ --revision / } ;;
91
 
                --revision)      cmdOpts=${cmdOpts/ -r / } ;;
 
65
%(optalt)s\
92
66
                esac
93
67
 
94
68
                # skip next option if this one requires a parameter
102
76
        return 0
103
77
}
104
78
complete -F _bzr -o default bzr
 
79
"""
 
80
 
 
81
def bash_completion_function(out):
 
82
    aliases = []
 
83
    cases = ""
 
84
    optaliases = {}
 
85
    reqarg = {}
 
86
    for name in sorted(commands.all_command_names()):
 
87
        cmd = commands.get_cmd_object(name)
 
88
        cases += "\t" + name
 
89
        aliases.append(name)
 
90
        for alias in cmd.aliases:
 
91
            cases += "|" + alias
 
92
            aliases.append(alias)
 
93
        cases += ")\n"
 
94
        plugin = cmd.plugin_name()
 
95
        if plugin is not None:
 
96
            cases += "\t\t# plugin \"%s\"\n" % plugin
 
97
        opts = cmd.options()
 
98
        optnames = []
 
99
        for optname in sorted(cmd.options()):
 
100
            opt = opts[optname]
 
101
            optset = set()
 
102
            for (name, short_name, optname, help) in opt.iter_switches():
 
103
                if short_name is not None:
 
104
                    optset.add("-" + short_name)
 
105
                if name is not None:
 
106
                    optset.add("--" + name)
 
107
            for optname in optset:
 
108
                if optname not in optaliases:
 
109
                    optaliases[optname] = optset
 
110
                else:
 
111
                    optaliases[optname] &= optset
 
112
            optnames.extend(sorted(optset))
 
113
        cases += "\t\tcmdOpts='" + " ".join(optnames) + "'\n\t\t;;\n"
 
114
    optalt = ""
 
115
    for opt1 in sorted(optaliases):
 
116
        optset = optaliases[opt1]
 
117
        if len(optset) == 1:
 
118
            continue
 
119
        optalt += "\t\t" + opt1 + ")\n"
 
120
        for opt2 in sorted(optset):
 
121
            if opt1 != opt2:
 
122
                optalt += "\t\t\tcmdOpts=${cmdOpts/ " + opt2 + " / }\n"
 
123
        optalt += "\t\t\t;;\n"
 
124
    out.write(template % {"cmds": " ".join(aliases),
 
125
                          "cases": cases,
 
126
                          "optalt": optalt})
 
127
 
 
128
if __name__ == '__main__':
 
129
 
 
130
    import sys
 
131
    import locale
 
132
 
 
133
    locale.setlocale(locale.LC_ALL, '')
 
134
    plugin.load_plugins()
 
135
    commands.install_bzr_command_hooks()
 
136
    bash_completion_function(sys.stdout)