# bash completion for urpmi and friends
# Copyright (c) 2002-2004 Guillaume Rousse <guillomovitch@mandriva.com>
# $Id$

# utility functions
_urpmi_get_medias()
{
	medias=( $( urpmq --list-media $1 2>/dev/null | sed -e 's/(/\\(/g' -e 's/)/\\)/g' -e 's/ /\\ /g' ) )
}

_urpmi_medias()
{
	# return list of available media
	local medias IFS=$'\t\n'
        # get medias list
        _urpmi_get_medias all
	# return matching ones
        COMPREPLY=( $( compgen -W '${medias[@]}' -- $cur ) )
}

_urpmi_packages()
{
	# return list of available packages
	local medias i j IFS=$'\t\n,'

	# start with full media list
	_urpmi_get_medias active

	# find media selection options
	for (( i=1; i < COMP_CWORD; i++ )); do
		if [[ "${COMP_WORDS[i]}" == --excludemedia ]]; then
			for media in ${COMP_WORDS[i+1]}; do 
				for (( j=0; j < ${#medias[@]}; j++ )); do
					[ "${medias[j]}" == "$media" ] && medias[j]=''
				done
			done
			i=$(($i+1))
		fi
		if [[ "${COMP_WORDS[i]}" == --media ]]; then
			medias=( ${COMP_WORDS[i+1]} )
			i=$(($i+1))
		fi
		if [[ "${COMP_WORDS[i]}" == --update ]]; then
			_urpmi_get_medias update
		fi
	done

	# get matching packages
	for media in ${medias[@]}; do
		COMPREPLY=( ${COMPREPLY[@]:-} $( grep "^$cur" /var/lib/urpmi/names.${media//\\/} 2>/dev/null ) )
	done
}

_urpmi_aliases()
{
	# return list of available aliases
	COMPREPLY=( $( awk -F: '{print $1}' /etc/urpmi/parallel.cfg 2>/dev/null | grep "^${cur//\\\\/}" ) )
}

# urpmi completion
#
_urpmi()
{
	local cur prev

	COMPREPLY=()
	cur=${COMP_WORDS[COMP_CWORD]}
	prev=${COMP_WORDS[COMP_CWORD-1]}

	case "$prev" in
		--@(media|excludemedia|sortmedia))
			_urpmi_medias
			return 0
			;;
		--parallel)
			_urpmi_aliases
			return 0
			;;
		--root)
			_filedir -d
			return 0
			;;
	esac

	if [[ "$cur" == -* ]]; then
		# return list of available options
		COMPREPLY=( $( compgen -W '-a -p -P -y -s -q -v -h --help \
			--update --media --excludemedia --sortmedia --synthesis \
			--auto --auto-select --no-uninstall --keep --split-level \
			--split-length --fuzzy --src --install-src --clean \
			--noclean --force --allow-nodeps --allow-force --parallel \
			--wget --curl --limit-rate --proxy --proxy-user --bug \
			--env --verify-rpm --no-verify-rpm --no-install \
			--test --excludepath --excludedocs --root --norebuild \
			--searchmedia' -- $cur ) )
	else
		# return available packages (unless it is clearly a file) and rpm files
		if [[ "$cur" != */* ]]; then
			_urpmi_packages
		fi
		_filedir rpm
	fi
}
complete -F _urpmi $filenames urpmi gurpmi

# urpmq completion
#
_urpmq()
{
	local cur prev

	COMPREPLY=()
	cur=${COMP_WORDS[COMP_CWORD]}
	prev=${COMP_WORDS[COMP_CWORD-1]}

	case "$prev" in
		--@(media|excludemedia|sortmedia))
			_urpmi_medias
			return 0
			;;
		--parallel)
			_urpmi_nodes
			return 0
			;;
		--list-media)
			COMPREPLY=( $( compgen -W 'all update active' -- $cur))
			return 0
			;;
	esac

	if [[ "$cur" == -* ]]; then
		# return list of available options
		COMPREPLY=( $( compgen -W '-v -d -u -a -c -P -R -y -s -i -g \
			-r -f -h -l --help --update --media --excludemedia \
			--sortmedia --synthesis --auto-select --fuzzy --keep \
			--list --list-url --list-media --list-nodes --list-aliases \
			--src --headers --sources --force --parallel --wget --curl \
			--changelog --proxy --proxy-user --env --dump-config \
			--use-distrib --searchmedia' -- $cur))
	else
		# return available packages (unless it is clearly a file) and rpm files
		if [[ "$cur" != */* ]]; then
			_urpmi_packages
		fi
		_filedir rpm
	fi
}
complete -F _urpmq urpmq

# urpme completion
#
_urpme()
{
	local cur prev

	COMPREPLY=()
	cur=${COMP_WORDS[COMP_CWORD]}

	if [[ "$cur" == -* ]]; then
		# return list of available options
		COMPREPLY=( $( compgen -W '-v -a -h --help --auto --test \
			--parallel' -- $cur ) )
	else
		# return list of available packages
		_rpm_installed_packages
	fi
}
complete -F _urpme urpme

# urpmf completion
#
_urpmf()
{
	local cur prev

	COMPREPLY=()
	cur=${COMP_WORDS[COMP_CWORD]}
	prev=${COMP_WORDS[COMP_CWORD-1]}

	case "$prev" in
		--@(media|excludemedia|sortmedia))
			_urpmi_medias
			return 0
			;;
	esac

	if [[ "$cur" == -* ]]; then
		# return list of available options
		COMPREPLY=( $( compgen -W '-i -f -e -a -o -m --help --update \
			--media --excludemedia --sortmedia --synthesis \
			--verbose --quiet --uniq --all --name --group --size \
			--epoch --summary --description --sourcerpm --packager\
			--buildhost --url --provides --requires --files \
			--conflicts --obsoletes --env ' -- $cur ) )
	else
		# return available files
		_filedir
	fi
}
complete -F _urpmf urpmf

# urpmi.update completion
#
_urpmi_update()
{
	local cur

	COMPREPLY=()
	cur=${COMP_WORDS[COMP_CWORD]}

	if [[ "$cur" == -* ]]; then
		# return list of available options
		COMPREPLY=( $( compgen -W '-a -c -f -q -v --help --wget \
			--curl --limit-rate --proxy --proxy-user --update \
			--ignore --no-ignore \
			--no-md5sum --force-key --norebuild' \
			-- $cur))
	else
		# return list of available media
		_urpmi_medias
	fi
}
complete -F _urpmi_update urpmi.update

# urpmi.addmedia completion
#
_urpmi_addmedia()
{
	local cur i args

	COMPREPLY=()
	cur=${COMP_WORDS[COMP_CWORD]}

	if [[ "$cur" == -* ]]; then
		# return list of available options
		COMPREPLY=( $( compgen -W '-c -f -h -v -q --help --wget --curl \
			--limit-rate --proxy --proxy-user --update --raw \
			--probe-synthesis --probe-hdlist --no-probe --distrib \
			--env --version --arch --virtual --norebuild --nopubkey' -- $cur ) )
	else
		# count number of mandatory args given sofar
		args=$COMP_CWORD
		for (( i=1; i < COMP_CWORD; i++ )); do
			if [[ "${COMP_WORDS[i]}" == -* ]]; then
				args=$(($args-1))
			fi
		done
		case $args in
			1)
				# return list of available media
				_urpmi_medias
				;;
			2)
				# return list of available protocols
				COMPREPLY=( $( compgen -W 'file:// http:// \
					       ftp:// removable:// ssh:// \
					       rsync://' -- $cur ) )
				;;
			3)
				# return word "with"
				COMPREPLY=( 'with' )
				;;
		esac
	fi
}
complete -F _urpmi_addmedia urpmi.addmedia

# urpmi.removemedia completion
#
_urpmi_removemedia()
{
	local cur

	COMPREPLY=()
	cur=${COMP_WORDS[COMP_CWORD]}

	if [[ "$cur" == -* ]]; then
		# if word begins with a dash, return list of available options
		COMPREPLY=( $( compgen -W '-a -c -y -v -q --help' -- $cur ) )
	else
		# elsewhere, return list of available media
		_urpmi_medias
	fi

}
complete -F _urpmi_removemedia urpmi.removemedia