threads / patch / 32717

patcht9902: Instruct git-completion.bash about a test mode

Subject: [PATCH] t9902: Instruct git-completion.bash about a test mode

## tl;dr

5 messages between Jan 24, 2013 and Jan 24, 2013. Diffs are folded; open one to read it.

replies: 4people: 2as markdown or json

Jean-Noël AVILA· Jan 24, 2013, 21:20 UTC · lore

In test mode, git completion should propose commands only if they belong to the list of authorized commands.

Signed-off-by: Jean-Noel Avila <jn.avila@free.fr>
---

Better show some code than try to explain. Here is what I mean by "filter the output git help -a".

 contrib/completion/git-completion.bash | 16 +++++++++++++++-
 t/t9902-completion.sh                  |  4 ++--
 2 files changed, 17 insertions(+), 3 deletions(-)
Show changes to 2 files +17 −3

contrib/completion/git-completion.bash, t/t9902-completion.sh

diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index 14dd5e7..6490553 100644
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -531,6 +531,20 @@ __git_complete_strategy ()
 	return 1
 }
 
+if test -z "$AUTHORIZED_CMD_LIST"; then
+	__git_cmdlist ()
+	{ 
+		echo $1;
+	}
+else
+	__git_cmdlist ()
+	{ 
+		if [[ " $AUTHORIZED_CMD_LIST " =~ " $1 " ]] ; then
+				echo $1
+		fi
+	}
+fi
+
 __git_list_all_commands ()
 {
 	local i IFS=" "$'\n'
@@ -538,7 +552,7 @@ __git_list_all_commands ()
 	do
 		case $i in
 		*--*)             : helper pattern;;
-		*) echo $i;;
+		*) __git_cmdlist $i;;
 		esac
 	done
 }
diff --git a/t/t9902-completion.sh b/t/t9902-completion.sh
index 3cd53f8..5e7d81e 100755
--- a/t/t9902-completion.sh
+++ b/t/t9902-completion.sh
@@ -12,8 +12,8 @@ complete ()
 	# do nothing
 	return 0
 }
-
-. "$GIT_BUILD_DIR/contrib/completion/git-completion.bash"
+AUTHORIZED_CMD_LIST=" checkout show add filter-branch ls-files send-email describe"
+. "$GIT_BUILD_DIR/contrib/completion/git-completion.bash" 
 
 # We don't need this function to actually join words or do anything special.
 # Also, it's cleaner to avoid touching bash's internal completion variables.
-- 
1.8.1.1.271.g02f55e6
Junio C Hamano· Jan 24, 2013, 21:46 UTC · re: Jean-Noël AVILA · lore

Re: [PATCH] t9902: Instruct git-completion.bash about a test mode

"Jean-Noël AVILA" <jn.avila@free.fr> writes:
Show 8 quoted lines
> In test mode, git completion should propose commands only if they
> belong to the list of authorized commands.
>
> Signed-off-by: Jean-Noel Avila <jn.avila@free.fr>
> ---
>
> Better show some code than try to explain. Here is what I mean by
> "filter the output git help -a". 

Why do you have to make an extra shell function call for each and every possible Git subcommand to slow down everybody's work when not in testing mode?

Comparing it with Peff's suggestion, it is fairly clear which one we should pick, I think.

Show 53 quoted lines
>  contrib/completion/git-completion.bash | 16 +++++++++++++++-
>  t/t9902-completion.sh                  |  4 ++--
>  2 files changed, 17 insertions(+), 3 deletions(-)
>
> diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
> index 14dd5e7..6490553 100644
> --- a/contrib/completion/git-completion.bash
> +++ b/contrib/completion/git-completion.bash
> @@ -531,6 +531,20 @@ __git_complete_strategy ()
>  	return 1
>  }
>  
> +if test -z "$AUTHORIZED_CMD_LIST"; then
> +	__git_cmdlist ()
> +	{ 
> +		echo $1;
> +	}
> +else
> +	__git_cmdlist ()
> +	{ 
> +		if [[ " $AUTHORIZED_CMD_LIST " =~ " $1 " ]] ; then
> +				echo $1
> +		fi
> +	}
> +fi
> +
>  __git_list_all_commands ()
>  {
>  	local i IFS=" "$'\n'
> @@ -538,7 +552,7 @@ __git_list_all_commands ()
>  	do
>  		case $i in
>  		*--*)             : helper pattern;;
> -		*) echo $i;;
> +		*) __git_cmdlist $i;;
>  		esac
>  	done
>  }
> diff --git a/t/t9902-completion.sh b/t/t9902-completion.sh
> index 3cd53f8..5e7d81e 100755
> --- a/t/t9902-completion.sh
> +++ b/t/t9902-completion.sh
> @@ -12,8 +12,8 @@ complete ()
>  	# do nothing
>  	return 0
>  }
> -
> -. "$GIT_BUILD_DIR/contrib/completion/git-completion.bash"
> +AUTHORIZED_CMD_LIST=" checkout show add filter-branch ls-files send-email describe"
> +. "$GIT_BUILD_DIR/contrib/completion/git-completion.bash" 
>  
>  # We don't need this function to actually join words or do anything special.
>  # Also, it's cleaner to avoid touching bash's internal completion variables.
Jean-Noël AVILA· Jan 24, 2013, 22:04 UTC · re: Junio C Hamano · lore

Re: [PATCH] t9902: Instruct git-completion.bash about a test mode

Le jeudi 24 janvier 2013 22:46:13, Junio C Hamano a écrit :
Show 15 quoted lines
> "Jean-Noël AVILA" <jn.avila@free.fr> writes:
> 
> > In test mode, git completion should propose commands only if they
> > belong to the list of authorized commands.
> >
> > Signed-off-by: Jean-Noel Avila <jn.avila@free.fr>
> > ---
> >
> > Better show some code than try to explain. Here is what I mean by
> > "filter the output git help -a". 
> 
> Why do you have to make an extra shell function call for each and
> every possible Git subcommand to slow down everybody's work when not
> in testing mode?
> 

My rational was to be sure to put the environment variable out of the way once the script has been sourced. I can make two alternative definitions of __git_list_all_commands () depending on the presence of $AUTHORIZED_CMD_LIST if you are worried about performance.

Show 63 quoted lines
> Comparing it with Peff's suggestion, it is fairly clear which one we
> should pick, I think.
> 
> 
> 
> >  contrib/completion/git-completion.bash | 16 +++++++++++++++-
> >  t/t9902-completion.sh                  |  4 ++--
> >  2 files changed, 17 insertions(+), 3 deletions(-)
> >
> > diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
> > index 14dd5e7..6490553 100644
> > --- a/contrib/completion/git-completion.bash
> > +++ b/contrib/completion/git-completion.bash
> > @@ -531,6 +531,20 @@ __git_complete_strategy ()
> >  	return 1
> >  }
> >  
> > +if test -z "$AUTHORIZED_CMD_LIST"; then
> > +	__git_cmdlist ()
> > +	{ 
> > +		echo $1;
> > +	}
> > +else
> > +	__git_cmdlist ()
> > +	{ 
> > +		if [[ " $AUTHORIZED_CMD_LIST " =~ " $1 " ]] ; then
> > +				echo $1
> > +		fi
> > +	}
> > +fi
> > +
> >  __git_list_all_commands ()
> >  {
> >  	local i IFS=" "$'\n'
> > @@ -538,7 +552,7 @@ __git_list_all_commands ()
> >  	do
> >  		case $i in
> >  		*--*)             : helper pattern;;
> > -		*) echo $i;;
> > +		*) __git_cmdlist $i;;
> >  		esac
> >  	done
> >  }
> > diff --git a/t/t9902-completion.sh b/t/t9902-completion.sh
> > index 3cd53f8..5e7d81e 100755
> > --- a/t/t9902-completion.sh
> > +++ b/t/t9902-completion.sh
> > @@ -12,8 +12,8 @@ complete ()
> >  	# do nothing
> >  	return 0
> >  }
> > -
> > -. "$GIT_BUILD_DIR/contrib/completion/git-completion.bash"
> > +AUTHORIZED_CMD_LIST=" checkout show add filter-branch ls-files send-email describe"
> > +. "$GIT_BUILD_DIR/contrib/completion/git-completion.bash" 
> >  
> >  # We don't need this function to actually join words or do anything special.
> >  # Also, it's cleaner to avoid touching bash's internal completion variables.
> --
> To unsubscribe from this list: send the line "unsubscribe git" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 
Junio C Hamano· Jan 24, 2013, 22:29 UTC · re: Jean-Noël AVILA · lore

Re: [PATCH] t9902: Instruct git-completion.bash about a test mode

"Jean-Noël AVILA" <jn.avila@free.fr> writes:
> My rational was to be sure to put the environment variable out of the 
> way once the script has been sourced. I can make two alternative 
> definitions of __git_list_all_commands () depending on the presence of 
> $AUTHORIZED_CMD_LIST if you are worried about performance.

Actually, it does not matter, as once __git_list_all_commands is run, its result is kept in a variable.

So Peff's
  if test -z "$FAKE_COMMAND_LIST"; then
          __git_cmdlist() {
                  git help -a | egrep '^  [a-zA-Z0-9]'
          }
  else
          __git_cmdlist() {
                  printf '%s' "$FAKE_COMMAND_LIST"
          }
  fi

would be just as simple if not simpler, does the same thing, and is sufficient, I think.

The t9902 test is only interested in making sure that the completion works, and we do not want "git help -a" that omits a subcommand from its output that is not built in your particular environment to get in the way, which will not be an issue with this approach.

Jean-Noël AVILA· Jan 24, 2013, 22:56 UTC · re: Junio C Hamano · lore

Re: [PATCH] t9902: Instruct git-completion.bash about a test mode

Le jeudi 24 janvier 2013 23:29:33, Junio C Hamano a écrit :
Show 30 quoted lines
> "Jean-Noël AVILA" <jn.avila@free.fr> writes:
> 
> > My rational was to be sure to put the environment variable out of the 
> > way once the script has been sourced. I can make two alternative 
> > definitions of __git_list_all_commands () depending on the presence of 
> > $AUTHORIZED_CMD_LIST if you are worried about performance.
> 
> Actually, it does not matter, as once __git_list_all_commands is
> run, its result is kept in a variable.
> 
> So Peff's
> 
>   if test -z "$FAKE_COMMAND_LIST"; then
>           __git_cmdlist() {
>                   git help -a | egrep '^  [a-zA-Z0-9]'
>           }
>   else
>           __git_cmdlist() {
>                   printf '%s' "$FAKE_COMMAND_LIST"
>           }
>   fi
> 
> would be just as simple if not simpler, does the same thing, and is
> sufficient, I think.
> 
> The t9902 test is only interested in making sure that the completion
> works, and we do not want "git help -a" that omits a subcommand from
> its output that is not built in your particular environment to get
> in the way, which will not be an issue with this approach.
> 

Ah. I totally missed the point. I though that the requested change was to intersect the list needed for the test with the one provided by the standard completion.

← back to recent threads