#!/bin/bash
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
		exit 1
	fi
	cur=${COMP_WORDS[COMP_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
	
	case "$cur" in
		"-h"|"-x"|"-b")
			COMPREPLY=( "$cur" )
			return 0
			;;
	esac
	case "$action" in
		"unpack")
			case "$prev" in
				"-x")
					COMPREPLY=( $( compgen -d -G '*.dsc' -- "$cur" ) )
					return 0
					;;
				*)
					COMPREPLY=( $unpackopts $(compgen -d -f -- "$cur" ) )
					return 0
					;;
			esac
			return 0
			;;
		"pack")
			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
			;;
		*)
			COMPREPLY=( $options )
			return 0
			;;
	esac
}
complete -F _dpkg_source dpkg-source

