Hello, I would like to add apt4rpm support to _apt completion. The first step is to introduce Completion/Redhat/Type/_rpm_packages (attached) tailored after Completion/Debian/Type/_deb_packages. Except massive s/deb/rpm/ substitutions, difference is as follows: --- zsh-4.2.4/Completion/Redhat/Type/_rpm_packages- 2005-01-09 09:34:11 +0300 +++ zsh-4.2.4/Completion/Redhat/Type/_rpm_packages 2005-03-11 12:30:53 +0300 @@ -19,10 +19,9 @@ _rpm_packages_update_installed () { if ( [[ ${+_rpm_packages_cache_installed} -eq 0 ]] || _cache_invalid RPMS_installed ) && ! _retrieve_cache RPMS_installed; then - _rpm_packages_cache_installed=() - dpkg --get-selections | while read package state ; do - [[ $state = (install|hold) ]] && _rpm_packages_cache_installed+=$package - done + _rpm_packages_cache_installed=( + ${(f)"$(rpm -qa --qf '%{NAME}\n')"} + ) _store_cache RPMS_installed _rpm_packages_cache_installed fi cachevar=_rpm_packages_cache_installed @@ -106,13 +105,23 @@ _rpm_packages () { _tags packages && compadd "$expl[@]" - "${(@P)cachevar}" } - _rpms_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" ]] - } +_rpms_caching_policy () { + local cache_path="$1" cache_id="${_cache_ident:-${1##*/}}" + + # rebuild if cache is more than a week old + oldp=( "$cache_path"(mw+1) ) + (( $#oldp )) && return 0 + + if [[ $cache_id = RPMS_installed ]]; then + pkg_indices=( /var/lib/rpm/{packages.rpm,Packages}(N) ) + else + pkg_indices=( /var/lib/apt/lists/*list*(.N) ) + fi + + for pkg_index in $pkg_indices; do + [[ "$pkg_index" -nt "$cache_path" ]] && return 0 + done + return 1 +} _rpm_packages "$@" End of patch This has a few tricks: 1) _cache_ident variable (found in _retrieve_cache) is used to determine which cache is being checked for invalidation; 2) for installed RPM packages, cache invalidation is checked against RPM database; 3) for packages which are not installed, cache invalidation is checked against APT source repository files. This is different from original check against /var/cache/apt/pkgcache.bin -- this file gets rebuilt on every apt-cache invocation. I also noticed that in recent zsh versions additional support for held and deinstalled packages was added to _deb_packages, but since RPM has no simple notion of held/deinstalled packages, those functions are left intact for now. Please comment. -- Alexey Tourbin ALT Linux Team
#autoload # Usage: _rpm_packages expl... avail|installed|uninstalled _rpm_packages_update_avail () { if ( [[ ${+_rpm_packages_cache_avail} -eq 0 ]] || _cache_invalid RPMS_avail ) && ! _retrieve_cache RPMS_avail; then _rpm_packages_cache_avail=( ${(f)"$(apt-cache --generate pkgnames)"} ) _store_cache RPMS_avail _rpm_packages_cache_avail fi cachevar=_rpm_packages_cache_avail } _rpm_packages_update_installed () { if ( [[ ${+_rpm_packages_cache_installed} -eq 0 ]] || _cache_invalid RPMS_installed ) && ! _retrieve_cache RPMS_installed; then _rpm_packages_cache_installed=( ${(f)"$(rpm -qa --qf '%{NAME}\n')"} ) _store_cache RPMS_installed _rpm_packages_cache_installed fi cachevar=_rpm_packages_cache_installed } _rpm_packages_update_held () { if ( [[ ${+_rpm_packages_cache_held} -eq 0 ]] || _cache_invalid RPMS_held ) && ! _retrieve_cache RPMS_held; then _rpm_packages_cache_held=() dpkg --get-selections | while read package state ; do [[ $state = hold ]] && _rpm_packages_cache_held+=$package done _store_cache RPMS_held _rpm_packages_cache_held fi cachevar=_rpm_packages_cache_held } _rpm_packages_update_deinstalled () { if ( [[ ${+_rpm_packages_cache_deinstalled} -eq 0 ]] || _cache_invalid RPMS_deinstalled ) && ! _retrieve_cache RPMS_deinstalled; then _rpm_packages_cache_deinstalled=() dpkg --get-selections | while read package state ; do [[ $state = deinstall ]] && _rpm_packages_cache_deinstalled+=$package done _store_cache RPMS_deinstalled _rpm_packages_cache_deinstalled fi cachevar=_rpm_packages_cache_deinstalled } _rpm_packages_update_xinstalled () { if ( [[ ${+_rpm_packages_cache_xinstalled} -eq 0 ]] || _cache_invalid RPMS_xinstalled ) && ! _retrieve_cache RPMS_xinstalled; then _rpm_packages_cache_xinstalled=() dpkg --get-selections | while read package state ; do _rpm_packages_cache_xinstalled+=$package done _store_cache RPMS_xinstalled _rpm_packages_cache_xinstalled fi cachevar=_rpm_packages_cache_xinstalled } _rpm_packages_update_uninstalled () { _rpm_packages_update_avail _rpm_packages_update_installed if (( ! $+_rpm_packages_cache_uninstalled )); then _rpm_packages_cache_uninstalled=( ${_rpm_packages_cache_avail:#${(j:|:)~${_rpm_packages_cache_installed:q}}} ) fi cachevar=_rpm_packages_cache_uninstalled } _rpm_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 _rpms_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]}") _rpm_packages_update_$pkgset _tags packages && compadd "$expl[@]" - "${(@P)cachevar}" } _rpms_caching_policy () { local cache_path="$1" cache_id="${_cache_ident:-${1##*/}}" # rebuild if cache is more than a week old oldp=( "$cache_path"(mw+1) ) (( $#oldp )) && return 0 if [[ $cache_id = RPMS_installed ]]; then pkg_indices=( /var/lib/rpm/{packages.rpm,Packages}(N) ) else pkg_indices=( /var/lib/apt/lists/*list*(.N) ) fi for pkg_index in $pkg_indices; do [[ "$pkg_index" -nt "$cache_path" ]] && return 0 done return 1 } _rpm_packages "$@"
Attachment:
pgpbvsYmnLYS5.pgp
Description: PGP signature