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