threads / patch / 31220

patchgit bash completion handles alias options

Subject: [PATCH] git bash completion handles alias options

## tl;dr

2 messages between Aug 9, 2012 and Aug 9, 2012. Diffs are folded; open one to read it.

replies: 1people: 1as markdown or json

Jerome Reybert· Aug 9, 2012, 20:52 UTC · lore

git bash completion now handles git alias options. It means that options which change the completion behavior for complete commands will also change the behavior of completion for aliased command.

bash completion now handle git alias options. I did a use case in another commit: a checkout alias which only complete local branches, ie. only 'refs' ones, not 'remotes'. With this new alias completion, I added an option to do that in checkout command and hacked _git_checkout complete function.

Best,
  Jerome
Jerome Reybert (1):
  git bash completion handles alias options
 contrib/completion/git-completion.bash | 31 +++++++++++++++++++++++++------
 1 file changed, 25 insertions(+), 6 deletions(-)
-- 
1.7.12.rc0.91.gf4edd99
Jerome Reybert· Aug 9, 2012, 20:52 UTC · re: Jerome Reybert · lore

git bash completion now handles git alias options. It means that options which change the completion behavior for complete commands will also change the behavior of completion for aliased command.

bash completion now handle git alias options. I did a use case in another commit: a checkout alias which only complete local branches, ie. only 'refs' ones, not 'remotes'. With this new alias completion, I added an option to do that in checkout command and hacked _git_checkout complete function.

This is a draft version, bash usage should be improved. To achieve this:
 * a global array $alias_words is filled. As it is global and this file
   sourced, this variable can be seen from the terminal
 * __git_aliased_command fills $alias_words
 * __git_aliased_command must be called differently (not in a subshell)
   to fill the global variable. The return value $expansion is
   passed by reference as a parameter
 * __git_find_on_cmdline now search in $words and $alias_words
Signed-off-by: Jerome Reybert <jreybert@gmail.com>
---
 contrib/completion/git-completion.bash | 31 +++++++++++++++++++++++++------
 1 file changed, 25 insertions(+), 6 deletions(-)
Show changes to contrib/completion/git-completion.bash +25 −6
diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index ffedce7..dfceda0 100644
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -23,6 +23,9 @@
 #    3) Consider changing your PS1 to also show the current branch,
 #       see git-prompt.sh for details.
 
+alias_words=()
+alias_cword=0
+
 if [[ -n ${ZSH_VERSION-} ]]; then
 	autoload -U +X bashcompinit && bashcompinit
 fi
@@ -708,19 +711,22 @@ __git_aliased_command ()
 {
 	local word cmdline=$(git --git-dir="$(__gitdir)" \
 		config --get "alias.$1")
+
 	for word in $cmdline; do
 		case "$word" in
 		\!gitk|gitk)
-			echo "gitk"
+			eval "$2='gitk'"
 			return
 			;;
 		\!*)	: shell command alias ;;
-		-*)	: option ;;
+		-*)	: option
+			alias_words=("${alias_words[@]}" "$word")
+			((alias_cword++))
+			;;
 		*=*)	: setting env ;;
 		git)	: git itself ;;
 		*)
-			echo "$word"
-			return
+			eval "$2='$word'"
 		esac
 	done
 }
@@ -739,6 +745,17 @@ __git_find_on_cmdline ()
 		done
 		((c++))
 	done
+	c=0
+	while [ $c -lt $alias_cword ]; do
+		word="${alias_words[c]}"
+		for subcommand in $1; do
+			if [ "$subcommand" = "$word" ]; then
+				echo "$subcommand"
+				return
+			fi
+		done
+		((c++))
+	done
 }
 
 __git_has_doubledash ()
@@ -2353,6 +2370,8 @@ _git_whatchanged ()
 
 __git_main ()
 {
+	alias_words=()
+	alias_cword=0
 	local i c=1 command __git_dir
 
 	while [ $c -lt $cword ]; do
@@ -2394,8 +2413,8 @@ __git_main ()
 
 	local completion_func="_git_${command//-/_}"
 	declare -f $completion_func >/dev/null && $completion_func && return
-
-	local expansion=$(__git_aliased_command "$command")
+	local expansion=''
+	__git_aliased_command $command expansion
 	if [ -n "$expansion" ]; then
 		completion_func="_git_${expansion//-/_}"
 		declare -f $completion_func >/dev/null && $completion_func
-- 
1.7.12.rc0.91.gf4edd99

← back to recent threads