Allow a patch range to be specified for 'series'
[stgit] / contrib / stgit-completion.bash
index 25549fb..6454ab1 100644 (file)
 #    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
 }