diff options
author | Paul Ackersviller <packersv@users.sourceforge.net> | 2007-04-12 03:50:37 +0000 |
---|---|---|
committer | Paul Ackersviller <packersv@users.sourceforge.net> | 2007-04-12 03:50:37 +0000 |
commit | 87178a3e3a2a750697660ca9b0d49a67ebf638f4 (patch) | |
tree | 8e468c7a10813e329f7477d860dd4d0bc8139eb7 /Completion/Debian | |
parent | bf005f931e198c910156c272f13fc04ec2e2852e (diff) | |
download | zsh-87178a3e3a2a750697660ca9b0d49a67ebf638f4.tar.gz zsh-87178a3e3a2a750697660ca9b0d49a67ebf638f4.tar.xz zsh-87178a3e3a2a750697660ca9b0d49a67ebf638f4.zip |
Merge from trunk of workers/21168.
Diffstat (limited to 'Completion/Debian')
-rw-r--r-- | Completion/Debian/Type/_deb_packages | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/Completion/Debian/Type/_deb_packages b/Completion/Debian/Type/_deb_packages new file mode 100644 index 000000000..090c9c6b6 --- /dev/null +++ b/Completion/Debian/Type/_deb_packages @@ -0,0 +1,120 @@ +#autoload + +# Usage: _deb_packages expl... avail|installed|uninstalled + +_deb_packages_update_avail () { + if ( [[ ${+_deb_packages_cache_avail} -eq 0 ]] || + _cache_invalid DEBS_avail ) && ! _retrieve_cache DEBS_avail; + then + _deb_packages_cache_avail=( + ${(f)"$(apt-cache --generate pkgnames)"} + ) + + _store_cache DEBS_avail _deb_packages_cache_avail + fi + cachevar=_deb_packages_cache_avail +} + +_deb_packages_update_installed () { + if ( [[ ${+_deb_packages_cache_installed} -eq 0 ]] || + _cache_invalid DEBS_installed ) && ! _retrieve_cache DEBS_installed; + then + _deb_packages_cache_installed=() + dpkg --get-selections | while read package state ; do + [[ $state = (install|hold) ]] && _deb_packages_cache_installed+=$package + done + _store_cache DEBS_installed _deb_packages_cache_installed + fi + cachevar=_deb_packages_cache_installed +} + +_deb_packages_update_held () { + if ( [[ ${+_deb_packages_cache_held} -eq 0 ]] || + _cache_invalid DEBS_held ) && ! _retrieve_cache DEBS_held; + then + _deb_packages_cache_held=() + dpkg --get-selections | while read package state ; do + [[ $state = hold ]] && _deb_packages_cache_held+=$package + done + _store_cache DEBS_held _deb_packages_cache_held + fi + cachevar=_deb_packages_cache_held +} + +_deb_packages_update_deinstalled () { + if ( [[ ${+_deb_packages_cache_deinstalled} -eq 0 ]] || + _cache_invalid DEBS_deinstalled ) && ! _retrieve_cache DEBS_deinstalled; + then + _deb_packages_cache_deinstalled=() + dpkg --get-selections | while read package state ; do + [[ $state = deinstall ]] && _deb_packages_cache_deinstalled+=$package + done + _store_cache DEBS_deinstalled _deb_packages_cache_deinstalled + fi + cachevar=_deb_packages_cache_deinstalled +} + +_deb_packages_update_xinstalled () { + if ( [[ ${+_deb_packages_cache_xinstalled} -eq 0 ]] || + _cache_invalid DEBS_xinstalled ) && ! _retrieve_cache DEBS_xinstalled; + then + _deb_packages_cache_xinstalled=() + dpkg --get-selections | while read package state ; do + _deb_packages_cache_xinstalled+=$package + done + _store_cache DEBS_xinstalled _deb_packages_cache_xinstalled + fi + cachevar=_deb_packages_cache_xinstalled +} + +_deb_packages_update_uninstalled () { + _deb_packages_update_avail + _deb_packages_update_installed + if (( ! $+_deb_packages_cache_uninstalled )); then + _deb_packages_cache_uninstalled=( + ${_deb_packages_cache_avail:#${(j:|:)~${_deb_packages_cache_installed:q}}} + ) + fi + cachevar=_deb_packages_cache_uninstalled +} + +_deb_packages () { + local command="$argv[$#]" expl cachevar pkgset update_policy + + zstyle -s ":completion:*:*:$service:*" cache-policy update_policy + if [[ -z "$update_policy" ]]; then + zstyle ":completion:*:*:$service:*" cache-policy _debs_caching_policy + fi + + [[ "$command" = (installed|deinstalled|xinstalled|held|uninstalled|avail|available) ]] || { + _message "unknown command: $command" + return + } + + zstyle -s ":completion:${curcontext}:" packageset pkgset + + [[ "$pkgset" = (installed|deinstalled|xinstalled|held|uninstalled|avail|available) ]] || { + pkgset="$command" + } + + [[ "$pkgset" = "available" ]] && pkgset="avail" + + expl=("${(@)argv[1,-2]}") + + _deb_packages_update_$pkgset + + typeset -gH $cachevar + + _tags packages && compadd "$expl[@]" - "${(@P)cachevar}" +} + + _debs_caching_policy () { + # rebuild if cache is more than a week old + oldp=( "$1"(mw+1) ) + (( $#oldp )) && return 0 + + [[ /var/cache/apt/pkgcache.bin -nt "$1" || + /var/lib/dpkg/available -nt "$1" ]] + } + +_deb_packages "$@" |