# 2. Add the following line to your .bashrc:
# . ~/.stgit-completion.bash
+_stg_commands="
+ add
+ applied
+ assimilate
+ branch
+ delete
+ diff
+ clean
+ clone
+ commit
+ cp
+ export
+ files
+ float
+ fold
+ goto
+ hide
+ id
+ import
+ init
+ log
+ mail
+ new
+ patches
+ pick
+ 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.
_gitdir ()
{
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 2>/dev/null | grep -e " --[A-Za-z]" | sed -e "s/.*\(--[^ =]\+\).*/\1/"
}
# Generate completions for patches and patch ranges from the given
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]}"))
-}
-
-_stg_delete ()
-{
- _complete_patch_range _all_patches "--branch --help"
+ 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_goto ()
+_complete_branch ()
{
- _complete_patch_range _all_other_patches "--help"
+ COMPREPLY=($(compgen -W "$(_cmd_options $1) $($2)" -- "${COMP_WORDS[COMP_CWORD]}"))
}
-_stg_mail ()
+# Generate completions for options from the given list.
+_complete_options ()
{
- _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"
+ local options="$1"
+ COMPREPLY=($(compgen -W "$options" -- "${COMP_WORDS[COMP_CWORD]}"))
}
-_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 ()
# 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 ;;
+ 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_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
}