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.
This commit is contained in:
Aljaž "g5pw" Srebrnič 2013-03-20 08:22:38 +01:00
parent 19e8985f8e
commit 6483c0c3a1
1 changed files with 109 additions and 81 deletions

190
src/_port
View File

@ -11,92 +11,120 @@
# #
# * Matt Cable <wozz@wookie.net> # * Matt Cable <wozz@wookie.net>
# * Sorin Ionescu <sorin.ionescu@gmail.com> # * Sorin Ionescu <sorin.ionescu@gmail.com>
# * Aljaž Srebrnič <a2piratesoft@gmail.com>
# #
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
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=( _port() {
'activate' # Variables for _argument
'archive' typeset -A opt_args
'build' local context state state_descr line
'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'
)
_arguments -C \ local actions pseudo_common pseudo_advanced select_options port_prefix
'-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
case "$state" in port_prefix=$(which port | sed 's|/bin/port||')
(command)
if (( CURRENT == 1 )); then
state='subcommands'
else
state='portname'
fi
;;
esac
case "$state" in actions=( activate archive archivefetch build cat cd
(subcommands) checksum clean configure contents deactivate dependents deps
_describe -t commands 'port commands' subcmds destroot dir distcheck distfiles dmg dpkg echo edit exit
;; extract fetch file gohome help info install installed lint list
(portname) livecheck load location log logfile mdmg mirror mpkg notes
# Cache the list of ports. outdated patch pkg platform portpkg provides quit rdependents
if (( ! $+_port_list )); then rdeps rev-upgrade rpm search select selfupdate setrequested space
_port_list=($(port echo all; echo "all current active inactive installed uninstalled outdated")) srpm submit sync test unarchive uninstall unload unsetrequested
fi upgrade url usage variants version work )
_describe -t commands 'available ports' _port_list pseudo_common=(all current active inactive actinact installed uninstalled outdated
;; obsolete requested unrequested leaves)
esac
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 "$@"