From: Karl Hasselström Date: Thu, 16 Nov 2006 19:45:31 +0000 (+0000) Subject: StGIT bash completion X-Git-Tag: v0.14.3~420 X-Git-Url: https://git.distorted.org.uk/~mdw/stgit/commitdiff_plain/8ebae56bad042edf75f7d290469fea166a20d045 StGIT bash completion A minimal bash completion script for StGIT. It completes the subcommand names, and options and patch names for some subcommands. Signed-off-by: Karl Hasselström --- diff --git a/TODO b/TODO index 63047a4..6f7a132 100644 --- a/TODO +++ b/TODO @@ -20,7 +20,6 @@ The future, when time allows or if someone else does them: - multiple heads in a patch - useful for forking a patch, synchronising with other patches (diff format or in other repositories) -- write bash-completion script for the StGIT commands - "pull" argument should default to a sane value, "origin" is wrong in many cases - commit directly to a patch which is not top diff --git a/contrib/stgit-completion.bash b/contrib/stgit-completion.bash new file mode 100644 index 0000000..25549fb --- /dev/null +++ b/contrib/stgit-completion.bash @@ -0,0 +1,156 @@ +# 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