# Programmable completion for the Subversion svn command under bash. Source
# this file (or on some systems add it to ~/.bash_completion and start a new
# shell) and bash's completion mechanism will know all about svn's options!
# Who wants to read man pages/help text...

# Known to work with bash 2.05a with programmable completion and extended
# pattern matching enabled (use 'shopt -s extglob progcomp' to enable
# these if they are not already enabled).

_svn()
{
	local cur cmds cmdOpts pOpts mOpts rOpts qOpts nOpts optsParam opt

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

	cmds='add checkout co cleanup commit ci copy cp delete del remove  \
	      rm diff di export import info h help list ls log merge mkdir \
	      move mv rename ren propdel pdel propedit pedit pe propget pget \
	      pg proplist plist pl propset pset ps revert resolve status stat \
	      st switch sw update up --version'

	if [[ $COMP_CWORD -eq 1 ]] ; then
		COMPREPLY=( $( compgen -W "$cmds" -- $cur ) )
		return 0
	else
		# if we're completing for 'svn help' or 'svn h', then just 
		# complete on any valid svn command
		case ${COMP_WORDS[1]} in
		help|h|\?)
			COMPREPLY=( $( compgen -W "$cmds" -- $cur ) )
			return 0
			;;
		*)
			;;
		esac
	fi

	# options that require a parameter
	# note: continued lines must end '|' continuing lines must start '|'
	optsParam="-r|--revision|-D|--date|--username|--password|--targets|\
	           |-x|--extensions|-m|--message|-F|--file|--message-encoding"

	# if not typing an option, or if the previous option required a
	# parameter, then fallback on ordinary filename expansion
	if [[ "$cur" != -* ]] || \
	   [[ ${COMP_WORDS[COMP_CWORD-1]} == @($optsParam) ]] ; then
		return 0
	fi

	pOpts="--username --password --no-auth-cache --non-interactive"
	mOpts="-m --message -F --file --message-encoding"
	rOpts="-r --revision"
	qOpts="-q --quiet"
	nOpts="-N --nonrecursive"

	# possible options for the command
	cmdOpts=
	case ${COMP_WORDS[1]} in
	--version)
		cmdOpts="$qOpts"
		;;
	add)
		cmdOpts="--targets -R --recursive $qOpts"
		;;
	checkout|co)
		cmdOpts="$rOpts $qOpts $nOpts $pOpts"
		;;
	cleanup)
		;;
	commit|ci)
		cmdOpts="$mOpts $qOpts $nOpts --targets --force $pOpts"
		;;
	copy|cp)
		cmdOpts="$mOpts $rOpts $qOpts $pOpts"
		;;
	delete|del|remove|rm)
		cmdOpts="--force $mOpts $qOpts --targets $pOpts"
		;;
	diff|di)
		cmdOpts="$rOpts -x --extensions $nOpts $pOpts"
		;;
	export)
		cmdOpts="$rOpts $qOpts $pOpts"
		;;
	import)
		cmdOpts="$mOpts $qOpts $nOpts --targets --force $pOpts"
		;; 
	info)
		cmdOpts="--targets -R --recursive"
		;;
	list|ls)
		cmdOpts="$rOpts -v --verbose -R --recursive $pOpts"
		;;
	log)
		cmdOpts="$rOpts -v --verbose --targets $pOpts --strict \
		        --incremental --xml"
		;;
	merge)
		cmdOpts="$rOpts $nOpts $qOpts --force --dry-run $pOpts"
		;;
	mkdir)
		cmdOpts="$mOpts $qOpts $pOpts"
		;;
	move|mv|rename|ren)
		cmdOpts="$mOpts $rOpts $qOpts $pOpts --force"
		;;
	propdel|pdel)
		cmdOpts="$qOpts -R --recursive $rOpts"
		;;
	propedit|pedit|pe)
		cmdOpts="$rOpts"
		;;
	propget|pget|pg)
		cmdOpts="-R --recursive $rOpts"
		;;
	proplist|plist|pl)
		cmdOpts="-v --verbose -R --recursive $rOpts"
		;;
	propset|pset|ps)
		cmdOpts="-F --file $qOpts --targets -R --recursive"
		;;
	revert)
		cmdOpts="--targets -R --recursive $qOpts"
		;;
	resolve)
		cmdOpts="--targets -R --recursive $qOpts"
		;;
	status|stat|st)
		cmdOpts="-u --show-updates -v --verbose $nOpts $qOpts $pOpts \
                         --no-ignore"
		;;
	switch|sw)
		cmdOpts="$rOpts $nOpts $qOpts $pOpts"
		;;
	update|up)
		cmdOpts="$rOpts $nOpts $qOpts $pOpts"
		;;
	*)
		;;
	esac

	# take out options already given
	for (( i=2; i<=$COMP_CWORD-1; ++i )) ; do
		opt=${COMP_WORDS[$i]}
		cmdOpts=" $cmdOpts "
		cmdOpts=${cmdOpts/ ${opt} / }

		# take out alternatives
		case $opt in
		-v)             cmdOpts=${cmdOpts/ --verbose / } ;;
		--verbose)      cmdOpts=${cmdOpts/ -v / } ;;
		-N)             cmdOpts=${cmdOpts/ --nonrecursive / } ;;
		--nonrecursive) cmdOpts=${cmdOpts/ -N / } ;;
		-R)             cmdOpts=${cmdOpts/ --recursive / } ;;
		--recursive)    cmdOpts=${cmdOpts/ -R / } ;;
		-x)             cmdOpts=${cmdOpts/ --extensions / } ;;
		--extensions)   cmdOpts=${cmdOpts/ -x / } ;;
		-q)             cmdOpts=${cmdOpts/ --quiet / } ;;
		--quiet)        cmdOpts=${cmdOpts/ -q / } ;;

		-r|--revision|-D|--date)
			cmdOpts=${cmdOpts/ --revision / }
			cmdOpts=${cmdOpts/ -r / }
			cmdOpts=${cmdOpts/ --date / }
			cmdOpts=${cmdOpts/ -D / }
			;;

		-m|--message|-F|--file)
			cmdOpts=${cmdOpts/ --message / }
			cmdOpts=${cmdOpts/ -m / }
			cmdOpts=${cmdOpts/ --file / }
			cmdOpts=${cmdOpts/ -F / }
			;;
		esac

		# skip next option if this one requires a parameter
		if [[ $opt == @($optsParam) ]] ; then
			((++i))
		fi
	done

	COMPREPLY=( $( compgen -W "$cmdOpts" -- $cur ) )

	return 0
}
complete -F _svn -o default svn
