~bzr-pqm/bzr/bzr.dev

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#!/usr/bin/python

from bzrlib import plugin
from bzrlib import commands

template="""\
# Programmable completion for the Bazaar-NG bzr command under bash. Source
# this file (or on some systems add it to ~/.bash_completion and start a new
# shell) and bash's completion mechanism will know all about bzr's options!

# Known to work with bash 2.05a with programmable completion and extended
# pattern matching enabled (use 'shopt -s extglob progcomp' to enable
# these if they are not already enabled).

# Based originally on the svn bash completition script.
# Customized by Sven Wilhelm/Icecrash.com
# Adjusted for automatic generation by Martin von Gagern

_bzr ()
{
	local cur cmds cmdOpts opt helpCmds optBase i

	COMPREPLY=()
	cur=${COMP_WORDS[COMP_CWORD]}

	cmds='%(cmds)s'

	if [[ $COMP_CWORD -eq 1 ]] ; then
		COMPREPLY=( $( compgen -W "$cmds" -- $cur ) )
		return 0
	fi

	# if not typing an option, or if the previous option required a
	# parameter, then fallback on ordinary filename expansion
	helpCmds='help|--help|h|\?'
	if [[ ${COMP_WORDS[1]} != @($helpCmds) ]] && \
	   [[ "$cur" != -* ]] ; then
		return 0
	fi

	cmdOpts=
	case ${COMP_WORDS[1]} in
%(cases)s\
	*)
		cmdOpts='--help -h'
		;;
	esac

	cmdOpts=" $cmdOpts "

	# take out options already given
	for (( i=2; i<=$COMP_CWORD-1; ++i )) ; do
		opt=${COMP_WORDS[$i]}

		case $opt in
		--*)    optBase=${opt/=*/} ;;
		-*)     optBase=${opt:0:2} ;;
		esac

		cmdOpts=" $cmdOpts "
		cmdOpts=${cmdOpts/ ${optBase} / }

		# take out some alternatives
		case $optBase in
%(optalt)s\
		esac

		# skip next option if this one requires a parameter
		if [[ $opt == @($optsParam) ]] ; then
			((++i))
		fi
	done

	COMPREPLY=( $( compgen -W "$cmdOpts" -- $cur ) )

	return 0
}
complete -F _bzr -o default bzr
"""

def bash_completion_function(out):
    aliases = []
    cases = ""
    optaliases = {}
    reqarg = {}
    for name in sorted(commands.all_command_names()):
        cmd = commands.get_cmd_object(name)
        cases += "\t" + name
        aliases.append(name)
        for alias in cmd.aliases:
            cases += "|" + alias
            aliases.append(alias)
        cases += ")\n"
        plugin = cmd.plugin_name()
        if plugin is not None:
            cases += "\t\t# plugin \"%s\"\n" % plugin
        opts = cmd.options()
        optnames = []
        for optname in sorted(cmd.options()):
            opt = opts[optname]
            optset = set()
            for (name, short_name, optname, help) in opt.iter_switches():
                if short_name is not None:
                    optset.add("-" + short_name)
                if name is not None:
                    optset.add("--" + name)
            for optname in optset:
                if optname not in optaliases:
                    optaliases[optname] = optset
                else:
                    optaliases[optname] &= optset
            optnames.extend(sorted(optset))
        cases += "\t\tcmdOpts='" + " ".join(optnames) + "'\n\t\t;;\n"
    optalt = ""
    for opt1 in sorted(optaliases):
        optset = optaliases[opt1]
        if len(optset) == 1:
            continue
        optalt += "\t\t" + opt1 + ")\n"
        for opt2 in sorted(optset):
            if opt1 != opt2:
                optalt += "\t\t\tcmdOpts=${cmdOpts/ " + opt2 + " / }\n"
        optalt += "\t\t\t;;\n"
    out.write(template % {"cmds": " ".join(aliases),
                          "cases": cases,
                          "optalt": optalt})

if __name__ == '__main__':

    import sys
    import locale

    locale.setlocale(locale.LC_ALL, '')
    plugin.load_plugins()
    commands.install_bzr_command_hooks()
    bash_completion_function(sys.stdout)