head	1.2;
access;
symbols;
locks; strict;
comment	@# @;


1.2
date	2005.02.22.14.22.54;	author usata;	state Exp;
branches;
next	1.1;

1.1
date	2005.02.22.13.49.34;	author usata;	state Exp;
branches;
next	;


desc
@@


1.2
log
@Updated to use _gentoo_packages, contributed by baptux <bapt@@ifrance.com> and oberyno <oberyno@@gmail.com>; bug #71957.
@
text
@#compdef emerge rc-update rc-status ebuild opengl-update rc quickpkg

# $Id: _portage,v 1.1 2005/02/22 13:49:34 usata Exp $

# ZSH completion function for Portage
# Author: baptux <bapt@@ifrance.com>
# Author: Mamoru KOMACHI <usata@@gentoo.org>
# Author: oberyno <oberyno@@gmail.com>

# Already done:
#
# emerge (fully done)
# rc-update (fully done)
# rc-status (fully done)
# ebuild (fully done)
# opengl-update (fully done)
# rc (fully done)

# Stuff for rc
_rc () {
	if (( CURRENT == 2 ));then
	    _values "runlevels" $gentoo_runlevels
	fi
}

# Stuff for opengl-update (the easiest to do :) )

_opengl-update () {
	if (( CURRENT == 2 ));then
		_values "opengl-update options" \
		'xorg-x11[Use libGL.so from X.Org]' \
		'xfree[Use libGL.so from XFree86]' \
		'nvidia[Use libGL.so from the NVidia drivers.]'
	fi
}

# Stuff for ebuild
_ebuild () {
	if (( CURRENT == 2 ));then
		       _files -g \*.ebuild
	elif (( CURRENT > 2 ));then
		_values "ebuild command" \
		'clean[Cleans the temporary build directory]' \
		'help[Show help]' \
		'setup[Run all package specific setup actions and exotic system checks.]' \
		'fetch[Fetch all necessary files]' \
		'digest[Creates a digest file for the package]' \
		'unpack[Extracts the sources to a subdirectory in the build directory]' \
		'compile[Compiles the extracted sources by running the src_compile()]' \
		'preinst[Run specific actions that need to be done before installation]' \
		'install[Installs the package to the temporary install directory]' \
		'postinst[Run specific actions that need to be done after installation]' \
		'qmerge[Installs the package de the filesystem]' \
		'merge[perform the following actions: fetch, unpack, compile, install and qmerge.]' \
		'unmerge[Remove the installed files of the packages]' \
		'prerm[Run specific actions that need to be executed before unmerge]' \
		'postrm[Run specific actions that need to be executed after unmerge]' \
		'config[Run specific actions needed to be executed after the emerge process has completed.]' \
		'package[This command is a lot like the merge command, but create a .tbz2 package]' \
		'rpm[Builds a RedHat RPM package]'
	fi

}

# Stuff for rc-status
_rc-status () {
    if (( CURRENT == 2 ));then
    _values "rc-status options" \
	'-a[Show services at all run levels]' \
	'--all[Show services at all run levels]' \
	'-l[Show list of run levels]' \
	'--list[Show list of run levels]' \
	'-u[Show services not assigned to any run level]' \
	'--unused[Show services not assigned to any run level]' \
	$gentoo_runlevels
    fi
}

# Stuff for rc-update

_rc-update () {
local used_init
    used_init=(${=${(M)${(f)"$(rc-update show 2>/dev/null)"}:#*|*[a-z]*}% |*})
    if (( CURRENT == 2 ));then
       _values "rc-update actions" \
       'add[Add script to a runlevel]' \
       'del[Delete script from a runlevel]' \
       'show[Show scripts lanched at a runlevel]' \
       '-a[Add script to a runlevel]' \
       '-d[Delete script from a runlevel]' \
       '-s[Show scripts lanched at a runlevel]'
    elif (( CURRENT == 3 ));then
	case "$words[2]" in
		add|-a)
		 _values "scripts" /etc/init.d/*~*.sh(:t)
		;;
		del|-d)
		_values "scripts" $used_init
		;;
		show|-s)
		    _values "runlevels" $gentoo_runlevels
		;;
	esac
    elif (( CURRENT == 4 ));then
        case "$words[2]" in
		add|-a|del|-d)
		    _values "runlevels" $gentoo_runlevels
		;;
	esac
    fi
}

# Stuff for quickpkg

_quickpkg () {
	if compset -P '(\\|)(>=|<=|<|>|=)'; then
	_arguments -s \
    	    '*:installed package:_gentoo_packages installed_versions'
	  elif compset -P '(\\|)[/]'; then
		_path_files -W / -/
	  else
    		_arguments \
		    '*:installed package:_gentoo_packages installed'
	  fi
}

# Stuff for emerge

_emerge () {
    local nopkg_opts all noask_opts bopts install_args common_args profiles

  noask_opts=(-p -a --pretend --ask --regen --info --search -s --searchdesc \
  -S --version -V --help -h --metadata)

  nopkg_opts=(--resume --skipfirst -c --clean -h --help --depclean --info \
  --metadata -P --prune --regen -s --search -S --searchdesc --sync -C \
  --unmerge -V --version -i --inject)

  bopts=($nopkg_opts -b --buildpkg -B --buildpkgonly -G --getbinpkgonly -g \
  --getbinpkg -k --usepkg -K --usepkgonly --fetch-all-uri -f -F --fetchonly)

  all=($bopts -l --changelog --columns --deep -D --emptytree -e --newuse \
  --noconfmem --nodeps -O --noreplace -n --oneshot -1 -o --onlydeps --tree -t \
  -u --update -U --upgradeonly)

  common_args=(
    "($noask_opts --sync)"{-p,--pretend}"[Simply  display  what would be done]"
    "($noask_opts)"{-a,--ask}"[Ask what would be done]"
    '(-d --debug --help -h --version -V)'{-d,--debug}'[Tells emerge to run the emerge command in debug mode]'
    '(--quiet -q --verbose -v)'{-q,--quiet}'[General outcome is a reduced or condensed output]'
    '(--verbose -v --quiet -q)'{-v,--verbose}'[Tell emerge to run in verbose mode]'
    '--nospinner[Disables the spinner for the session]'
  )
  install_args=(
    "($bopts)"{-b,--buildpkg}"[Tells emerge to build binary packages]"
    "($bopts)"{-B,--buildpkgonly}"[Tells emerge to only build binary packages]"
    "($nopkg_opts --emptytree -e -l --changelog --usepkgonly -K)"{-l,--changelog}"[This will show the ChangeLog]"
    "($nopkg_opts -t --tree)--columns[Displays versions in aligned format]"
    "($nopkg_opts -D --deep)"{-D,--deep}"[Consider the entire dependency tree of packages]"
    "($nopkg_opts -e -l --changelog --emptytree)"{-e,--emptytree}"[Only consider glibc as installed packages]"
    "($all --nospinner --pretend -p)"{-i,--inject}"[Portage thinks that this package is installed]"
    "($nopkg_opts $bopts)"{-f,--fetchonly}"[Just perform fetches for all packages]"
    "($nopkg_opts $bopts)"{-F,--fetch-all-uri}"[Fetch all possible files for all packages]"
    "($bopts)"{-g,--getbinpkg}"[Tells emerge to download binary package]"
    "($bopts)"{-G,--getbinpkgonly}"[As --getbinpkg, but does not use local info]"
    "($nopkg_opts)--noconfmem[Causes portage to disregard merge records]"
    "($nopkg_opts -O --nodeps)"{-O,--nodeps}"[Merges specified packages without merging dependencies]"
    "($nopkg_opts -n --noreplace)"{-n,--noreplace}"[Skip packages already installed]"
    "($nopkg_opts)"{-1,--oneshot}"[Do not add package to the world profile]"
    "($nopkg_opts --onlydeps -o)"{-o,--onlydeps}"[Only merge (or pretend to merge) the dependencies]"
    "($nopkg_opts --columns -t --tree)"{-t,--tree}"[Show dependency tree]"
    "($nopkg_opts --update -u)"{-u,--update}"[Updates packages to the most recent version available]"
    "($nopkg_opts --upgradeonly -U)"{-U,--upgradeonly}"[Do not update packages to a lower version]"
    "($bopts)"{-k,--usepkg}"[Tells emerge to use binary packages if available]"
    "($bopts --changelog -l)"{-K,--usepkgonly}"[Tells emerge to use binary packages only]"
    "($all)"{-c,--clean}"[Cleans the system by removing packages]"
    '(: -)'{-h,--help}'[Displays help]:subject:(sync config system)'
    "(: $all)--depclean[Clean all packages that have no reason for being installed]"
    "(: $all $noask_opts --nospinner --quiet -q)--info[This is a list of information to include in bug reports]"
    "(: -)--metadata[Generate metadata]"
    "($nopkg_opts --usepkgonly -K)--newuse[Include installed packages which have changed USE flags]"
    "($all)"{-P,--prune}"[Removes all but the latest versions of matching packages]"
    "(: $all $noask_opts --verbose -v)--regen[Causes portage to check and update the dependency cache]"
    "(: $all $noask_opts --verbose -v)"{-s,--search}"[Searches for matches]"
    "(: $all $noask_opts --verbose -v)"{-S,--searchdesc}"[Matches the seachdesc string against the description field]"
    "(: $all --pretend -p)--sync[Initiates a portage tree update]"
    "($all)"{-C,--unmerge}"[Removes all matching packages]"
    '(: -)'{-V,--version}'[Display version info]'
    "(: $all[3,-1])--resume[Resumes the last merge operation]"
    "(: $all[3,-1])--skipfirst[Removes the first package in the resume list]"
  )
  profiles=(
    'world[All packages in the world profile]'
    'system[All packages in the system profile]'
  )


  # Dispatch
  if (( $words[(I)(--(unmerge|clean|prune)|-[[:alpha:]]#(C|c|P)[[:alpha:]]#)] )) ; then
	if compset -P '(\\|)(>=|<=|<|>|=)'; then
	    _arguments -s \
		'*:installed package:_gentoo_packages installed_versions' && return 0
	else
	    _arguments -s \
		"$common_args[@@]" "$install_args[@@]" \
		"*:installed package:_gentoo_packages installed" && return 0
	fi

  elif (( $words[(I)(world|system)] )) ; then
    _arguments -s \
	"$common_args[@@]" "$install_args[@@]" \
	"($nopkg_opts[1,-2] --inject -i --oneshot -1):" && return 0

  elif (( $words[(I)(--usepkgonly|-[[:alnum:]]#K[[:alnum:]]#)] )) ; then
    _arguments -s \
	"$common_args[@@]" "$install_args[@@]" \
	'*:binary package:_gentoo_packages binary' && return 0

  elif [[ $words[-3] == (--help|-h) ]] ; then
      _message "No more arguments" && return 0

  else
	if compset -P '(\\|)(>=|<=|<|>|=)'; then
	    _arguments \
		"*:portage:_gentoo_packages available_versions" && return 0

	elif (( $words[(I)(--inject|-i)] )) ; then
	    _arguments -s \
		"$common_args[@@]" "$install_args[@@]" \
		"*:portage:_gentoo_packages available_versions" && return 0
	else
	    _arguments -s \
		"$common_args[@@]" "$install_args[@@]" \
		"($nopkg_opts)::portage: _values 'profile' \$profiles[@@] " \
		"($nopkg_opts)*:portage:_gentoo_packages available" && return 0
	fi
  fi
}



local gentoo_runlevels
gentoo_runlevels=(/etc/runlevels/*(:t))

case "$service" in
	emerge)
		_emerge "$@@" && return 0
		;;
	rc-update)
		_rc-update "$@@" && return 0
		;;
	rc-status)
		_rc-status "$@@" && return 0
		;;
	ebuild)
		_ebuild "$@@" && return 0
		;;
	opengl-update)
		_opengl-update "$@@" && return 0
		;;
	rc)
		_rc "$@@" && return 0
		;;
	quickpkg)
		_quickpkg "$@@" && return 0
		;;

esac
@


1.1
log
@Initial revision
@
text
@d3 1
a3 1
# $Id: _portage-20040730,v 1.3 2004/08/17 21:37:04 usata Exp $
d8 1
d12 1
a12 1
# emerge (fully done) 
d31 1
d62 1
a62 1
	
d82 2
d94 5
a98 3
		add|-a|del|-d)
		    _arguments -s \
		        '*:scripts:_files -W /etc/init.d/'
d116 1
a116 1
	if compset -P '(\\|)[><][=]'; then
d118 1
a118 4
    	    '*:installed pkgname with versions:_portage_unmerge_vers' && return 0
	  elif compset -P '(\\|)[<=>]'; then
		_arguments -s \
		    '*:installed pkgname with versions:_portage_unmerge_vers' && return 0
d120 4
a123 4
		_files -W / -/ && return 0
	  else 
		_arguments -s \
		    '*:installed pkgname:_portage_quickpkg' && return 0
d126 1
a126 1
 
d130 1
a130 77
    local state
    if (( CURRENT == 2 ));then
        _arguments -s \
            '*:*:->actions' \
            "$common_args[@@]" "$install_args[@@]" && return 0
    elif (( CURRENT > 2 ));then
        case "$words[2]" in
	    unmerge|-C)
	 	  if compset -P '(\\|)[><][=]'; then
			_arguments -s \
		    	'*:installed pkgname with versions:_portage_unmerge_vers' "$common_args[@@]" && return 0
		  elif compset -P '(\\|)[<=>]'; then
			_arguments -s \
		    	'*:installed pkgname with versions:_portage_unmerge_vers' "$common_args[@@]" && return 0
		  else 
			_arguments -s \
		    	'*:installed pkgname:_portage_unmerge' "$common_args[@@]" && return 0
		  fi
		;;
	    clean|-c)
	    	_arguments -s \
		    '*:installed pkgname:_portage_clean' "$common_args[@@]" && return 0
		;;
	    --usepkgonly|-K)
		_arguments -s \
		    '*:use package only:_portage_tbz2list' "$common_args[@@]" && return 0
		;;
	    depclean|help|-h|info|regen|sync|rsync|--searchdesc|-S|search|-s|prune|-P)
		;;
	    --resume|--skipfirst)
	    	_arguments -s \
		 '--skipfirst[Removes the first package in the resume list]' \
		    "$common_args[@@]"  && return 0
		;;
	    *)
		_arguments -s \
		    '*:*:->install_portage' \
		    "$common_args[@@]" \
		    "$install_args[@@]" && return 0
		;;
        esac
    fi
    while [[ -n "$state" ]]; do
        lstate=$state
        state=''
        case "$lstate" in
	    actions)
		if compset -P '(\\|)[><][=]'; then
		_alternative \
			'*:portage:_ebuild_cache'

		elif compset -P '(\\|)[<=>]'; then
		_alternative \
			'*:portage:_ebuild_cache'
				
		else 
		_alternative \
		':emerge actions:_actions' \
		     '*:portage:_portage_pkglist'
		fi

		;;
	    install_portage)
		if compset -P '(\\|)[><][=]'; then
		_alternative \
			'*:portage:_ebuild_cache'
		elif compset -P '(\\|)[<=>]'; then
		_alternative \
			'*:portage:_ebuild_cache'
		else
		_alternative \
		     '*:portage:_portage_pkglist'
		fi
		;;
        esac
    done
}
d132 2
a133 7
#Function to show only installed packages   -- pkgname (no category or version #)
_portage_unmerge(){
    installed_portage=(/var/db/pkg/*-*/*)
    installed_pkgname=${(M)${${installed_portage##*/}%%-[0-9]*}}
    _tags -s installed_pkgname && { compadd "$@@" ${(kv)=installed_pkgname} }
    _path_files -/ -W "/var/db/pkg/"
}
d135 73
a207 6
#Function to show only installed packages -- no _path_files 
_portage_quickpkg(){
    installed_portage=(/var/db/pkg/*-*/*)
    installed_pkgname=${(M)${${installed_portage##*/}%%-[0-9]*}}
    _tags -s installed_pkgname && { compadd "$@@" ${(kv)=installed_pkgname} }
}
d209 29
a237 23
#Function to show only installed packages -- cat/name-ver
_portage_unmerge_vers(){
    installed_portage=(/var/db/pkg/*-*/*)
    installed_pkgname=${(M)${${installed_portage##*/}}}
    _tags -s installed_pkgname && {  compadd "$@@" ${(kv)=installed_pkgname} }
    _path_files -/ -W "/var/db/pkg/"
}

#Functions to show "cat/name", classes and dependencies
_portage_clean() {
    installed_portage=(/var/db/pkg/*-*/*)
    installed_dir=/var/db/pkg/
    installed_pkg=${installed_portage//$installed_dir/}
    installed_pkgname=${(M)${${installed_portage##*/}%%-[0-9]*}}
    _tags -s installed_pkg && { compadd "$@@" -k installed_pkg || compadd "$@@" ${(kv)=installed_pkg} }
    _tags -s installed_pkgname && { compadd "$@@" -k installed_pkgname || compadd "$@@" ${(kv)=installed_pkgname} }
}

#Function to show tbz2 files available
_portage_tbz2list() {
    # 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"
a239 24
#Function to show all available portage names
_portage_pkglist(){
    portage_classlist="world system"
    portage_pkglist="$portage_pkglist ${portage_classlist}"
    _tags -s portage_pkglist && { compadd "$@@" -k portage_pkglist || compadd "$@@" ${(kv)=portage_pkglist} }
    _path_files -/ -W "${portdir}"
    # XXX: If I add ${portdir_overlay} category completion won't work properly
    #[[ -n "${portdir_overlay}" ]] && _path_files -/ -W "${portdir_overlay}"
    _path_files -g \*.ebuild
}
#Function for matching all ebuilds  pkg-ver (slow if asking for all packages)
_ebuild_cache(){
    if _cache_invalid portage_ebuilds || ! _retrieve_cache portage_ebuilds; then

    overlay_ebuilds=($portdir_overlay/*-*/*/*)
    overlay_list=${${(M)${overlay_ebuilds##*/}#*ebuild}%%.ebuild}
    metadata_ebuilds=($portdir/metadata/cache/*-*/*)
    metadata_list=${(M)${${metadata_ebuilds##*/}}}

	 _store_cache portage_ebuilds metadata_list overlay_list
    fi
    _tags -s metadata_list && {compadd "$@@" ${(kv)=metadata_list} } 
    _tags -s overlay_list && {compadd "$@@" ${(kv)=overlay_list} }
}
a240 11
local update_policy
zstyle -s ":completion:*:*:emerge:*" cache-policy update_policy
if [[ -z "$update_policy" ]]; then
  zstyle ":completion:*:*:emerge:*" cache-policy _ebuilds_caching_policy
fi

_ebuilds_caching_policy () {
  # rebuild if cache is more than a week old
  oldp=( "$1"(mw+1) )
  (( $#oldp )) && return 0
}
d242 2
a243 77
common_args=(
    {'(-p -a --ask)--pretend','(--pretend -a --ask)-p'}'[simply  display  what would be done]'
    {'(-p -a --pretend)--ask','(--pretend -p --ask)-a'}'[ask what would be done]'
    {'(-d)--debug','(--debug)-d'}'[Tells emerge to run the emerge command in debug mode]'
)
install_args=(
    {'(--upgradeonly -U --update -u --quiet -q --onlydeps -o --oneshot --nospinner --noreplace -n --nodeps -O --noconfmem -D --deep --changelog --buildpkg -B -b --buildpkgonly --emptytree -e -f --fetchonly)-l','(--upgradeonly -U --update -u --quiet -q --onlydeps -o --nospinner --noreplace -n --nodeps -O --noconfmem -D --deep --emptytree -e -f --fetchonly -l --buildpkg -b -B --buildpkgonly )--changelog'}'[This will show the ChangeLog]'
    {'(-b --buildpkgonly -B --changelog -l)--buildpkg','(--changelog -l --buildpkg --buildpkgonly -B)-b'}'[Tells emerge to build binary packages]'
    {'(-B -b --buildpkg --changelog -l)--buildpkgonly','(--changelog -l --buildpkgonly --buildpkg -b)-B'}'[Tells emerge to only build binary packages]'
    {'(-D --changelog -l)--deep','(-l --changelog --deep)-D'}'[Consider the entire dependency tree of packages]'
    {'(-e -l --changelog)--emptytree','(--emptytree -l --changelog)-e'}'[Only consider glibc as installed packages]'
    {'(-f -l --changelog)--fetchonly','(-l --changelog --fetchonly)-f'}'[Just perform fetches for all packages]'
    '(-l --changelog)--noconfmem[Causes portage to disregard merge records]'
    {'(--changelog -l -O)--nodeps','(--nodeps --changelog -l)-O'}'[Merges specified packages without merging dependencies]'
    {'(-l --changelog -n)--noreplace','(-l --changelog --noreplace)-n'}'[Skip packages already installed]'
    '(-l --changelog)--nospiner[Disables the spinner for the session]'
    '(-l --changelog)--oneshot[Do not add package to the world profile]'
    {'(--onlydeps --changelog -l)-o','(--changelog -o -l)--onlydeps'}'[Only merge (or pretend to merge) the dependencies]'
    {'(--quiet --changelog -l)-q','(-q --changelog -l)--quiet'}'[General outcome is a reduced or condensed output]'
    {'(-l --changelog -t)--tree','(-l --changelog --tree)-t'}'[Show dependency tree]'
    {'(--update --changelog -l)-u','(-u --changelog -l)--update'}'[Updates packages to the most recent version available]'
    {'(--upgradeonly --changelog -l)-U','(-U --changelog -l)--upgradeonly'}'[Do not update packages to a lower version]'
    {'(--usepkg --changelog -l)-k','(-k --changelog -l)--usepkg'}'[Tells emerge to use binary packages if available]'
    {'(--usepkgonly --changelog -l)-K','(-K --changelog -l)--usepkgonly'}'[Tells emerge to use binary packages only]'
    {'(--verbose)-v','(-v)--verbose'}'[Tell emerge to run in verbose mode]'
    '(-p --pretend -a --ask)--columns[Displays versions in aligned format]'
    '--resume[Resumes the last merge operation]'
)

_actions() {
    _values "emerge actions" \
	'sync[Initiates a portage tree update]' \
	'rsync[Initiates a portage tree update]' \
	'unmerge[Removes all matching packages]' \
	'search[Searches for matches]' \
	'regen[Causes portage to check and update the dependency cache]' \
	'prune[Removes all but the latest versions of matching packages]' \
	'inject[Portage thinks that this package is installed]' \
	'info[This is a list of information to include in bug reports]' \
	'help[Displays help]' \
	'depclean[Clean all packages that have no reason for being installed]'\
	'clean[Cleans the system by removing packages]' \
	'-c[Cleans the system by removing packages]' \
	'-h[Displays help]' \
	'-i[Portage thinks that this package is installed]' \
	'-P[Removes all but the latest versions of matching packages]' \
	'-s[Searches for matches]' \
	'-S[Matches the search string against the description field]' \
	'--searchdesc[Matches the search string against the description field]' \
	'-C[Removes all matching packages]' \
	'world[Represent all packages in the world profiles]' \
	'system[Represent all the system packages]' 
}
local portage_pkglist gentoo_runlevels portdir pkgdir portdir_overlay overlay
#Reading informations from make.conf
[[ -n "${PORTDIR}" ]] && portdir="${PORTDIR}"
[[ -n "${PKGDIR}" ]] && pkgdir="${PKGDIR}"
if [[ -n "${PORTDIR_OVERLAY}" ]] ; then
    for overlay in ${=PORTDIR_OVERLAY} ; do
	portdir_overlay=(${overlay} ${portdir_overlay})
    done
fi
[[ -r /etc/make.globals ]] && source /etc/make.globals
[[ -r /etc/make.conf ]] && source /etc/make.conf

[[ -z "${portdir}" ]] && portdir="${PORTDIR}"
[[ -z "${pkgdir}" ]] && pkgdir="${PKGDIR}"
if [[ -z "${portdir_overlay}" ]] ; then
    for overlay in ${=PORTDIR_OVERLAY} ; do
	portdir_overlay=(${overlay} ${portdir_overlay})
    done
fi

portage_pkglist=(${portdir}/*-*/* ${portdir_overlay}/*-*/*)
portage_pkglist=(${portage_pkglist##*/})
gentoo_runlevels=(/etc/runlevels/*)
gentoo_runlevels=(${${gentoo_runlevels/\/etc\/runlevels\//}%/})
@
