aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/_gentoo_packages')
-rw-r--r--src/_gentoo_packages309
1 files changed, 309 insertions, 0 deletions
diff --git a/src/_gentoo_packages b/src/_gentoo_packages
new file mode 100644
index 0000000..9a747b7
--- /dev/null
+++ b/src/_gentoo_packages
@@ -0,0 +1,309 @@
+#autoload
+
+setopt extendedglob bareglobqual
+#Description:
+# functions for gentoo packages
+# inspired by _deb_packages
+#Usage: _gentoo_packages installed|available|installed_versions|available_versions|binary|category|useflag
+
+
+_portdir() {
+ local mainreponame mainrepopath overlayname overlaypath
+
+ if [[ -e /usr/share/portage/config/repos.conf ]]; then
+ if [[ ${1} == -o ]]; then
+ for overlayname in $(_parsereposconf -l); do
+ overlaypath+=($(_parsereposconf ${overlayname} location))
+ done
+
+ source /etc/make.conf 2>/dev/null
+ source /etc/portage/make.conf 2>/dev/null
+
+ overlaypath+=(${(@)PORTDIR_OVERLAY})
+
+ echo "${(@u)overlaypath}"
+ else
+ mainreponame=$(_parsereposconf DEFAULT main-repo)
+ mainrepopath=$(_parsereposconf ${mainreponame} location)
+
+ echo "${mainrepopath}"
+ fi
+ else
+ source /usr/share/portage/config/make.globals 2>/dev/null
+ source /etc/make.conf 2>/dev/null
+ source /etc/portage/make.conf 2>/dev/null
+
+ if [[ "-o" == ${1} ]]; then
+ echo "${(@u)PORTDIR_OVERLAY}"
+ else
+ echo "${PORTDIR}"
+ fi
+ fi
+}
+
+_parsereposconf() {
+ local v f insection section arr;
+
+ for f in /usr/share/portage/config/repos.conf \
+ /etc/portage/repos.conf \
+ /etc/portage/repos.conf/*.conf; do
+
+ [[ -f ${f} ]] || continue
+ insection=0;
+ declare -A arr;
+ IFS='= ';
+
+ while read -r name value; do
+ [[ -z ${name} || ${name} == '#'* ]] && continue
+
+ if [[ (${name} == '['*']') && (-z ${value}) ]]; then
+ value=${name//(\]|\[)};
+ name="section";
+ fi;
+ arr[${name}]=${value};
+
+ if [[ ${insection} == 1 && ${name} == "section" ]]; then
+ break
+ elif [[ ${name} == "section" ]]; then
+ [[ ${value} == ${1} ]] && insection=1
+ secname+=(${value})
+ elif [[ ${insection} == 1 ]]; then
+ if [[ ${name} == ${2} ]]; then
+ v=${value};
+ fi
+ fi
+ continue
+ done < ${f}
+ done
+
+ if [[ "-l" == ${1} ]]; then
+ echo "${(@)secname}"
+ else
+ echo "${v}"
+ fi
+}
+
+_parsesetsconf() {
+ [[ -d ${1} ]] || continue
+
+ local v f places sections setsconf insection section arr;
+
+ if [[ -d ${1}/sets ]]; then
+ setsconf=(${1}/sets/*.conf(N));
+ [[ (($#setsconf > 0)) ]] && places=(${setsconf})
+ elif [[ -f ${1}/sets.conf ]]; then
+ places=(${1}/sets.conf)
+ fi
+
+ for f in ${(@)places}; do
+ if [[ -r ${f} ]]; then
+ insection=0;
+ declare -A arr;
+ IFS='= ';
+ while read -r name value; do
+ [[ -z ${name} || ${name} == '#'* ]] && continue
+
+ if [[ (${name} == '['*']') && (-z ${value}) ]]; then
+ value=${name//(\]|\[)};
+ name="section";
+ fi;
+ arr[${name}]=${value};
+
+ if [[ ${insection} == 1 && ${name} == "section" ]]; then
+ [[ "sets" == ${2} ]] && [[ ! ${value} =~ "sets" ]] && sections+=(${value})
+ insection=0;
+ elif [[ ${name} == "section" ]]; then
+ [[ ${value} =~ "${1:t} sets" ]] && insection=1
+ [[ "sets" == ${2} ]] && [[ ! ${value} =~ "sets" ]] && sections+=(${value})
+ elif [[ ${insection} == 1 ]]; then
+ [[ "sets" == ${2} ]] && continue
+ if [[ ${name} == "directory" ]]; then
+ v=${value};
+ fi
+ fi
+ continue
+ done < ${f}
+ fi
+ done
+
+ if [[ "sets" == ${2} ]]; then
+ [[ ((${#sections} > 0)) ]] && echo ${(@)sections}
+ else
+ [[ ((${#v} > 0)) ]] && echo ${v:t};
+ fi
+}
+
+_gentoo_packages_update_installed_sets() {
+ local sets;
+ sets=($(</var/lib/portage/world_sets));
+ if [[ ((${#sets} > 0)) ]]; then
+ _wanted installed_sets expl 'installed set' compadd "$@" "${(o@)^sets}"
+ fi
+}
+
+_gentoo_packages_update_available_sets() {
+ trees=($(_portdir -o) /etc/portage /usr/share/portage/config)
+ for PORTDIR in ${(@)trees}; do
+ if [[ -d ${PORTDIR} ]]; then
+ setsdir="$(_parsesetsconf ${PORTDIR})"
+ [[ ! -z "${setsdir}" ]] && setspath="${PORTDIR}/${setsdir}" || setspath="${PORTDIR}/sets"
+ if [[ -d "${setspath}" ]]; then
+ setsfiles=(${setspath}/*~*.conf(N))
+ for set in ${setsfiles[@]}; do
+ sets+=(${set}(:t))
+ done;
+ sets+=($(_parsesetsconf ${PORTDIR} sets))
+ fi
+ fi
+ done
+ if [[ ((${#sets} > 0)) ]]; then
+ _wanted available_sets expl 'available set' compadd "$@" "@${(o@)^sets}"
+ fi
+}
+
+# Completion function to show useflags.
+_gentoo_packages_update_useflag(){
+ local flags trees
+
+ flags=()
+ trees=($(_portdir) $(_portdir -o))
+
+ for PORTDIR in ${trees[@]}; do
+ [[ -r ${PORTDIR}/profiles/use.desc ]] &&
+ flags+=(${${(M)${(f)"$(<$PORTDIR/profiles/use.desc)"}:#* - *}%% - *})
+ [[ -r ${PORTDIR}/profiles/use.local.desc ]] &&
+ flags+=(${${${(M)${(f)"$(<$PORTDIR/profiles/use.local.desc)"}#* - *}%% - *}#*:})
+ done
+
+ compadd $flags
+}
+
+_gentoo_packages_update_active_useflag(){
+ local flags USE
+ var=USE
+ [[ -z ${(P)var} && -r /etc/portage/make.conf ]] &&
+ local $var="`. /etc/portage/make.conf 2>/dev/null; echo ${(P)var}`"
+ [[ -z ${(P)var} && -r /etc/make.conf ]] &&
+ local $var="`. /etc/make.conf 2>/dev/null; echo ${(P)var}`"
+ flags=(${${${=USE}%-*}%\\*})
+ compadd $flags
+}
+_gentoo_packages_update_category(){
+ local trees category
+
+ trees=($(_portdir) $(_portdir -o))
+ category=( $trees/*-*(/:t) )
+ _wanted cat_packages expl 'category' compadd "$@" $category
+}
+
+_gentoo_packages_update_installed(){
+ local installed_dir installed_portage installed_list expl
+ installed_dir="/var/db/pkg"
+ installed_portage=($installed_dir/*-*/*)
+
+ installed_pkgname=(${${installed_portage:t}%%-[0-9]*})
+ _wanted packages expl 'package' compadd "$@" ${installed_pkgname}
+
+ installed_list=( ${${installed_portage#$installed_dir/}%%-[0-9]*} )
+ _wanted cat_packages expl 'category/package' _multi_parts "$@" / installed_list
+}
+
+_gentoo_packages_update_installed_versions(){
+ local installed_list installed_portage expl
+
+ installed_portage=(/var/db/pkg/*-*/*)
+ _wanted packages expl 'package' compadd "$@" ${installed_portage:t}
+
+ installed_list=(${installed_portage##*/pkg/})
+ _wanted cat_packages expl 'category/package' _multi_parts "$@" / installed_list
+}
+
+_gentoo_packages_update_available_pkgnames_only(){
+ local trees packages
+
+ trees=($(_portdir) $(_portdir -o))
+
+ packages=($trees/*-*/*(:t))
+ _wanted packages expl 'package' compadd - "${(@)packages}"
+}
+
+_gentoo_packages_update_available(){
+ local trees category packages pkg expl
+
+ trees=($(_portdir) $(_portdir -o))
+ category=($trees/*-*(/:t))
+
+ packages=($trees/*-*/*(:t))
+ _wanted packages expl 'package' compadd - "${(@)packages}"
+
+ # Complete cat/pkg. _multi_parts is much to slow for such a large task,
+ # _sep_parts removes the dash from gnome-<tab>, and _path_files wants to
+ # complete cat/pkg/files (if "files" is ignored with -F, miscfiles, etc...
+ # don't get completed).
+ if [[ $PREFIX != */* ]] ; then
+ _wanted cat_packages expl 'category/package' compadd -S '/' $category
+ else
+ compset -P '*/'
+ pkg=($trees/$IPREFIX/*(:t))
+ _wanted cat_packages expl 'category/package' compadd $pkg
+ fi
+}
+
+_gentoo_packages_update_available_versions(){
+ local var overlay_ebuilds portage_ebuilds expl trees category
+
+ PORTDIR=$(_portdir)
+ PORTDIR_OVERLAY=$(_portdir -o);
+
+ trees=($PORTDIR $=PORTDIR_OVERLAY)
+ category=($trees/*-*(/:t))
+ typeset -U category
+
+ if [[ $#PREFIX -ge 1 && -z $words[(r)(--inject|-i)] ]] ; then
+ overlay_ebuilds=($=PORTDIR_OVERLAY/*-*/${PREFIX%%-[0-9]#*}*/*.ebuild(:t:r) )
+ portage_ebuilds=($PORTDIR/metadata/cache/*-*/${PREFIX%%-[0-9]#*}*(:t))
+ _wanted packages expl 'package' compadd $portage_ebuilds $overlay_ebuilds
+ fi
+ pkg=( $trees/${PREFIX%%/*}/*/*.ebuild(:t:r) )
+ _wanted cat_packages expl 'category/package' _sep_parts category / pkg
+}
+
+#Function to show tbz2 files available
+_gentoo_packages_update_binary() {
+ [[ -z $PKGDIR && -r /etc/portage/make.conf ]] &&
+ local PKGDIR="`. /etc/portage/make.conf 2>/dev/null; echo $PKGDIR`"
+ [[ -z $PKGDIR && -r /etc/make.conf ]] &&
+ local PKGDIR="`. /etc/make.conf 2>/dev/null; echo $PKGDIR`"
+ [[ -z $PKGDIR && -r /usr/share/portage/config/make.globals ]] &&
+ local PKGDIR="`. /usr/share/portage/config/make.globals 2>/dev/null; echo $PKGDIR`"
+
+ # this doesn't take care of ${PORTAGE_BINHOST}. If Gentoo official
+ # binary mirror will be available we should rewrite it accordingly.
+ _path_files -g \*.tbz2 -W "$PKGDIR/All"
+}
+
+_gentoo_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 _gentoo_cache_policy
+ fi
+ [[ "$command" == (installed(_versions|_sets|)|available(_versions|_sets|_pkgnames_only|)|binary|category|(active_|)useflag) ]] || {
+ _message "unknown command: $command"
+ return
+ }
+ [[ "$pkgset" == (installed(_versions|_sets|)|available(_versions|_sets|_pkgnames_only|)|binary|category|(active_|)useflag) ]] || {
+ pkgset="$command"
+ }
+ expl=("${(@)argv[1,-2]}")
+ _gentoo_packages_update_$pkgset
+}
+
+_gentoo_cache_policy () {
+ # rebuild if cache is more than a week old
+ oldp=( "$1"(mw+1) )
+ (( $#oldp )) && return 0
+}
+
+
+_gentoo_packages "$@"