#!/usr/bin/env bash # _pkgs_list() { local dbdir="$1" shift 1 # the rest will be passed diretly to compgen if TMPDIR=/dev/null ASSUME_ALWAYS_YES=1 \ PACKAGESITE=file:///nonexistent \ pkg info -x 'pkg(-devel)?$' >/dev/null 2>&1; then compgen -W "$(pkg info -aq)" $* else cd ${dbdir} && compgen -d $* fi } _pkg_func() { local cur prev dbdir portsdir command cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD - 1]} dbdir=${PKG_DBDIR:-/var/db/pkg} portsdir=${PORTSDIR:-/usr/ports} command=${COMP_WORDS[0]} case $command in portcvsweb|portsvnweb) case $cur in -*) COMPREPLY=(-h -q -v) ;; *) COMPREPLY=( $(compgen -f $2 ) $(cd $portsdir && compgen -d $2) $(_pkgs_list ${dbdir} $2) ) ;; esac ;; portinstall|portupgrade) case $prev in -[ABS]) COMPREPLY=( $(compgen -c $2) ) ;; -[lL]) COMPREPLY=( $(compgen -f $2) ) ;; -o) COMPREPLY=( $(cd $portsdir && compgen -d $2) ) ;; *) case $cur in -*) COMPREPLY=(-h -a -A -b -B -c -C -D -f -F -i -k -l -L -m -M -n -N -o -O -p -P -PP -q -r -R -s -S -u -v -w -W -x -y) ;; *) if [[ $command = 'portinstall' ]]; then COMPREPLY=( $(cd $portsdir && compgen -d $2) ) else COMPREPLY=( $(_pkgs_list ${dbdir} $2) ) fi ;; esac ;; esac ;; portversion) case $cur in -*) COMPREPLY=(-c -C -F -h -l -L -o -O -q -Q -r -R -t -v -x) ;; *) COMPREPLY=( $(_pkgs_list ${dbdir} $2) ) ;; esac ;; portsdb) case $cur in -*) COMPREPLY=(-h -f -q -u -U) ;; esac ;; ports_glob) case $cur in -*) COMPREPLY=(-h -M -q -r -R -x) ;; *) COMPREPLY=( $(cd $portsdir && compgen -d $2) ) ;; esac ;; portsclean) case $cur in -*) COMPREPLY=(-h -C -D -DD -i -L -n -P -PP -Q -QQ -q) ;; esac ;; pkgdb|pkg_which) case $prev in -[co]) COMPREPLY=( $(_pkgs_list ${dbdir} $2) ) ;; -s) local ch prefix base nospace #nospace='-o nospace' ch=${cur:0:1} case $cur in ?*${ch}*) base=${cur##*$ch} prefix=${cur%$base} COMPREPLY=( $(_pkgs_list ${dbdir} -P "${prefix}" -S "$ch" "${base}") ) ;; "") COMPREPLY=( $(compgen $nospace '/') ) ;; *) base=${cur##*$ch} prefix=${cur%$base} COMPREPLY=( $(_pkgs_list ${dbdir} -P "${prefix}" -S "$ch" $nospace "${base}") ) ;; esac ;; *) case $cur in -*) COMPREPLY=(-h -a -c -f -F -o -Q -QQ -q -s -u -v) ;; *) COMPREPLY=( $(compgen -c -f $2 ) ) esac ;; esac ;; pkg_fetch) case $cur in -*) COMPREPLY=(-h -f -q -R -v) ;; *) COMPREPLY=( $(_pkgs_list ${dbdir} $2) ) COMPREPLY=( ${COMPREPLY[@]%-*} ) ;; esac ;; pkg_sort) case $cur in -*) COMPREPLY=(-h -q) ;; esac ;; pkg_glob) case $cur in -*) COMPREPLY=(-h -a -O -q -r -R -x) ;; *) COMPREPLY=( $(_pkgs_list ${dbdir} $2) ) ;; esac ;; pkg_deinstall) case $prev in -p) COMPREPLY=( $(compgen -d $2) ) ;; *) case $cur in -*) COMPREPLY=(-h -a -c -d -D -f -i -n -O -p -P -q -r -R -v -x) ;; *) COMPREPLY=( $(_pkgs_list ${dbdir} $2) ) ;; esac ;; esac ;; # Standard commands pkg_create) case $prev in -[bP]) COMPREPLY=( $(_pkgs_list ${dbdir} $2) ) ;; -o) COMPREPLY=( $(cd $portsdir && compgen -d $2) ) ;; -[ps]) COMPREPLY=( $(compgen -d $2) ) ;; -[fiIkKrtXDmcdf]) COMPREPLY=( $(compgen -f $2) ) ;; *) case $cur in -*) COMPREPLY=(-Y -N -O -h -j -v -y -z -P -p -f -i -I -k -K -r -s -t -X -D -m -o -c -d -f) ;; *) COMPREPLY=( $(compgen -f $2) ) ;; esac ;; esac ;; pkg_delete) case $prev in -p) COMPREPLY=( $(compgen -d $2) ) ;; *) case $cur in -*) COMPREPLY=(-d -D -f -G -i -n -r -v -x -p -a) ;; *) COMPREPLY=( $(_pkgs_list ${dbdir} $2) ) ;; esac ;; esac ;; pkg_info) case $prev in -e) COMPREPLY=( $(_pkgs_list ${dbdir} $2) ) ;; -O) COMPREPLY=( $(cd $portsdir && compgen -d $2) ) ;; -l) COMPREPLY=( $(compgen -d $2) ) ;; -[tW]) COMPREPLY=( $(compgen -f $2) ) ;; *) case $cur in -*) COMPREPLY=(-c -d -D -f -g -G -i -I -k -L -m -o -p -q -r -R -s -v -V -x -a -e -O -l -t -W) ;; *) COMPREPLY=( $(_pkgs_list ${dbdir} $2) ) ;; esac ;; esac ;; esac return 0 } complete -F _pkg_func \ pkgdb \ pkg_create \ pkg_deinstall \ pkg_delete \ pkg_fetch \ pkg_glob \ pkg_info \ pkg_which \ portcvsweb \ portsvnweb \ portinstall \ portsdb \ ports_glob \ portupgrade \ portversion