bzr branch
http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
| 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') |