_reprepro()
{
	local cur prev commands options noargoptions i state cmd ignores hiddencommands commands codenames confdir basedir architectures components

	confdir=""
	basedir=""

	function parse_config() {
		local conffile distfile
		if [[ -n "$confdir" ]] ; then
			conffile="$confdir/options"
			distfile="$confdir/distributions"
		elif [[ -n "$basedir" ]] ; then
			conffile="$basedir/conf/options"
			distfile="$basedir/conf/distributions"
		else
			conffile="./conf/options"
			distfile="./conf/distributions"
		fi
		if [[ -e "$conffile" ]] ; then
			if grep -q '^confdir ' -- "$conffile" 2>/dev/null ; then
				distfile="$(grep '^confdir ' -- "$conffile" 2>/dev/null | sed -e 's/^confdir //')/distributions"
			elif [ -z "$confdir" ] && grep -q '^basedir ' -- "$conffile" 2>/dev/null  ; then
				distfile="$(grep '^basedir ' -- "$conffile" 2>/dev/null | sed -e 's/^basedir //')/conf/distributions"
			fi
		fi
		if [[ -e "$distfile" ]] ; then
			codenames="$(awk -- '/^[Cc][Oo][Dd][Ee][Nn][Aa][Mm][Ee]: / {$1="";print}' "$distfile")"
			architectures="$(awk -- '/^[Aa][Rr][Cc][Hh][Ii][Tt][Ee][Cc][Tt][Uu][Rr][Ee][Ss]: / {$1="";print}' "$distfile")"
			components="$(awk -- '/^[Cc][Oo][Mm][Pp][Oo][Nn][Ee][Nn][Tt][Ss]: / {$1="";print}' "$distfile")"
		else
			codenames="experimental woody sarge sid etch whatever-you-defined"
			architectures="source i386 abacus whatever-you-defined"
			components="main contrib non-free whatever-you-defined"
		fi
	}

	COMPREPLY=()

	ignores='ignore forbiddenchar 8bit emptyfilenamepart overlongcomments\
		spaceonlyline malformedchunk shortkeyid unknownfield\
		wrongdistribution missingfield brokenold brokenversioncmp\
		extension unusedarch surprisingarch surprisingbinary\
		wrongsourceversion wrongversion brokensignatures\
		uploaders missingfile'
	noargoptions='--delete --nodelete --help -h --verbose -v\
	--nothingiserror --nolistsdownload --keepunreferencedfiles\
	--keepunneededlists --keepdirectories\
	--ask-passphrase --nonothingiserror --listsdownload\
	--nokeepunreferencesfiles --nokeepunneededfiles --nokeepdirectories\
	--noask-passphrase --skipold --noskipold'
	options='-b -i --basedir --ignore --unignore --methoddir --distdir --dbdir\
	--listdir --overridedir --confdir --section -S --priority -P --component -C\
	--architecture -A --type -T --export'

	i=1
	prev=""
	cmd="XYZnoneyetXYZ"
	while [[ $i -lt $COMP_CWORD ]] ; do
		cur=${COMP_WORDS[i]}
		prev=""
		case "$cur" in
			--basedir=*)
				basedir="${cur#--basedir=}"
				i=$((i+1))
				;;
			--confdir=*)
				confdir="${cur#--confdir=}"
				i=$((i+1))
				;;
			--*=*)
				i=$((i+1))
				;;
			-b|--basedir)
				prev="$cur"
				basedir="${COMP_WORDS[i+1]}"
				i=$((i+2))
				;;
			--confdir)
				prev="$cur"
				confdir="${COMP_WORDS[i+1]}"
				i=$((i+2))
				;;
			
			-i|--ignore|--unignore|--methoddir|--distdir|--dbdir|--listdir|--overridedir|--section|-S|--priority|-P|--component|-C|--architecture|-A|--type|-T|--export)

				prev="$cur"
				i=$((i+2))
				;;
			--*|-*)
				i=$((i+1))
				;;
			*)
				cmd="$cur"
				i=$((i+1))
				break
				;;
		esac
	done
	cur=${COMP_WORDS[COMP_CWORD]}
	if [[ $i -gt $COMP_CWORD && -n "$prev" ]]; then
		case "$prev" in
			-b|--basedir|--methoddir|--distdir|--dbdir|--listdir|--overridedir|--confdir)
        			COMPREPLY=( $( compgen -d  -- $cur ) )

				return 0
				;;
			-T|--type)
        			COMPREPLY=( $( compgen -W "dsc deb udeb"  -- $cur ) )
				return 0
				;;
			-i|--ignore|--unignore)
        			COMPREPLY=( $( compgen -W "$ignores"  -- $cur ) )
				return 0
				;;
			-P|--priority)
        			COMPREPLY=( $( compgen -W "required important standard optional extra" -- $cur ) )
				return 0
				;;
			-S|--section)
        			COMPREPLY=( $( compgen -W "admin base comm contrib devel doc editors electronics embedded games gnome graphics hamradio interpreters kde libs libdevel mail math misc net news non-free oldlibs otherosfs perl python science shells sound tex text utils web x11 contrib/admin contrib/base contrib/comm contrib/contrib contrib/devel contrib/doc contrib/editors contrib/electronics contrib/embedded contrib/games contrib/gnome contrib/graphics contrib/hamradio contrib/interpreters contrib/kde contrib/libs contrib/libdevel contrib/mail contrib/math contrib/misc contrib/net contrib/news contrib/non-free contrib/oldlibs contrib/otherosfs contrib/perl contrib/python contrib/science contrib/shells contrib/sound contrib/tex contrib/text contrib/utils contrib/web contrib/x11 non-free/admin non-free/base non-free/comm non-free/contrib non-free/devel non-free/doc non-free/editors non-free/electronics non-free/embedded non-free/games non-free/gnome non-free/graphics non-free/hamradio non-free/interpreters non-free/kde non-free/libs non-free/libdevel non-free/mail non-free/math non-free/misc non-free/net non-free/news non-free/non-free non-free/oldlibs non-free/otherosfs non-free/perl non-free/python non-free/science non-free/shells non-free/sound non-free/tex non-free/text non-free/utils non-free/web non-free/x11"  -- $cur ) )
				return 0
				;;
			-A|--architecture)
				parse_config
        			COMPREPLY=( $( compgen -W "$architectures" -- $cur ) )
				return 0
				;;
			-C|--component)
				parse_config
        			COMPREPLY=( $( compgen -W "$components" -- $cur ) )
				return 0
				;;
			--export)
        			COMPREPLY=( $( compgen -W "never changed normal force" -- $cur ) )
				return 0
				;;
		esac
	fi

	if [[ "XYZnoneyetXYZ" = "$cmd" ]] ; then
		commands='remove list listfilter createsymlinks export\
			check reoverride checkpool rereference dumpreferences\
			dumpunreferenced deleteunreferenced retrack dumptracks\
			cleartracks removetrack update checkupdate pull \
			checkpull includedeb includeudeb includedsc include copy'
		hiddencommands='__d __extractcontrol _detect _forget\
			_listmd5sums _addmd5sum _dumpcontents\
			_removereferences _addreference'

		if [[ "$cur" == -* ]]; then
			case "$cur" in 
				--ignore=*)
					COMPREPLY=( $( compgen -W "$ignores"  -- ${cur#--ignore=} ) )
					;;
				--unignore=*)
					COMPREPLY=( $( compgen -W "$ignores"  -- ${cur#--unignore=} ) )
					;;
				--component=*)
					parse_config
        				COMPREPLY=( $( compgen -W "$components" -- {cur#--component=} ) )
					;;
				--architectures=*)
					parse_config
        				COMPREPLY=( $( compgen -W "$architectures" -- {cur#--architectures=} ) )
					;;

				*)
					COMPREPLY=( $( compgen -W "$options $noargoptions" -- $cur ) )
					;;
			esac
		elif [[ "$cur" == _* ]]; then
			COMPREPLY=( $( compgen -W "$hiddencommands" -- $cur ) )
		else
			COMPREPLY=( $( compgen -W "$commands" -- $cur ) )
		fi
		return 0
	fi

	case "$cmd" in
		remove|list|listfilter|removetrack)
			# first argument is the codename
			if [[ $i -eq $COMP_CWORD ]] ; then
				parse_config
				COMPREPLY=( $( compgen -W "$codenames" -- $cur ) )
				return 0
			fi
			# these later could also look for stuff, but
			# that might become a bit slow
			;;
		export|update|checkupdate|pull|checkpull|rereference|retrack|cleartracks|dumptracks|check|reoverride)
			# all arguments are codenames
			parse_config
			COMPREPLY=( $( compgen -W "$codenames" -- $cur ) )
			return 0
			;;

		includedeb)
			# first argument is the codename
			if [[ $i -eq $COMP_CWORD ]] ; then
				parse_config
				COMPREPLY=( $( compgen -W "$codenames" -- $cur ) )
				return 0
			fi
			# then one .deb file follows
			if [[ $(( $i + 1 )) -eq $COMP_CWORD ]] ; then
				_filedir "!*.deb"
			fi
			return 0
			;;
		includedsc)
			# first argument is the codename
			if [[ $i -eq $COMP_CWORD ]] ; then
				parse_config
				COMPREPLY=( $( compgen -W "$codenames" -- $cur ) )
				return 0
			fi
			# then one .dsc file follows
			if [[ $(( $i + 1 )) -eq $COMP_CWORD ]] ; then
				_filedir "!*.dsc"
			fi
			return 0
			;;
		include)
			# first argument is the codename
			if [[ $i -eq $COMP_CWORD ]] ; then
				parse_config
				COMPREPLY=( $( compgen -W "$codenames" -- $cur ) )
				return 0
			fi
			# then one .changes file follows
			if [[ $(( $i + 1 )) -eq $COMP_CWORD ]] ; then
				_filedir "!*.changes"
			fi
			return 0
			;;
		copy)
			# first argument is a codename
			if [[ $i -eq $COMP_CWORD ]] ; then
				parse_config
				COMPREPLY=( $( compgen -W "$codenames" -- $cur ) )
				return 0
			fi
			# second argument is a codename
			if [[ $(( $i + 1 )) -eq $COMP_CWORD ]] ; then
				parse_config
				COMPREPLY=( $( compgen -W "$codenames" -- $cur ) )
				return 0
			fi
			# here we could look for package names existing in
			# that distribution, but that would be slow...
			;;
	esac
	COMPREPLY=( $( compgen -f -- $cur ) )
	return 0
}
complete -F _reprepro reprepro

