2009-12-30 00:39:59 +01:00

271 lines
8.8 KiB
Bash

# This function is required by _dpkg() and _dpkg-reconfigure()
have dpkg && {
have grep-status && {
_comp_dpkg_installed_packages()
{
grep-status -P -e "^$1" -a -FStatus 'install ok installed' -n -s Package
}
} || {
_comp_dpkg_installed_packages()
{
command grep -A 1 "Package: $1" /var/lib/dpkg/status | \
command grep -B 1 -Ee "ok installed|half-installed|unpacked| \
half-configured|config-files" \
-Ee "^Essential: yes" | \
command grep "Package: $1" | cut -d\ -f2
}
}
# Debian dpkg(8) completion
#
_dpkg()
{
local cur prev i
COMPREPLY=()
cur=`_get_cword`
prev=${COMP_WORDS[COMP_CWORD-1]}
i=$COMP_CWORD
_expand || return 0
_split_longopt
# find the last option flag
if [[ $cur != -* ]]; then
while [[ $prev != -* && $i != 1 ]]; do
i=$((i-1))
prev=${COMP_WORDS[i-1]}
done
fi
case $prev in
-c|-i|-A|-I|-f|-e|-x|-X|-W|--install|--unpack|--record-avail| \
--contents|--info|--fsys-tarfile|--field|--control|--extract| \
--show)
_filedir '?(u)deb'
return 0
;;
-b|--build)
_filedir -d
return 0
;;
-s|-p|-l|--status|--print-avail|--list)
COMPREPLY=( $( apt-cache pkgnames "$cur" 2>/dev/null ) )
return 0
;;
-S|--search)
_filedir
return 0
;;
-r|-L|-P|--remove|--purge|--listfiles)
COMPREPLY=( $( _comp_dpkg_installed_packages "$cur" ) )
return 0
;;
*)
COMPREPLY=( $( compgen -W '-i --install --unpack -A --record-avail \
--configure -r --remove -P --purge --get-selections \
--set-selections --update-avail --merge-avail \
--clear-avail --command-fd --forget-old-unavail -s \
--status -p --print-avail -L --listfiles -l --list \
-S --search -C --audit --print-architecture \
--print-gnu-build-architecture \
--print-installation-architecture \
--compare-versions --help --version --force-help \
--force-all --force-auto-select --force-downgrade \
--force-configure-any --force-hold --force-bad-path \
--force-not-root --force-overwrite \
--force-overwrite-diverted --force-bad-verify \
--force-depends-version --force-depends \
--force-confnew --force-confold --force-confdef \
--force-confmiss --force-conflicts --force-architecture\
--force-overwrite-dir --force-remove-reinstreq \
--force-remove-essential -Dh \
--debug=help --licence --admindir --root --instdir \
-O --selected-only -E --skip-same-version \
-G --refuse-downgrade -B --auto-deconfigure \
--no-debsig --no-act -D --debug --status-fd \
-b --build -I --info -f --field -c --contents \
-x --extract -X --vextract --fsys-tarfile -e --control \
--ignore-depends --abort-after' -- "$cur" ) )
;;
esac
}
complete -F _dpkg -o filenames dpkg dpkg-deb
}
# Debian GNU dpkg-reconfigure(8) completion
#
have dpkg-reconfigure &&
_dpkg_reconfigure()
{
local cur prev opt
COMPREPLY=()
cur=`_get_cword`
prev=${COMP_WORDS[COMP_CWORD-1]}
case $prev in
-f|--frontend)
opt=( $( printf '%s\n' /usr/share/perl5/Debconf/FrontEnd/* ) )
opt=( ${opt[@]##*/} )
opt=( ${opt[@]%.pm} )
COMPREPLY=( $( compgen -W '${opt[@]}' -- "$cur" ) )
return 0
;;
-p|--priority)
COMPREPLY=( $( compgen -W 'low medium high critical' -- "$cur" ) )
return 0
;;
esac
if [[ "$cur" == -* ]]; then
COMPREPLY=( $( compgen -W '-f --frontend -p --priority -a --all -u \
--unseen-only -h --help -s --showold --force --terse' -- "$cur" ) )
else
COMPREPLY=( $( _comp_dpkg_installed_packages "$cur" ) )
fi
} &&
complete -F _dpkg_reconfigure -o default dpkg-reconfigure
# Debian dpkg-source completion
#
have dpkg-source &&
_dpkg_source()
{
local cur prev options work i action packopts unpackopts
packopts="-c -l -F -V -T -D -U -W -E -sa -i -I -sk -sp -su -sr -ss -sn -sA -sK -sP -sU -sR"
unpackopts="-sp -sn -su"
options=`echo "-x -b $packopts $unpackopts" | xargs echo | sort -u | xargs echo`
COMPREPLY=()
if [ "$1" != "dpkg-source" ]; then
return 1
fi
cur=`_get_cword`
prev=${COMP_WORDS[COMP_CWORD-1]}
action="options"
for (( i=0; i < ${#COMP_WORDS[@]}-1; i++ )); do
if [[ ${COMP_WORDS[$i]} == "-x" ]]; then
action=unpack
elif [[ ${COMP_WORDS[$i]} == "-b" ]]; then
action=pack
elif [[ ${COMP_WORDS[$i]} == "-h" ]]; then
action=help
fi
done
# if currently seeing a complete option, return just itself.
for i in $options; do
if [ "$cur" = "$i" ]; then
COMPREPLY=( "$cur" )
return 0
fi
done
case $action in
unpack)
if [[ "$cur" == - || "$cur" == -s ]]; then
COMPREPLY=( $unpackopts )
return 0
fi
case $prev in
-x)
COMPREPLY=( $( compgen -d -- "$cur" ) \
$( compgen -f -X '!*.dsc' -- "$cur" ) )
return 0
;;
*)
COMPREPLY=( $unpackopts $(compgen -d -f -- "$cur" ) )
return 0
;;
esac
return 0
;;
pack)
if [ "$cur" = "-" ]; then
COMPREPLY=( $packopts )
return 0
fi
if [ "$cur" = "-s" ]; then
COMPREPLY=( "-sa" "-sk" "-sp" "-su" "-sr" "-ss" "-sn" \
"-sA" "-sK" "-sP" "-sU" "-sR" )
return 0
fi
case $prev in
-b)
COMPREPLY=( $( compgen -d -- "$cur" ) )
return 0
;;
-c|-l|-T|-i|-I)
# -c: get controlfile
# -l: get per-version info from this file
# -T: read variables here, not debian/substvars
# -i: <regexp> filter out files to ignore diffs of.
# -I: filter out files when building tarballs.
# return directory names and file names
COMPREPLY=( $( compgen -d -f ) )
return 0
;;
-F)
# -F: force change log format
COMPREPLY=( $( ( cd /usr/lib/dpkg/parsechangelog; compgen -f "$cur" ) ) )
return 0
;;
-V|-D)
# -V: set a substitution variable
# we don't know anything about possible variables or values
# so we don't try to suggest any completion.
COMPREPLY=()
return 0
;;
-D)
# -D: override or add a .dsc field and value
# if $cur doesn't contain a = yet, suggest variable names
if [[ "$cur" == *=* ]]; then
# $cur contains a "="
COMPREPLY=()
return 0
else
COMPREPLY=( Format Source Version Binary Maintainer Uploader Architecture Standards-Version Build-Depends Files )
return 0
fi
;;
-U)
# -U: remove a field
# Suggest possible fieldnames
COMPREPLY=( Format Source Version Binary Maintainer Uploader Architecture Standards-Version Build-Depends Files )
return 0
;;
*)
COMPREPLY=( $packopts )
return 0
;;
esac
return 0
;;
*)
# if seeing a partial option, return possible completions.
if [ "$cur" = "-s" ]; then
COMPREPLY=( "-sa" "-sk" "-sp" "-su" "-sr" "-ss" "-sn" \
"-sA" "-sK" "-sP" "-sU" "-sR" )
return 0
fi
# else return all possible options.
COMPREPLY=( $options )
return 0
;;
esac
} &&
complete -F _dpkg_source dpkg-source
# Local variables:
# mode: shell-script
# sh-basic-offset: 4
# sh-indent-comment: t
# indent-tabs-mode: nil
# End:
# ex: ts=4 sw=4 et filetype=sh