Merge branch 'sg/bash-completion'
authorJunio C Hamano <gitster@pobox.com>
Tue, 6 Apr 2010 21:50:45 +0000 (14:50 -0700)
committerJunio C Hamano <gitster@pobox.com>
Tue, 6 Apr 2010 21:50:45 +0000 (14:50 -0700)
* sg/bash-completion:
bash: completion for gitk aliases
bash: support user-supplied completion scripts for aliases
bash: support user-supplied completion scripts for user's git commands
bash: improve aliased command recognition

1  2 
contrib/completion/git-completion.bash
index 733ac39a32f6fd0b4f1546d429ac55c4ad6699b6,3029f160b013da4452fecf242b959265af9da988..545bd4b38368e3c2a3958133bbeef6a19e831fff
@@@ -250,9 -250,7 +250,9 @@@ __git_refs (
                        refs="${cur%/*}"
                        ;;
                *)
 -                      if [ -e "$dir/HEAD" ]; then echo HEAD; fi
 +                      for i in HEAD FETCH_HEAD ORIG_HEAD MERGE_HEAD; do
 +                              if [ -e "$dir/$i" ]; then echo $i; fi
 +                      done
                        format="refname:short"
                        refs="refs/tags refs/heads refs/remotes"
                        ;;
@@@ -627,10 -625,19 +627,19 @@@ __git_aliased_command (
        local word cmdline=$(git --git-dir="$(__gitdir)" \
                config --get "alias.$1")
        for word in $cmdline; do
-               if [ "${word##-*}" ]; then
-                       echo $word
+               case "$word" in
+               \!gitk|gitk)
+                       echo "gitk"
                        return
-               fi
+                       ;;
+               \!*)    : shell command alias ;;
+               -*)     : option ;;
+               *=*)    : setting env ;;
+               git)    : git itself ;;
+               *)
+                       echo "$word"
+                       return
+               esac
        done
  }
  
@@@ -1084,6 -1091,11 +1093,11 @@@ _git_gc (
        COMPREPLY=()
  }
  
+ _git_gitk ()
+ {
+       _gitk
+ }
  _git_grep ()
  {
        __git_has_doubledash && return
@@@ -1436,6 -1448,11 +1450,11 @@@ _git_send_email (
        COMPREPLY=()
  }
  
+ _git_stage ()
+ {
+       _git_add
+ }
  __git_config_get_set_variables ()
  {
        local prevword word config_file= c=$COMP_CWORD
@@@ -2167,6 -2184,11 +2186,11 @@@ _git_tag (
        esac
  }
  
+ _git_whatchanged ()
+ {
+       _git_log
+ }
  _git ()
  {
        local i c=1 command __git_dir
                return
        fi
  
+       local completion_func="_git_${command//-/_}"
+       declare -F $completion_func >/dev/null && $completion_func && return
        local expansion=$(__git_aliased_command "$command")
-       [ "$expansion" ] && command="$expansion"
-       case "$command" in
-       am)          _git_am ;;
-       add)         _git_add ;;
-       apply)       _git_apply ;;
-       archive)     _git_archive ;;
-       bisect)      _git_bisect ;;
-       bundle)      _git_bundle ;;
-       branch)      _git_branch ;;
-       checkout)    _git_checkout ;;
-       cherry)      _git_cherry ;;
-       cherry-pick) _git_cherry_pick ;;
-       clean)       _git_clean ;;
-       clone)       _git_clone ;;
-       commit)      _git_commit ;;
-       config)      _git_config ;;
-       describe)    _git_describe ;;
-       diff)        _git_diff ;;
-       difftool)    _git_difftool ;;
-       fetch)       _git_fetch ;;
-       format-patch) _git_format_patch ;;
-       fsck)        _git_fsck ;;
-       gc)          _git_gc ;;
-       grep)        _git_grep ;;
-       help)        _git_help ;;
-       init)        _git_init ;;
-       log)         _git_log ;;
-       ls-files)    _git_ls_files ;;
-       ls-remote)   _git_ls_remote ;;
-       ls-tree)     _git_ls_tree ;;
-       merge)       _git_merge;;
-       mergetool)   _git_mergetool;;
-       merge-base)  _git_merge_base ;;
-       mv)          _git_mv ;;
-       name-rev)    _git_name_rev ;;
-       notes)       _git_notes ;;
-       pull)        _git_pull ;;
-       push)        _git_push ;;
-       rebase)      _git_rebase ;;
-       remote)      _git_remote ;;
-       replace)     _git_replace ;;
-       reset)       _git_reset ;;
-       revert)      _git_revert ;;
-       rm)          _git_rm ;;
-       send-email)  _git_send_email ;;
-       shortlog)    _git_shortlog ;;
-       show)        _git_show ;;
-       show-branch) _git_show_branch ;;
-       stash)       _git_stash ;;
-       stage)       _git_add ;;
-       submodule)   _git_submodule ;;
-       svn)         _git_svn ;;
-       tag)         _git_tag ;;
-       whatchanged) _git_log ;;
-       *)           COMPREPLY=() ;;
-       esac
+       if [ -n "$expansion" ]; then
+               completion_func="_git_${expansion//-/_}"
+               declare -F $completion_func >/dev/null && $completion_func
+       fi
  }
  
  _gitk ()