Merge pull request #240 from g5pw/master

_port completion enhancement
This commit is contained in:
nicoulaj 2014-07-16 21:58:23 +02:00
commit d124d0f097
1 changed files with 121 additions and 47 deletions

168
src/_port
View File

@ -16,23 +16,79 @@
# ------------------------------------------------------------------------------
_port() {
# Variables for _argument
typeset -A opt_args
local context state state_descr line
local actions pseudo_common pseudo_advanced select_options port_prefix
local -a upgrade_options revupgrade_options select_options \
actions pseudo_common pseudo_advanced port_prefix
port_prefix=$(which port | sed 's|/bin/port||')
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 )
actions=(
'activate\:Activate\ the\ given\ ports'
'archive\:Archive\ the\ given\ ports,\ i.e.\ install\ the\ port\ image\ but\ do\ not\ activate'
'archivefetch\:Fetch\ archive\ for\ the\ given\ ports'
'build\:Build\ the\ given\ ports'
'cat\:Writes\ the\ Portfiles\ of\ the\ given\ ports\ to\ stdout'
'checksum\:Compares\ the\ checksums\ for\ the\ downloaded\ files\ of\ the\ given\ ports'
'clean\:Removes\ files\ associated\ with\ the\ given\ ports'
'configure\:Configure\ the\ given\ ports'
'contents\:\Returns\ a\ list\ of\ files\ installed\ by\ given\ ports'
'deactivate\:Deactivates\ the\ given\ ports'
'dependents\:Returns\ a\ list\ of\ installed\ dependents\ for\ each\ of\ the\ given\ ports'
'deps\:Display\ a\ dependency\ listing\ for\ the\ given\ ports'
'destroot\:Destroot\ the\ given\ ports'
'dir\:Returns\ the\ directories\ of\ the\ given\ ports'
'distcheck\:Checks\ if\ the\ given\ ports\ can\ be\ fetched\ from\ all\ of\ its\ master_sites'
'distfiles\:Returns\ a\ list\ of\ distfiles\ for\ the\ given\ port'
'dmg\:Creates\ a\ dmg\ for\ each\ of\ the\ given\ ports'
'dpkg\:Creates\ a\ dpkg\ for\ each\ of\ the\ given\ ports'
'echo\:Returns\ the\ list\ of\ ports\ the\ argument\ expands\ to'
'edit\:Edit\ given\ ports'
'extract\:Extract\ the\ downloaded\ files\ of\ the\ given\ ports'
'fetch\:Downloaded\ distfiles\ for\ the\ given\ ports'
'file\:Returns\ the\ path\ to\ the\ Portfile\ for\ each\ of\ the\ given\ ports'
'gohome\:Opens\ the\ homepages\ of\ the\ given\ ports\ in\ your\ browser'
'help\:Displays\ short\ help\ texts\ for\ the\ given\ actions'
'info\:Returns\ information\ about\ the\ given\ ports '
'install\:Installs\ the\ given\ ports'
'installed\:List\ installed\ versions\ of\ the\ given\ port,\ or\ all\ installed\ ports\ if\ no\ port\ is\ given'
'lint\:Checks\ if\ the\ Portfile\ is\ lint-free\ for\ each\ of\ the\ given\ ports'
'list\:List\ the\ available\ version\ for\ each\ of\ the\ given\ ports'
'livecheck\:Checks\ if\ a\ new\ version\ of\ the\ software\ is\ available'
'load\:Interface\ to\ launchctl(1)\ for\ ports\ providing\ startup\ items'
'location\:Returns\ the\ install\ location\ for\ each\ of\ the\ given\ ports'
'log\:Shows\ main\ log\ for\ given\ ports'
'logfile\:Returns\ the\ log\ file\ path\ for\ each\ of\ the\ given\ ports'
'mdmg\:Creates\ a\ dmg\ containing\ an\ mpkg\ for\ each\ of\ the\ given\ ports\ and\ their\ dependencies'
'mirror\:Fetches\ distfiles\ for\ the\ given\ ports'
'mpkg\:Creates\ an\ mpkg\ for\ each\ of\ the\ given\ ports\ and\ their\ dependencies'
'notes\:Displays\ informational\ notes\ for\ each\ of\ the\ given\ ports'
'outdated\:Returns\ a\ list\ of\ outdated\ ports'
'patch\:Applies\ patches\ to\ each\ of\ the\ given\ ports'
'pkg\:Creates\ a\ pkg\ for\ each\ of\ the\ given\ ports'
'platform\:Returns\ the\ current\ platform\ that\ port\ is\ running\ on'
'provides\:Return\ which\ port\ provides\ each\ of\ the\ files\ given'
'rdependents\:Recursive\ version\ of\ dependents'
'rdeps\:Display\ a\ recursive\ dependency\ listing\ for\ the\ given\ ports'
'rev-upgrade\:Scan\ for\ broken\ binaries\ in\ the\ installed\ ports\ and\ rebuild\ them\ as\ needed'
'rpm\:Creates\ a\ rpm\ for\ each\ of\ the\ given\ ports'
'search\:Search\ for\ a\ port'
'select\:Select\ between\ multiple\ versions\ of\ a\ versioned\ port'
'selfupdate\:Upgrade\ MacPorts\ itself\ and\ run\ the\ sync\ target'
'setrequested\:Marks\ each\ of\ the\ given\ ports\ as\ requested'
'space\:Show\ the\ disk\ space\ used\ by\ the\ given\ ports'
'srpm\:Creates\ a\ srpm\ for\ each\ of\ the\ given\ ports'
'sync\:Synchronize\ the\ set\ of\ Portfiles'
'test\:Run\ tests\ on\ each\ of\ the\ given\ ports'
'unarchive\:Unarchive\ the\ destroot\ of\ the\ given\ ports\ from\ installed\ images'
'uninstall\:Uninstall\ the\ given\ ports'
'unload\:Interface\ to\ launchctl(1)\ for\ ports\ providing\ startup\ items'
'unsetrequested\:Marks\ each\ of\ the\ given\ ports\ as\ unrequested'
'upgrade\:Upgrades\ the\ given\ ports\ to\ the\ latest\ version'
'url\:Returns\ the\ URL\ for\ each\ of\ the\ given\ ports'
'usage\:Returns\ basic\ usage\ of\ the\ port\ command'
'variants\:Returns\ a\ list\ of\ variants\ provided\ by\ the\ given\ ports,\ with\ descriptions\ if\ present'
'version\:Returns\ the\ version\ of\ MacPorts'
'work\:Returns\ the\ path\ to\ the\ work\ directory\ for\ each\ of\ the\ given\ ports'
)
pseudo_common=(all current active inactive actinact installed uninstalled outdated
obsolete requested unrequested leaves)
@ -50,42 +106,40 @@ _port() {
revupgrade_options=('--id-loadcmd-check:Run more checks against a special loadcommand in Mach-O binaries')
local cache_policy
zstyle -s ":completion:${curcontext}:" cache-policy cache_policy
if [[ -z "$cache_policy" ]]; then
zstyle ":completion:${curcontext}:" cache-policy _port_caching_policy
fi
upgrade_options=(
'--force\:Ignore\ circumstances\ that\ would\ normally\ cause\ ports\ to\ be\ skipped\ \(e.g.\ not\ outdated\).' \
'--enforce-variants\:If\ the\ installed\ variants\ do\ not\ match\ those\ requested,\ upgrade\ even\ if\ the\ port\ is\ not\ outdated.' \
'--no-replace\:Do\ not\ replace\ one\ port\ with\ another\ according\ to\ the\ replaced_by\ field.' \
)
_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]' \
'-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' \
'-t[Enable trace mode debug facilities on platforms that support it (Mac OS X).]' \
"1:Port actions:(($actions))" \
'::Per-action arguments:_port_dispatch' \
&& return 0
case "$state" in
extra)
_port_dispatch
;;
esac
}
_port_dispatch() {
local cache_policy
zstyle -s ":completion:${curcontext}:" cache-policy cache_policy
zstyle ":completion:${curcontext}:" cache-policy ${cache_policy:-_port_caching_policy}
case "$words[2]" in
provides)
_files
@ -104,7 +158,7 @@ _port_dispatch() {
if ( [[ ${+_port_installed_packages} -eq 0 ]] || _cache_invalid PORT_INSTALLED_PACKAGES ) &&
! _retrieve_cache PORT_INSTALLED_PACKAGES;
then
_port_installed_packages=( $(_call_program path-all "port echo all") )
_port_installed_packages=( $(_call_program path-all "port -q echo installed") )
_store_cache PORT_INSTALLED_PACKAGES _port_installed_packages
fi
_alternative \
@ -113,21 +167,33 @@ _port_dispatch() {
"pseudo-advanced:Advanced Pseudo-portnames:($pseudo_advanced)"
;;
upgrade)
# No good reason to actually cache outdated ports list
local outdated_packages
outdated_packages=("${(f)$(port outdated | sed -e '1 d' -e 's/^\([[:graph:]]*\).*/\1/')}")
_describe "Outdated ports" outdated_packages
outdated_packages=( $(_call_program path-outdated "port -q echo outdated") )
_alternative -- \
"upgrade-options:Upgrade options:(($upgrade_options))" \
"ports:Outdated ports:($outdated_packages)" \
"pseudo-common:Common Pseudo-portnames:($pseudo_common)" \
"pseudo-advanced:Advanced Pseudo-portnames:($pseudo_advanced)"
;;
rev-upgrade)
if (( CURRENT == 3 )); then
_describe 'Rev-upgrade options' revupgrade_options
fi
;;
outdated|sync)
# No need to complete anything more here.
return 0;
;;
selfupdate)
_all_labels 'Selfupdate options' '--nosync'
;;
*)
# Cache the list of all ports.
if ( [[ ${+_port_available_packages} -eq 0 ]] || _cache_invalid PORT_AVAILABLE_PACKAGES ) &&
! _retrieve_cache PORT_AVAILABLE_PACKAGES;
then
_port_available_packages=( $(_call_program path-all "port echo all") )
_port_available_packages=( $(_call_program path-all "port -q echo all") )
_store_cache PORT_AVAILABLE_PACKAGES _port_available_packages
fi
_alternative \
@ -156,8 +222,16 @@ _port_select() {
}
_port_caching_policy() {
local reg_time comp_time
reg_time=$(stat -c '%Z' $port_prefix/var/macports/registry/registry.db)
local reg_time comp_time check_file
case "${1##*/}" in
PORT_INSTALLED_PACKAGES)
check_file=$port_prefix/var/macports/registry/registry.db
;;
PORT_AVAILABLE_PACKAGES)
check_file=${$(port dir MacPorts)%/*/*}/PortIndex
;;
esac
reg_time=$(stat -c '%Z' $check_file)
comp_time=$(stat -c '%Z' $1)
return $(( reg_time < comp_time ))
}