[PATCH v3 0/8] git-prompt: support more shells v3
- From
- Avi Halachmi via GitGitGadget <gitgitgadget@gmail.com>
- Date
- Aug 17, 2024, 09:25 UTC
- Message-ID
- <pull.1750.v3.git.git.1723886760.gitgitgadget@gmail.com>
- In-Reply-To
- <pull.1750.v2.git.git.1723727653.gitgitgadget@gmail.com>
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