[PATCH v3 0/8] git-prompt: support more shells v3

Avi Halachmi via GitGitGadget
2024-08-17T09:26:04Z

This addresses review comments on part 5/8 v2 (git-prompt: add some missing
quotes) to fix typo in the commit message "aguments" into "arguments", but
which was used to reword it a bit so that it's more accurate.

Also addresses review comment on part 7/8 v2 (git-prompt: ta-da! document
usage in other shells) and fix typo "Conpatibility".

Avi Halachmi (:avih) (8):
git-prompt: use here-doc instead of here-string
git-prompt: fix uninitialized variable
git-prompt: don't use shell arrays
git-prompt: replace [[...]] with standard code
git-prompt: add some missing quotes
git-prompt: don't use shell $'...'
git-prompt: ta-da! document usage in other shells
git-prompt: support custom 0-width PS1 markers

contrib/completion/git-prompt.sh | 191 ++++++++++++++++++++-----------
1 file changed, 126 insertions(+), 65 deletions(-)

base-commit: d19b6cd2dd72dc811f19df4b32c7ed223256c3ee
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-1750%2Favih%2Fprompt-compat-v3
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-1750/avih/prompt-compat-v3
Pull-Request: https://github.com/git/git/pull/1750

Range-diff vs v2:

1: 9ce5ddadf0b = 1: 9ce5ddadf0b git-prompt: use here-doc instead of here-string
2: 680ecb52404 = 2: 680ecb52404 git-prompt: fix uninitialized variable
3: 7e994eae7bc = 3: 7e994eae7bc git-prompt: don't use shell arrays
4: 232340902a1 = 4: 232340902a1 git-prompt: replace [[...]] with standard code
5: 4f77b7eb7f1 ! 5: 3a41ad889cc git-prompt: add some missing quotes
@@ Commit message
not expanded: t="~"; a=${t}user b=\~foo~; echo "~user" $t/dir

But the main reason for quoting is to prevent IFS field splitting
- (which also coalesces IFS chars) and glob expansion after parameter
- expansion or command substitution.
+ (which also coalesces IFS chars) and glob expansion in parts which
+ contain parameter/arithmetic expansion or command substitution.

- In _command-arguments_, expanded/substituted values must be quoted:
+ "Simple command" (POSIX term) is assignment[s] and/or command [args].
+ Examples:
+ foo=bar # one assignment
+ foo=$bar x=y # two assignments
+ foo bar # command, no assignments
+ x=123 foo bar # one assignment and a command
+
+ The assignments part is not IFS-split or glob-expanded.
+
+ The command+args part does get IFS field split and glob expanded,
+ but only at unquoted expanded/substituted parts.
+
+ In the command+args part, expanded/substituted values must be quoted.
+ (the commands here are "[" and "local"):
Good: [ "$mode" = yes ]; local s="*" x="$y" e="$?" z="$(cmd ...)"
Bad: [ $mode = yes ]; local s=* x=$y e=$? z=$(cmd...)

- Still in _agumemts_, no need to quote non-expandable values:
+ The arguments to "local" do look like assignments, but they're not
+ the assignment part of a simple command. they're at the command part.
+
+ Still at the command part, no need to quote non-expandable values:
Good: local x= y=yes; echo OK
OK, but not required: local x="" y="yes"; echo "OK"
But completely empty (NULL) arguments must be quoted:
@@ Commit message
"local" does not behave with assignment context in some shells,
hence we require quotes when using "local" - for compatibility.

- First value in 'case...' doesn't IFS-split/glob, doesn't need quotes:
+ The value between 'case' and 'in' doesn't IFS-split/glob-expand:
Good: case * $foo $(cmd...) in ... ; esac
identical: case "* $foo $(cmd...)" in ... ; esac

6: 363b7015763 = 6: e735a1696a0 git-prompt: don't use shell $'...'
7: 4aa75cdb5dd ! 7: e70440e669a git-prompt: ta-da! document usage in other shells
@@ contrib/completion/git-prompt.sh
# GIT_PS1_HIDE_IF_PWD_IGNORED to a nonempty value. Override this on the
# repository level by setting bash.hideIfPwdIgnored to "false".
+#
-+# Conpatibility with other shells (beyond bash/zsh):
++# Compatibility with other shells (beyond bash/zsh):
+#
+# We require posix-ish shell plus "local" support, which is most
+# shells (even pdksh), but excluding ksh93 (because no "local").
8: e71ddcd2232 = 8: 633e71a01d3 git-prompt: support custom 0-width PS1 markers

--
gitgitgadget