blob: c41488a4bbce32531740c8f677dfeeb965a9ce1e [file] [log] [blame]
# 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...
# Doesn't do --xml-file and its associated options, that's intentional :)
# 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"
mOpts="-m --message -F --file --message-encoding"
rOpts="-r --revision -D --date"
qOpts="-q --quiet"
nOpts="-N --nonrecursive"
# possible options for the command
cmdOpts=
case ${COMP_WORDS[1]} in
add)
cmdOpts="--targets -R --recursive"
;;
checkout|co)
cmdOpts="$nOpts $rOpts $pOpts $qOpts"
;;
cleanup)
;;
commit|ci)
cmdOpts="$mOpts $qOpts $nOpts --targets --force $pOpts"
;;
copy|cp)
cmdOpts="$mOpts $rOpts $pOpts"
;;
delete|del|remove|rm)
cmdOpts="--force $mOpts --targets $pOpts"
;;
diff|di)
cmdOpts="$nOpts $rOpts $pOpts -x --extensions"
;;
export)
cmdOpts="$rOpts $qOpts $pOpts"
;;
import)
cmdOpts="$mOpts $qOpts $nOpts $pOpts"
;;
info)
cmdOpts="--targets -R --recursive"
;;
list|ls)
cmdOpts="$rOpts"
;;
log)
cmdOpts="$rOpts -v --verbose --strict --targets --xml $pOpts"
;;
merge)
cmdOpts="$rOpts --force $nOpts $pOpts"
;;
mkdir)
cmdOpts="$mOpts $pOpts"
;;
move|mv|rename|ren)
cmdOpts="$mOpts $rOpts $pOpts --force"
;;
propdel|pdel)
cmdOpts="$qOpts -R --recursive"
;;
propedit|pedit)
cmdOpts="$qOpts -R --recursive"
;;
propget|pget|pg)
cmdOpts="-R --recursive"
;;
proplist|plist|pl)
cmdOpts="-v --verbose -R --recursive"
;;
propset|pset|ps)
cmdOpts="$mOpts --targets -R --recursive"
;;
revert)
cmdOpts="--targets -R --recursive"
;;
resolve)
cmdOpts="--targets -R --recursive"
;;
status|stat|st)
cmdOpts="-u --show-updates -v --verbose $nOpts $qOpts $pOpts"
;;
switch|sw)
cmdOpts="$rOpts $nOpts $pOpts"
;;
update|up)
cmdOpts="$rOpts $nOpts $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