# 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 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|\ |-d|--destination|-x|--extensions|-m|--message|-F|--file" # 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" 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 --recursive" ;; checkout|co) cmdOpts="-d --destination $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" ;; log) cmdOpts="$rOpts -v --verbose --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 --recursive" ;; propedit|pedit) cmdOpts="$qOpts --recursive" ;; propget|pget|pg) cmdOpts="--recursive" ;; proplist|plist|pl) cmdOpts="-v --verbose --recursive" ;; propset|pset|ps) cmdOpts="$mOpts --targets --recursive" ;; revert) cmdOpts="--targets --recursive" ;; resolve) cmdOpts="--targets" ;; 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 -d) cmdOpts=${cmdOpts/ --destination / } ;; --destination) cmdOpts=${cmdOpts/ -d / } ;; -v) cmdOpts=${cmdOpts/ --verbose / } ;; --verbose) cmdOpts=${cmdOpts/ -v / } ;; -n) cmdOpts=${cmdOpts/ --nonrecursive / } ;; --nonrecursive) cmdOpts=${cmdOpts/ -n / } ;; -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