From 6483c0c3a13d9feb9bb2a1cb3db8b430c35e4669 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aljaz=CC=8C=20=22g5pw=22=20Srebrnic=CC=8C?= Date: Wed, 20 Mar 2013 08:22:38 +0100 Subject: [PATCH] Overhauled port command completion Port command completion got smarter. It can now complete paths for the provides subcommand, and complete pseudo-portnames. It will complete all ports or only installed ones (for example, when completing for the uninstall command). It will complete the select subcommand with appropriate values. --- src/_port | 190 +++++++++++++++++++++++++++++++----------------------- 1 file changed, 109 insertions(+), 81 deletions(-) diff --git a/src/_port b/src/_port index 9053f53..db39c1f 100644 --- a/src/_port +++ b/src/_port @@ -11,92 +11,120 @@ # # * Matt Cable # * Sorin Ionescu +# * Aljaž Srebrnič # # ------------------------------------------------------------------------------ -local subcmds +_port_select() { + if (( CURRENT == 3 )); then + _describe 'Port select options' select_options + elif (( CURRENT == 4 )); then + local select_group + select_group=() + for f in $port_prefix/etc/select/*; do + select_group+=$(basename $f) + done + _describe "Port select groups" select_group + elif [[ $CURRENT -eq 5 && $words[3] == '--set' ]]; then + local select_variants + select_variants=("${(f)$(port select --list $words[4] | sed -e '1 d' -e 's/^[ \t]*//' -e 's/ (active)$//')}") + _describe "Port select group $words[4] variants" select_variants + fi +} -subcmds=( - 'activate' - 'archive' - 'build' - 'cat' - 'clean' - 'configure' - 'contents' - 'deactivate' - 'dependents' - 'deps' - 'destroot' - 'dir' - 'distcheck' - 'distclean' - 'dmg' - 'echo' - 'edit' - 'extract' - 'fetch' - 'file' - 'help' - 'info' - 'install' - 'installed' - 'list' - 'livecheck' - 'location' - 'mpkg' - 'outdated' - 'patch' - 'pkg' - 'provides' - 'rpmpackage' - 'search' - 'selfupdate' - 'sync' - 'test' - 'unarchive' - 'uninstall' - 'upgrade' - 'variants' - 'version' -) +_port() { + # Variables for _argument + typeset -A opt_args + local context state state_descr line -_arguments -C \ - '-v[verbose mode (generate verbose messages)]' \ - '-d[debug mode (generate debugging messages)]' \ - '-q[quiet mode (suppress messages)]' \ - '-D[specify portdir]' \ - '-k[keep mode (do not autoclean after install)]' \ - '-n[dont follow dependencies in upgrade (only for upgrading)]' \ - '-a[upgrade all installed ports (only for upgrading)]' \ - '-u[uninstall non-active ports when upgrading and uninstalling]' \ - '-f[force mode (ignore state file)]' \ - '-s[source-only mode]' \ - '-b[binary-only mode]' \ - '-o[honor state files older than Portfile]' \ - '*::command:->command' \ - && return 0 + local actions pseudo_common pseudo_advanced select_options port_prefix -case "$state" in - (command) - if (( CURRENT == 1 )); then - state='subcommands' - else - state='portname' - fi - ;; -esac + port_prefix=$(which port | sed 's|/bin/port||') -case "$state" in - (subcommands) - _describe -t commands 'port commands' subcmds - ;; - (portname) - # Cache the list of ports. - if (( ! $+_port_list )); then - _port_list=($(port echo all; echo "all current active inactive installed uninstalled outdated")) - fi + actions=( activate archive archivefetch build cat cd + checksum clean configure contents deactivate dependents deps + destroot dir distcheck distfiles dmg dpkg echo edit exit + extract fetch file gohome help info install installed lint list + livecheck load location log logfile mdmg mirror mpkg notes + outdated patch pkg platform portpkg provides quit rdependents + rdeps rev-upgrade rpm search select selfupdate setrequested space + srpm submit sync test unarchive uninstall unload unsetrequested + upgrade url usage variants version work ) - _describe -t commands 'available ports' _port_list - ;; -esac + pseudo_common=(all current active inactive actinact installed uninstalled outdated + obsolete requested unrequested leaves) + + pseudo_advanced=('variants:' 'variant:' 'description:' 'depends:' + 'depends_lib:' 'depends_run:' 'depends_build:' 'depends_fetch:' 'depends_extract:' + 'portdir:' 'homepage:' 'epoch:' 'platforms:' 'platform:' 'name:' 'long_description:' + 'maintainers:' 'maintainer:' 'categories:' 'category:' 'version:' 'revision:' 'license:') + + select_options=( + '--list:List available versions for the group' + '--set:Select the given version for the group' + '--show:Show which version is currently selected for the group \(default if none given\)' + ) + + _arguments -s -C \ + '-v[verbose mode (generate verbose messages)]' \ + '-d[debug mode (generate debugging messages, implies -v)]' \ + '-q[quiet mode (suppress messages)]' \ + "-n[don't upgrade dependencies (affects upgrade and install)]" \ + "-R[also upgrade dependents (only affects upgrade) - note that this does not upgrade dependents' dependencies]" \ + '-u[uninstall non-active ports when upgrading and uninstalling]' \ + '-f[force mode (ignore state file)]' \ + '-o[honor state files even if the Portfile has been modified since (called -o because it used to mean "older")]' \ + '-s[source-only mode (build and install from source, do not attempt to fetch binary archives)]' \ + '-b[binary-only mode (build and install from binary archives, ignore source, abort if no archive available)]' \ + '-c[autoclean mode (execute clean after install)]' \ + "-k[keep mode (don't autoclean after install)]" \ + '-D[specify portdir]' \ + '-F[Read and process the file of commands specified by the argument.]' \ + '-p[Despite any errors encountered, proceed to process multiple ports and commands.]' \ + '-y[Perform a dry run.]' \ + '-t[enable trace mode debug facilities on platforms that support it (Mac OS X).]' \ + "1:Port actions:($actions)" \ + '*:extra:->extra' \ + && return 0 + + case "$state" in + extra) + case "$words[2]" in + provides) + _files + ;; + search) + _guard '^--*' 'pattern' + ;; + help) + _describe -t actions 'Port actions' actions + ;; + select) + _call_function - _port_select + ;; + contents|deactivate|setrequested|space|uninstall|unsetrequested) + # Cache the list of all ports. + if (( ! $+_installed_ports )); then + _installed_ports=$(_call_program path-installed "port installed | cut -d ' ' -f 3") + fi + _alternative \ + "ports:Installed ports:($_installed_ports)" \ + "pseudo-common:Common Pseudo-portnames:($pseudo_common)" \ + "pseudo-advanced:Advanced Pseudo-portnames:($pseudo_advanced)" + ;; + *) + # Cache the list of all ports. + if (( ! $+_all_ports )); then + _all_ports=$(_call_program path-all "port echo all") + fi + _alternative \ + "ports:Available ports:($_all_ports)" \ + "pseudo-common:Common Pseudo-portnames:($pseudo_common)" \ + "pseudo-advanced:Advanced Pseudo-portnames:($pseudo_advanced)" + ;; + esac + ;; + esac +} + +_port "$@"