X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/stgit/blobdiff_plain/1aaf55c91fc987f64499091bc26a519fb7815dac..c4f99b6c10c3bc2558fe8d9050bcaaa3efb830b0:/contrib/stgit-completion.bash diff --git a/contrib/stgit-completion.bash b/contrib/stgit-completion.bash index 6f6ff3b..d497098 100644 --- a/contrib/stgit-completion.bash +++ b/contrib/stgit-completion.bash @@ -20,11 +20,13 @@ _stg_commands=" clean clone commit + cp export files float fold goto + hide id import init @@ -36,16 +38,20 @@ _stg_commands=" pop pull push + rebase refresh rename resolved rm series show + sink status + sync top unapplied uncommit + unhide " # The path to .git, or empty if we're not in a repository. @@ -89,13 +95,19 @@ _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)$" + | grep -v "^$(cat $g/patches/$b/current 2> /dev/null)$" +} + +_all_branches () +{ + local g=$(_gitdir) + [ "$g" ] && (cd .git/patches/ && echo *) } # List the command options _cmd_options () { - stg $1 --help | grep -e " --[A-Za-z]" | sed -e "s/.*\(--[^ =]\+\).*/\1/" + stg $1 --help 2>/dev/null | grep -e " --[A-Za-z]" | sed -e "s/.*\(--[^ =]\+\).*/\1/" } # Generate completions for patches and patch ranges from the given @@ -116,36 +128,46 @@ _complete_patch_range () esac } -# Generate completions for options from the given list. -_complete_options () +_complete_patch_range_options () { - local options="$1" - COMPREPLY=($(compgen -W "$options" -- "${COMP_WORDS[COMP_CWORD]}")) + local patchlist="$1" options="$2" patch_options="$3" + local prev="${COMP_WORDS[COMP_CWORD-1]}" + local cur="${COMP_WORDS[COMP_CWORD]}" + local popt + for popt in $patch_options; do + if [ $prev == $popt ]; then + _complete_patch_range $patchlist + return + fi + done + COMPREPLY=($(compgen -W "$options" -- "$cur")) } -_stg_common () +_complete_branch () { - _complete_options "$(_cmd_options $1)" + COMPREPLY=($(compgen -W "$(_cmd_options $1) $($2)" -- "${COMP_WORDS[COMP_CWORD]}")) } -_stg_all_patches () +# Generate completions for options from the given list. +_complete_options () { - _complete_patch_range _all_patches "$(_cmd_options $1)" + local options="$1" + COMPREPLY=($(compgen -W "$options" -- "${COMP_WORDS[COMP_CWORD]}")) } -_stg_other_patches () +_stg_common () { - _complete_patch_range _all_other_patches "$(_cmd_options $1)" + _complete_options "$(_cmd_options $1)" } -_stg_applied_patches () +_stg_patches () { - _complete_patch_range _applied_patches "$(_cmd_options $1)" + _complete_patch_range "$2" "$(_cmd_options $1)" } -_stg_unapplied_patches () +_stg_patches_options () { - _complete_patch_range _unapplied_patches "$(_cmd_options $1)" + _complete_patch_range_options "$2" "$(_cmd_options $1)" "$3" } _stg_help () @@ -177,21 +199,32 @@ _stg () # generic commands help) _stg_help ;; # repository commands - id) _stg_all_patches $command ;; + id) _stg_patches $command _all_patches ;; # stack commands - float) _stg_all_patches $command ;; - goto) _stg_other_patches $command ;; - pop) _stg_applied_patches $command ;; - push) _stg_unapplied_patches $command ;; + float) _stg_patches $command _all_patches ;; + goto) _stg_patches $command _all_other_patches ;; + hide) _stg_patches $command _all_patches ;; + pop) _stg_patches $command _applied_patches ;; + push) _stg_patches $command _unapplied_patches ;; + series) _stg_patches $command _all_patches ;; + sink) _stg_patches $command _all_patches ;; + unhide) _stg_patches $command _all_patches ;; # patch commands - delete) _stg_all_patches $command ;; - export) _stg_applied_patches $command ;; - files) _stg_all_patches $command ;; - log) _stg_all_patches $command ;; - mail) _stg_applied_patches $command ;; - pick) _stg_unapplied_patches $command ;; - rename) _stg_all_patches $command ;; - show) _stg_all_patches $command ;; + delete) _stg_patches $command _all_patches ;; + export) _stg_patches $command _applied_patches ;; + files) _stg_patches $command _all_patches ;; + log) _stg_patches $command _all_patches ;; + mail) _stg_patches $command _all_patches ;; + pick) _stg_patches $command _unapplied_patches ;; + refresh)_stg_patches_options $command _applied_patches "-p --patch" ;; + rename) _stg_patches $command _all_patches ;; + show) _stg_patches $command _all_patches ;; + sync) _stg_patches $command _applied_patches ;; + # working-copy commands + diff) _stg_patches_options $command _applied_patches "-r --range" ;; + # commands that usually raher accept branches + branch) _complete_branch $command _all_branches ;; + rebase) _complete_branch $command _all_branches ;; # all the other commands *) _stg_common $command ;; esac