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 "$@"
|