# -*- mode: shell-script; sh-basic-offset: 8; indent-tabs-mode: t -*-
# ex: ts=8 sw=8 noet filetype=sh

# 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()
{
	grep -A 1 "Package: $1" /var/lib/dpkg/status | \
		grep -B 1 -Ee "ok installed|half-installed|unpacked| \
					half-configured|config-files" \
				  -Ee "^Essential: yes" | \
		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|-@(install|unpack|record-avail|contents|info|fsys-tarfile|field|control|extract)))
		_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 $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=( $( echo /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 $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" = "-" -o "$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 echo -- "$cur" | grep -q "="; 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
