X-Git-Url: https://git.distorted.org.uk/~mdw/stgit/blobdiff_plain/8ebae56bad042edf75f7d290469fea166a20d045..0aebdb85d6ff005a9ba9b020266e812c115b1ba0:/contrib/stgit-completion.bash diff --git a/contrib/stgit-completion.bash b/contrib/stgit-completion.bash index 25549fb..6454ab1 100644 --- a/contrib/stgit-completion.bash +++ b/contrib/stgit-completion.bash @@ -10,6 +10,46 @@ # 2. Add the following line to your .bashrc: # . ~/.stgit-completion.bash +_stg_commands=" + add + applied + assimilate + branch + delete + diff + clean + clone + commit + export + files + float + fold + goto + id + import + init + log + mail + new + patches + pick + pop + pull + push + rebase + refresh + rename + resolved + rm + series + show + status + sync + top + unapplied + uncommit +" + # The path to .git, or empty if we're not in a repository. _gitdir () { @@ -51,7 +91,13 @@ _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)$" +} + +# List the command options +_cmd_options () +{ + stg $1 --help | grep -e " --[A-Za-z]" | sed -e "s/.*\(--[^ =]\+\).*/\1/" } # Generate completions for patches and patch ranges from the given @@ -72,6 +118,21 @@ _complete_patch_range () esac } +_complete_patch_range_options () +{ + 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")) +} + # Generate completions for options from the given list. _complete_options () { @@ -79,45 +140,24 @@ _complete_options () 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 () +_stg_common () { - _complete_options "--message --showpatch --author --authname --authemail \ - --authdate --commname --commemail --help" + _complete_options "$(_cmd_options $1)" } -_stg_pop () +_stg_patches () { - _complete_patch_range _applied_patches "--all --number --keep --help" + _complete_patch_range "$2" "$(_cmd_options $1)" } -_stg_push () +_stg_patches_options () { - _complete_patch_range _unapplied_patches "--all --number --reverse \ - --merged --undo --help" + _complete_patch_range_options "$2" "$(_cmd_options $1)" "$3" } -_stg_status () +_stg_help () { - _complete_options "--modified --new --deleted --conflict --unknown \ - --noexclude --reset --help" + _complete_options "$_stg_commands" } _stg () @@ -134,22 +174,38 @@ _stg () # Complete name of subcommand. if [ $c -eq $COMP_CWORD -a -z "$command" ]; then COMPREPLY=($(compgen \ - -W "--help --version \ - $(stg help|grep '^ '|sed 's/ *\([^ ]\) .*/\1/')" \ + -W "--help --version copyright help $_stg_commands" \ -- "${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=() ;; + # generic commands + help) _stg_help ;; + # repository commands + id) _stg_patches $command _all_patches ;; + # stack commands + float) _stg_patches $command _all_patches ;; + goto) _stg_patches $command _all_other_patches ;; + pop) _stg_patches $command _applied_patches ;; + push) _stg_patches $command _unapplied_patches ;; + series) _stg_patches $command _all_patches ;; + # patch commands + 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" ;; + # all the other commands + *) _stg_common $command ;; esac }