git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH] git-prompt: use builtin test

From
BFBrad Forschinger <bnjf@bnjf.id.au>
Date
Jun 19, 2022, 01:26 UTC
Message-ID
<Yq57MP47M5fAzkFC@bnjf.id.au>
In-Reply-To
<YquwpxEoAVWen8tZ@coredump.intra.peff.net>
On Thu, Jun 16, 2022 at 06:37:27PM -0400, Jeff King wrote:
Show 13 quoted lines
> > The test and [ commands are used throughout the prompt generation.  They
> > also happen to be valid function names that can be defined, leading to
> > unintentional results.  Prevent the somewhat unusual case of this
> > happening by simply using [[, which is reserved.
> 
> Hmm. I do think we need to be a bit more paranoid about style in the
> prompt and completion code, because they are sourced into the user's
> shell alongside whatever other weird customizations they'd have. So we
> already have adjustments to work under "set -u", and so forth.
> 
> But at some point we may say "you have made the environment too hostile
> for us to function". Is redefining "test" to something that doesn't
> behave the same way such a case? Part of me wants to say yes. :)

I'd be inclined to agree! But disregarding a user with malicious intent, these environment changes can also be unintentional: I came across it when I stubbed out a quick test() function while prototyping something unrelated.

Show 7 quoted lines
> That said, if it's not _hard_ to support, maybe it is worth doing to be
> on the cautious side? A few thoughts:
> 
>   - my biggest concern on cost is that this is an unusual style for our
>     project (which usually writes in POSIX shell, though of course this
>     file is meant to be bash/zsh specific). Will it be a maintenance
>     burden going forward?

That's possible, but I suspect the burden is minimal. As you said, this is bash and zsh specific, and for those shell coders who only write Bourne dialect it's to be read as a "strong" left square bracket. For example, to minimize any shock to the eyeballs I've intentionally not re-written string operations `[ a = b ] && [ c = d ]` to `[[ a == b && c == d ]]`. I promise it wasn't mere laziness!

>   - this only changes git-prompt.sh; doesn't the completion code have
>     the same issue?

It does. Although there has been some movement towards the bash-specific builtin:

    $ git show v2.36.1:./git-completion.bash | awk '
      /(^\[|[^[]\[) |\<test\>/ && !++slb || /\[\[ / && !++dlb || 0;
      END { print slb, dlb; }'
    119 15
    $
This can be addressed in a future patch.
Show 15 quoted lines
>   - I don't write much bash-specific code, but I seem to recall that
>     "[[" has some subtle differences to "[". Is it sufficiently a
>     superset that these conversions are all equivalent?
>
>     I think some like:
> 
> > -	if [ $pcmode = yes ] && [ $ps1_expanded = yes ]; then
> > +	if [[ $pcmode = yes ]] && [[ $ps1_expanded = yes ]]; then
> 
>     are not equivalent, but it's an actual improvement (bash's builtin
>     "[[" isn't confused by unquoted empty variables), but I don't know
>     if there may be other gotchas.
> 
>     (I doubt this is an actual bug in the current code, as $pcmode
>     always seems to be set, but just a more defensive style).

Yeah, there's no word splitting or pathname expansion. Also, bash4 onwards changed the < and > operators within [[ to locale order rather than ASCII.

Regards, Brad

Previous: Jeff KingNext: Jeff King
Message 3 of 5 in “git-prompt: use builtin test”
  1. git-prompt: use builtin testBrad Forschinger via GitGitGadget, Jun 14, 2022
  2. Jeff KingJun 16, 2022
  3. Brad ForschingerJun 19, 2022
  4. Jeff KingJun 21, 2022
  5. Junio C HamanoJun 21, 2022

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.