# bash completion support for StGIT -*- shell-script -*- # # Copyright (C) 2006, Karl Hasselström # Based on git-completion.sh # # To use these routines: # # 1. Copy this file to somewhere (e.g. ~/.stgit-completion.bash). # # 2. Add the following line to your .bashrc: # . ~/.stgit-completion.bash # The path to .git, or empty if we're not in a repository. _gitdir () { echo "$(git rev-parse --git-dir 2>/dev/null)" } # Name of the current branch, or empty if there isn't one. _current_branch () { local b=$(git symbolic-ref HEAD 2>/dev/null) echo ${b#refs/heads/} } # List of all applied patches. _applied_patches () { local g=$(_gitdir) [ "$g" ] && cat "$g/patches/$(_current_branch)/applied" } # List of all unapplied patches. _unapplied_patches () { local g=$(_gitdir) [ "$g" ] && cat "$g/patches/$(_current_branch)/unapplied" } # List of all patches. _all_patches () { local b=$(_current_branch) local g=$(_gitdir) [ "$g" ] && cat "$g/patches/$b/applied" "$g/patches/$b/unapplied" } # List of all patches except the current patch. _all_other_patches () { local b=$(_current_branch) local g=$(_gitdir) [ "$g" ] && cat "$g/patches/$b/applied" "$g/patches/$b/unapplied" \ | grep -v "^$(< $g/patches/$b/current)$" } # Generate completions for patches and patch ranges from the given # patch list function, and options from the given list. _complete_patch_range () { local patchlist="$1" options="$2" local pfx cur="${COMP_WORDS[COMP_CWORD]}" case "$cur" in *..*) pfx="${cur%..*}.." cur="${cur#*..}" COMPREPLY=($(compgen -P "$pfx" -W "$($patchlist)" -- "$cur")) ;; *) COMPREPLY=($(compgen -W "$options $($patchlist)" -- "$cur")) ;; esac } # Generate completions for options from the given list. _complete_options () { local options="$1" COMPREPLY=($(compgen -W "$options" -- "${COMP_WORDS[COMP_CWORD]}")) } _stg_delete () { _complete_patch_range _all_patches "--branch --help" } _stg_goto () { _complete_patch_range _all_other_patches "--help" } _stg_mail () { _complete_patch_range _all_patches \ "--all --to --cc --bcc --auto --noreply --version --prefix --template \ --cover --edit-cover --edit-patches --sleep --refid --smtp-user \ --smtp-password --branch --mbox --help" } _stg_new () { _complete_options "--message --showpatch --author --authname --authemail \ --authdate --commname --commemail --help" } _stg_pop () { _complete_patch_range _applied_patches "--all --number --keep --help" } _stg_push () { _complete_patch_range _unapplied_patches "--all --number --reverse \ --merged --undo --help" } _stg_status () { _complete_options "--modified --new --deleted --conflict --unknown \ --noexclude --reset --help" } _stg () { local i c=1 command while [ $c -lt $COMP_CWORD ]; do if [ $c == 1 ]; then command="${COMP_WORDS[c]}" fi c=$((++c)) done # Complete name of subcommand. if [ $c -eq $COMP_CWORD -a -z "$command" ]; then COMPREPLY=($(compgen \ -W "--help --version \ $(stg help|grep '^ '|sed 's/ *\([^ ]\) .*/\1/')" \ -- "${COMP_WORDS[COMP_CWORD]}")) return; fi # Complete arguments to subcommands. case "$command" in delete) _stg_delete ;; goto) _stg_goto ;; mail) _stg_mail ;; new) _stg_new ;; pop) _stg_pop ;; push) _stg_push ;; status) _stg_status ;; *) COMPREPLY=() ;; esac } complete -o default -F _stg stg