#-*- mode: shell-script;-*- # Programmed completion for bash to use quilt # Copyright 2003-2004 Martin Quinson # This file is part of the distribution of quilt, and is distributed under # the same licence than quilt itself if type quilt &> /dev/null ; then if ! type _expand &> /dev/null ; then # This function expands tildes in pathnames # _expand() { [ "$cur" != "${cur%\\}" ] && cur="$cur"'\' # expand ~username type directory specifications if [[ "$cur" == \~*/* ]]; then eval cur=$cur elif [[ "$cur" == \~* ]]; then cur=${cur#\~} COMPREPLY=( $( compgen -P '~' -u $cur ) ) return ${#COMPREPLY[@]} fi } fi if ! type _filedir &> /dev/null ; then # This function performs file and directory completion. It's better than # simply using 'compgen -f', because it honours spaces in filenames # _filedir() { local IFS=$'\t\n' _expand || return 0 if [ "$1" = -d ]; then COMPREPLY=( ${COMPREPLY[@]} $( compgen -d -- $cur ) ) return 0 fi COMPREPLY=( ${COMPREPLY[@]} $( eval compgen -f -- \"$cur\" ) ) } fi if ! type _longopt &> /dev/null ; then _longopt() { local cur opt cur=${COMP_WORDS[COMP_CWORD]} if [[ "$cur" == "--*=*" ]]; then opt=${cur%%=*} # cut backlash that gets inserted before '=' sign opt=${opt%\\*} cur=${cur#*=} _filedir COMPREPLY=( $( compgen -P "$opt=" -W '${COMPREPLY[@]}' -- $cur)) return 0 fi if [[ "$cur" == "-*" ]]; then COMPREPLY=( $( $1 --help 2>&1 | sed -e '/--/!d' \ -e 's/.*\(--[-A-Za-z0-9]\+=\?\).*/\1/' | \ grep "^$cur" | sort -u ) ) elif [[ "$1" == "@(mk|rm)dir" ]]; then _filedir -d else _filedir fi } fi # Complete on files, not on directories # # Directories are shown in completion, but with their trailing / so that # user can go in them. It ought to be a more standard way to achieve this. # _quilt_comfile() { COMPREPLY=( ${COMPREPLY[@]:-} $( compgen -f -- "$cur" ) ) echo $( compgen -d -- "$cur" ) | while read d ; do COMPREPLY=( ${COMPREPLY[@]:-} "$d/" ) done } _quilt_completion() { local cur prev cmds command_matches COMPREPLY=() cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]} # quilt sub commands cmds='add applied delete diff edit files fold fork graph grep \ import new next patches pop previous push refresh remove \ series setup snapshot top unapplied' # if no command were given, complete on commands if [[ $COMP_CWORD -eq 1 ]] ; then COMPREPLY=( $( compgen -W "$cmds -h" -- $cur ) ) return 0 fi # if we're completing for 'quilt -h', then just # complete on any valid command if [ ${COMP_WORDS[1]} == -h ] ; then COMPREPLY=( $( compgen -W "$cmds" -- $cur ) ) return 0 fi # Accept a partial command if it's unique, because quilt will accept it. command_matches=( $(compgen -W "$cmds" -- ${COMP_WORDS[1]}) ) if [ ${#command_matches[@]} -ne 1 ] ; then return 0 fi # Complete depending on options case ${command_matches[0]} in add) case $prev in -p) COMPREPLY=( $( compgen -W "$(quilt applied)" -- $cur ) ) ;; *) _quilt_comfile COMPREPLY=( ${COMPREPLY[@]:-} $( compgen -W "-p -h" -- $cur ) ) ;; esac ;; applied) COMPREPLY=( $( compgen -W "-n -h $(quilt applied)" -- $cur ) ) ;; delete) COMPREPLY=( $( compgen -W "-h $(quilt series)" -- $cur ) ) ;; diff) case $prev in -p) COMPREPLY=( $( compgen -W "0 1" -- $cur ) ) ;; -P|-c) COMPREPLY=( $( compgen -W "$(quilt applied)" -- $cur ) ) ;; --diff|--snapshot) COMREPLY=( ) ;; *) _filedir COMPREPLY=( ${COMPREPLY[@]:-} $( compgen -W "-p -P -c -R -z -h --snapshot --diff --no-timestamps" -- $cur ) ) ;; esac ;; edit) _quilt_comfile COMPREPLY=( ${COMPREPLY[@]:-} $( compgen -W "-h" -- $cur ) ) ;; files) COMPREPLY=( $( compgen -W "-v -h $(quilt series)" -- $cur ) ) ;; fold) case $prev in -p) COMPREPLY=( $( compgen -W "0 1" -- $cur ) ) ;; *) COMPREPLY=( ${COMPREPLY[@]:-} $( compgen -W "-p" -- $cur ) ) ;; esac ;; fork) COMPREPLY=( ) ;; graph) COMPREPLY=( $( compgen -W "-h --all --reduce --lines --edge-labels $(quilt applied)" -- $cur ) ) ;; grep) _longopt grep COMPREPLY=( ${COMPREPLY[@]:-} $( compgen -W "-h" -- $cur ) ) ;; import) case $prev in -p) COMPREPLY=( $( compgen -W "0 1 2 3 4 5 6 7 8 9 10" -- $cur ) ) ;; -n) ;; *) _quilt_comfile COMPREPLY=( ${COMPREPLY[@]:-} $( compgen -W "-p -n -f -h" -- $cur ) ) ;; esac ;; new) ;; next|previous) COMPREPLY=( $( compgen -W "-n $(quilt series)" -- $cur ) ) ;; patches) _quilt_comfile COMPREPLY=( ${COMPREPLY[@]:-} $( compgen -W "-v -n -h" -- $cur ) ) ;; pop) COMPREPLY=( $( compgen -W "-a -f -R -q -v -h $(quilt applied)" -- $cur ) ) ;; push) COMPREPLY=( $( compgen -W "-a -f -R -q -v -h --leave-rejects --interactive $(quilt unapplied)" -- $cur ) ) ;; refresh) case $prev in -p) COMPREPLY=( $( compgen -W "0 1" -- $cur ) ) ;; *) COMPREPLY=( $( compgen -W "-p -f -h $(quilt applied) --no-timestamps" -- $cur ) ) ;; esac ;; remove) case $prev in -p) COMPREPLY=( $( compgen -W "$(quilt applied)" -- $cur ) ) ;; *) _quilt_comfile COMPREPLY=( ${COMPREPLY[@]:-} $( compgen -W "-p -h" -- $cur ) ) ;; esac ;; series) COMPREPLY=( $( compgen -W "-n -v -h" -- $cur ) ) ;; setup) case $prev in -d) _filedir -d ;; *) _quilt_comfile COMPREPLY=( ${COMPREPLY[@]:-} $( compgen -W "-d -v -h" -- $cur ) ) ;; esac ;; snapshot) COMPREPLY=( $( compgen -W "-d -h" -- $cur ) ) ;; top) ;; unapplied) COMPREPLY=( $( compgen -W "-n -h $(quilt series)" -- $cur ) ) ;; upgrade) ;; esac return 0 } [ ${BASH_VERSINFO[0]} '>' 2 -o \ ${BASH_VERSINFO[0]} = 2 -a ${BASH_VERSINFO[1]} '>' 04 ] \ && _quilt_complete_opt="-o filenames" complete -F _quilt_completion $_quilt_complete_opt quilt unset -v _quilt_complete_opt fi