diff options
-rw-r--r-- | ChangeLog | 3 | ||||
-rw-r--r-- | Completion/Debian/Command/_dcut | 160 |
2 files changed, 163 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog index 727600934..e958df124 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,8 @@ 2013-06-28 Clint Adams <clint@zsh.org> + * 31499: Completion/Debian/Command/_dcut: dcut completion + from Sebastian Ramacher. + * 31498: Completion/Debian/Command/_dak: complete files for subcommands that are not explicitly specified. diff --git a/Completion/Debian/Command/_dcut b/Completion/Debian/Command/_dcut new file mode 100644 index 000000000..210d54429 --- /dev/null +++ b/Completion/Debian/Command/_dcut @@ -0,0 +1,160 @@ +#compdef dcut + +# TODO: dcut supports two ways to be called: +# * dcut HOST COMMAND ... +# * dcut COMMAND ... +# So ideally, if the first argument is completed, both commands and hosts should +# be offered. If host is given, the second argument should be completed as +# command and if not, it should be completed as command specific option. + +function _dput_hosts() { + local expl + + if ( [[ ${+_dput_cfhosts} -eq 0 ]] || _cache_invalid dputhosts ) && ! _retrieve_cache dputhosts; then + local cmd + if _pick_variant dputng="usage: dput" dput -H ; then + cmd=(dirt hosts) + else + cmd=(dput -H) + fi + _dput_cfhosts=(${${(M)${(f)"$($cmd)"}:#*=>*}/ =>*/}) + _store_cache dputhosts _dput_cfhosts + fi + + _wanted dputhosts expl 'target host' compadd -a _dput_cfhosts +} + +function _dcut_commands() { + local -a cmds + if _pick_variant dcutng="usage: dcut" dcut -v ; then + cmds=( + dm:'manage Debian Maintainer permissions' + break-the-archive:'break the archive' + reschedule:'reschedule a deferred upload' + cancel:'cancel a deferred upload' + rm:'remove a file from the upload queue' + upload:'upload a command file' + ) + else + cmds=( + rm:'remove a file from the upload queue' + cancel:'cancel a deferred upload' + reschedule:'reschedule a deferred upload' + ) + fi + _describe -t commands command cmds +} + +function _dcut() { + local -a all_opts dcut_opts dcut_ng_opts + local state line context + local -A opt_args + local curcontext="${curcontext}" + + all_opts=( + '(-c --config)'{-c,--config=}'[specify config file]:config file:_files' + '(-h --help)'{-h,--help}'[show help message and exit]' + '(-m --maintainer)'{-m,--maintainer=}'[use maintainer for upload field and GPG key selection]:maintainer address' + '(-k --keyid)'{-k,--keyid}'[use key id for signing]:keyid' + '(-O --output)'{-O,--output=}'[write command file to file instead of uploading]:output file:_files' + '(-P --passive)'{-P,--passive}'[use passive FTP for uploads]' + '(-v --version)'{-v,--version}'[show version information]' + ': :_dcut_commands' + ) + + dcut_opts=( + '(-d --debug)'{-d,--debug}'[debug mode]' + '(-s --simulate)'{-s,--simulate}'[simulate an upload only]' + '(-i --input)'{-i,--input=}'[create commands file to remove every file listed in the changes file]:changes file:_files -g"*.changes(-.)"' + '(-U --upload)'{-U,--upload=}'[upload commands file]:commands file:_files' + '(--host 1)'{--host=}'[upload to host if it is named like a command]:host:_dput_hosts' + '*:: :->dcut_command_arguments' + ) + + dcut_ng_opts=( + '*'{-d,--debug}'[enable debug messages, repeat twice to increase the verbosity level]' + '*'{-s,--simulate}'[simulate an upload only, repeat twice to increase level of simulation]' + '*:: :->dcut_ng_command_arguments' + ) + + if _pick_variant dcutng="usage: dcut" dcut -v ; then + _arguments -C \ + "$all_opts[@]" "$dcut_ng_opts[@]" && return + else + _arguments -C \ + "$all_opts[@]" "$dcut_opts[@]" && return + fi + + case $state in + (dcut_command_arguments) + # arguments to dcut commands + local -a opts + case ${line[1]} in + (cancel) + # dcut cancel arguments + opts=( + '1::changes file:_files -g"*.changes(-.)"' + ) + ;; + (reschedule) + # dcut reschedule arguments + opts=( + '1::changes file:_files -g"*.changes(-.)"' + '2::new delayed queue:(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15)' + ) + ;; + (rm) + # dcut rm arguments + opts=( + '--searchdirs[search in all directores for the given files]' + '1::file to be deleted:_files' + ) + ;; + esac + _arguments "$opts[@]" && return + ;; + (dcut_ng_command_arguments) + # arguments to dput-ng's dcut commands + local -a opts + case ${line[1]} in + (cancel) + # dcut cancel arguments + opts=( + '(-f --filename)'{-f,--filename}'[.changes file name of the upload to be cancelled]:file name:_files -g"*.changes(-.)"' + ) + ;; + (dm) + # dcut dm arguments + opts=( + '--uid[full name and address or GPG fingerprint of the Debian Maintainer]' + '*--allow[grant permission to upload a source package]:source package' + '*--deny[remove permission to upload a source pckage]:source package' + ) + ;; + (reschedule) + # dcut reschedule arguments + opts=( + '(-f --filename)'{-f,--filename}'[.changes file name to be rescheduled]:file name:_files -g"*.changes(-.)"' + '(-d --days)'{-d,--days}'[new delayed queue]:days:(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15)' + ) + ;; + (rm) + # dcut rm arguments + opts=( + '*'{-f,--filename}'[file name to be removed]:file name:_files' + '--searchdirs[search in all directores for the given files]' + ) + ;; + (upload) + # dcut upload arguments + opts=( + '-f --filename)'{-f,--filename}'[file to be uploaded]:file name:_files' + ) + ;; + esac + _arguments "$opts[@]" && return + ;; + esac +} + +_dcut "$@" |