Re: git-prompt.sh vs leading white space in __git_ps1()::printf_format
- From
Simon Oosthoek <s.oosthoek@xs4all.nl>
- Date
- Dec 26, 2012, 12:51 UTC
- Message-ID
- <20121226125120.GA16990@xs4all.nl>
- In-Reply-To
- <7vvcbpp846.fsf@alter.siamese.dyndns.org>
* Junio C Hamano <gitster@pobox.com> [2012-12-25 23:47:53 -0800]:
Show 13 quoted lines
> Can we make it take an optional third parameter so that we could say > > PROMPT_COMMAND='__git_ps1 ": \h \W" "; " "/%s"' > > to do the same as what the command substitution mode would have > given for > > PS1=': \h \W$(__git_ps1 "/%s"); ' > > perhaps? > > Totally untested, but perhaps along this line. >
I tried your patch and (to my surprise, after the first reading) it worked.
I've further modified git-prompt.sh to include more usage text and I changed the name of ps1 to gitstring, as it might be confused with PS1 upon casual reading.
I'll be sending a format-patch patchmail ASAP...
Show 68 quoted lines
> contrib/completion/git-prompt.sh | 24 ++++++++++++++----------
> 1 file changed, 14 insertions(+), 10 deletions(-)
>
> diff --git a/contrib/completion/git-prompt.sh b/contrib/completion/git-prompt.sh
> index 9b074e1..b2579f4 100644
> --- a/contrib/completion/git-prompt.sh
> +++ b/contrib/completion/git-prompt.sh
> @@ -236,9 +236,10 @@ __git_ps1 ()
> local printf_format=' (%s)'
>
> case "$#" in
> - 2) pcmode=yes
> + 2|3) pcmode=yes
> ps1pc_start="$1"
> ps1pc_end="$2"
> + printf_format="${3:-$printf_format}"
> ;;
> 0|1) printf_format="${1:-$printf_format}"
> ;;
> @@ -339,6 +340,7 @@ __git_ps1 ()
>
> local f="$w$i$s$u"
> if [ $pcmode = yes ]; then
> + local ps1=
> if [ -n "${GIT_PS1_SHOWCOLORHINTS-}" ]; then
> local c_red='\e[31m'
> local c_green='\e[32m'
> @@ -356,29 +358,31 @@ __git_ps1 ()
> branch_color="$bad_color"
> fi
>
> - # Setting PS1 directly with \[ and \] around colors
> + # Setting ps1 directly with \[ and \] around colors
> # is necessary to prevent wrapping issues!
> - PS1="$ps1pc_start (\[$branch_color\]$branchstring\[$c_clear\]"
> + ps1="\[$branch_color\]$branchstring\[$c_clear\]"
>
> if [ -n "$w$i$s$u$r$p" ]; then
> - PS1="$PS1 "
> + ps1="$ps1 "
> fi
> if [ "$w" = "*" ]; then
> - PS1="$PS1\[$bad_color\]$w"
> + ps1="$ps1\[$bad_color\]$w"
> fi
> if [ -n "$i" ]; then
> - PS1="$PS1\[$ok_color\]$i"
> + ps1="$ps1\[$ok_color\]$i"
> fi
> if [ -n "$s" ]; then
> - PS1="$PS1\[$flags_color\]$s"
> + ps1="$ps1\[$flags_color\]$s"
> fi
> if [ -n "$u" ]; then
> - PS1="$PS1\[$bad_color\]$u"
> + ps1="$ps1\[$bad_color\]$u"
> fi
> - PS1="$PS1\[$c_clear\]$r$p)$ps1pc_end"
> + ps1="$ps1\[$c_clear\]$r$p"
> else
> - PS1="$ps1pc_start ($c${b##refs/heads/}${f:+ $f}$r$p)$ps1pc_end"
> + ps1="$c${b##refs/heads/}${f:+ $f}$r$p"
> fi
> + ps1=$(printf -- "$printf_format" "$ps1")
> + PS1="$ps1pc_start$ps1$ps1pc_end"
> else
> # NO color option unless in PROMPT_COMMAND mode
> printf -- "$printf_format" "$c${b##refs/heads/}${f:+ $f}$r$p"/Simon