zsh-workers
 help / color / mirror / code / Atom feed
ae7796837aa57d9249d448cdd90944ceaa833426 blob 4027 bytes (raw)

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
 
#autoload

# Usage: _deb_packages expl...  (installed|deinstalled|xinstalled|held|uninstalled|avail|available|source)

_deb_packages_update_avail () {
  cachevar=_cache_deb_packages_avail
  if (( ! $+_cache_deb_packages_avail[1] )) &&
      { _cache_invalid debs-avail || ! _retrieve_cache debs-avail }
  then
    _cache_deb_packages_avail=(
      ${(f)"$(_call_program packages apt-cache --generate pkgnames)"}
    )
    _store_cache debs-avail $cachevar
  fi
}

_deb_packages_update_installed () {
  cachevar=_cache_deb_packages_installed
  if (( ! $+_cache_deb_packages_installed[1] )) &&
      { _cache_invalid debs-installed || ! _retrieve_cache debs-installed }
  then
    _cache_deb_packages_installed=(
      ${${(M)${(f)"$(_call_program packages dpkg --get-selections)"}:#*([^e]install|hold)}%%[[:blank:]]*}
    )
    _store_cache debs-installed $cachevar
  fi
}

_deb_packages_update_held () {
  cachevar=_cache_deb_packages_held
  if (( ! $+_cache_deb_packages_held[1] )) && { _cache_invalid debs-held ||
      ! _retrieve_cache debs-held }
  then
    _cache_deb_packages_held=(
      ${${(M)${(f)"$(_call_program packages dpkg --get-selections)"}:#*hold}%%[[:blank:]]*}
    )
    _store_cache debs-held $cachevar
  fi
}

_deb_packages_update_deinstalled () {
  cachevar=_cache_deb_packages_deinstalled
  if (( ! $+_cache_deb_packages_deinstalled[1] )) &&
      { _cache_invalid debs-deinstalled || ! _retrieve_cache debs-deinstalled }
  then
    _cache_deb_packages_deinstalled=(
      ${${(M)${(f)"$(_call_program packages dpkg --get-selections)"}:#*deinstalled}%%[[:blank:]]*}
    )
    _store_cache debs-deinstalled $cachevar
  fi
}

_deb_packages_update_xinstalled () {
  cachevar=_cache_deb_packages_xinstalled
  if (( ! $+_cache_deb_packages_xinstalled[1] )) &&
      { _cache_invalid debs-xinstalled || ! _retrieve_cache debs-xinstalled }
  then
    _cache_deb_packages_xinstalled=(
      ${${(f)"$(_call_program packages dpkg --get-selections)"}%%[[:blank:]]*}
    )
    _store_cache debs-xinstalled $cachevar
  fi
}

_deb_packages_update_uninstalled () {
  if (( ! $+_cache_deb_packages_uninstalled )); then
    _deb_packages_update_avail
    _deb_packages_update_installed
    _cache_deb_packages_uninstalled=(
      ${_cache_deb_packages_avail:|_cache_deb_packages_installed}
    )
  fi
  cachevar=_cache_deb_packages_uninstalled
}

_deb_packages_update_source () {
  cachevar=_cache_deb_packages_source
  if (( ! $+_cache_deb_packages_source[1] )) &&
      { _cache_invalid debs-source || ! _retrieve_cache debs-source }
  then
    _cache_deb_packages_source=(
      # requires apt >= 1.1.8
      # if dpkg --compare-versions "$(dpkg-query --show --showformat '${Version}\n' apt)" '>=' '1.1.8' ; then ...; else ...; fi
      ${(f)"$(/usr/lib/apt/apt-helper cat-file $(apt-get indextargets --format '$(FILENAME)' 'Created-By: Sources' 2>/dev/null) 2>/dev/null | sed -ne 's/^Package: //p' | uniq)"}
    )

    _store_cache debs-source $cachevar
  fi
}

_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|source) ]] || {
    _message "unknown command: $command"
    return
  }

  zstyle -s ":completion:${curcontext}:" packageset pkgset

  [[ "$pkgset" = (installed|deinstalled|xinstalled|held|uninstalled|avail|available|source) ]] || {
    pkgset="$command"
  }

  [[ "$pkgset" = "available" ]] && pkgset="avail"

  expl=("${(@)argv[1,-2]}")

  _deb_packages_update_$pkgset

  typeset -gH $cachevar

  _tags packages && compadd "$expl[@]" -a - $cachevar
}

_debs_caching_policy () {
  # rebuild if cache is more than a week old
  local -a oldp
  oldp=( "$1"(mw+1) )
  (( $#oldp )) && return 0

  [[ /var/cache/apt/pkgcache.bin -nt "$1" ||
     /var/lib/dpkg/available -nt "$1" ]]
}

_deb_packages "$@"
debug log:

solving ae77968 ...
found ae77968 in https://inbox.vuxu.org/zsh-workers/6472.1481623850@hydra.kiddle.eu/
found bdc0cb0 in https://git.vuxu.org/mirror/zsh/
preparing index
index prepared:
100644 bdc0cb00c079aa5918215447b54c1939a1435026	Completion/Debian/Type/_deb_packages

applying [1/1] https://inbox.vuxu.org/zsh-workers/6472.1481623850@hydra.kiddle.eu/
diff --git a/Completion/Debian/Type/_deb_packages b/Completion/Debian/Type/_deb_packages
index bdc0cb0..ae77968 100644

Checking patch Completion/Debian/Type/_deb_packages...
Applied patch Completion/Debian/Type/_deb_packages cleanly.

index at:
100644 ae7796837aa57d9249d448cdd90944ceaa833426	Completion/Debian/Type/_deb_packages

Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).