git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Jeff King <peff@peff.net>
To: Jeroen Meijer <jjgmeijer@hotmail.com>
Cc: git@vger.kernel.org
Subject: Re: possible bug in autocompletion
Date: Tue, 17 Jul 2012 08:12:32 -0400	[thread overview]
Message-ID: <20120717121232.GA32571@sigill.intra.peff.net> (raw)
In-Reply-To: <BLU0-SMTP405CDB35308082B180185A6B4DB0@phx.gbl>

On Tue, Jul 17, 2012 at 11:10:39AM +0200, Jeroen Meijer wrote:

> We have a tag name with some special characters. The tag name is
> 'Build%20V%20${bamboo.custom.jiraversion.name}%20Build%20721'. In
> somecases where autocompletion is used an error is given, such as
> 'bash: Build%20V%20${bamboo.custom.jiraversion.name}%20Build%20721:
> bad substitution'. This can be invoked by typing 'git checkout B' and
> then pressing tab.

Hrm. Weird. It is the "${}" in your tag name that causes the problem,
and it all boils down to bash trying to do parameter expansion on the
contents of "compgen -W". You can see it in a much simpler example:

  $ echo '${foo.bar}' ;# no expansion, works
  ${foo.bar}

  $ echo "${foo.bar}" ;# expansion, bash rightfully complains
  bash: ${foo.bar}: bad substitution

  $ compgen -W '${foo.bar}' f
  bash: ${foo.bar}: bad substitution

In the final command, we use single-quotes so there is no expansion
before the command execution. So it happens internally to compgen.
documentation for compgen says:

  -W wordlist
          The  wordlist is split using the characters in the IFS special vari‐
          able as delimiters, and each resultant word is expanded.  The possi‐
          ble  completions  are  the members of the resultant list which match
          the word being completed.

Which seems kind of crazy to me. It means that we need to be quoting
everything we feed to compgen to avoid accidental expansion. But I guess
bash is not likely to change anytime soon, so we probably need to work
around it.

> Of course; the tag is useless but still I guess this is a bug in the
> autocompletion of git.

Yeah, that tag is crazy. But this can happen anywhere that we feed
arbitrary data to compgen. Try this:

  echo content >'${foo.bar}' &&
  git add . &&
  git commit

  git show HEAD:<tab>

which generates the same error. Or even a file named "foo$bar", which is
much more likely; that will not generate an error, but it will expand
$bar and produce erroneous results. I think we also have issues with
files with single and double quotes in them.

Something like this seems to fix it for me:

diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
index ffedce7..2d20824 100644
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -261,7 +261,12 @@ __gitcomp ()
 __gitcomp_nl ()
 {
 	local IFS=$'\n'
-	COMPREPLY=($(compgen -P "${2-}" -S "${4- }" -W "$1" -- "${3-$cur}"))
+	local words=$1
+	words=${words//\\/\\\\}
+	words=${words//\$/\\\$}
+	words=${words//\'/\\\'}
+	words=${words//\"/\\\"}
+	COMPREPLY=($(compgen -P "${2-}" -S "${4- }" -W "$words" -- "${3-$cur}"))
 }
 
 __git_heads ()

but it is awfully ugly. Maybe completion experts can offer a better
solution.

-Peff

  reply	other threads:[~2012-07-17 12:12 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-07-17  9:10 possible bug in autocompletion Jeroen Meijer
2012-07-17 12:12 ` Jeff King [this message]
2012-09-19 17:08   ` Felipe Contreras
2012-09-19 17:43     ` Jeff King
2012-09-19 18:16       ` Felipe Contreras
2012-09-19 18:23         ` Felipe Contreras
2012-09-19 19:55           ` Jeff King
2012-09-19 23:08             ` Felipe Contreras
2012-09-19 23:43               ` Jeff King
2012-09-19 17:58     ` Junio C Hamano

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20120717121232.GA32571@sigill.intra.peff.net \
    --to=peff@peff.net \
    --cc=git@vger.kernel.org \
    --cc=jjgmeijer@hotmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).