Re: [PATCH v2] bash: offer to show (un)staged changes
- From
Shawn O. Pearce <spearce@spearce.org>
- Date
- Feb 1, 2009, 22:29 UTC
- Message-ID
- <20090201222937.GP26880@spearce.org>
- In-Reply-To
- <1233526423-30694-1-git-send-email-trast@student.ethz.ch>
Thomas Rast <trast@student.ethz.ch> wrote:
Show 12 quoted lines
> Add a bit of code to __git_ps1 that lets it append '*' to the branch > name if there are any unstaged changes, and '+' if there are any > staged changes. > > Since this is a rather expensive operation and will force a lot of > data into the cache whenever you first enter a repository, you have to > enable it manually by setting bash.showDirtyState to a true value. > > Signed-off-by: Thomas Rast <trast@student.ethz.ch> > --- > > This got no replies... was there anything wrong with v2?
Dropped on the floor by me. Sorry.
But I'm a bit worried about the config --bool test in the prompt. Its a new fork+exec we weren't doing before. I wonder if we should use a shell variable to consider whether or not this should even be executed and try to shortcut out if not. E.g.:
if test -n "$GIT_PS1_SHOWDIRTYSTATE"; then
... your new code block ...
fiand ask that users at some point set GIT_PS1_SHOWDIRTYSTATE=1 in their shell startup scripts, and also set bash.showDirtyState true in any of the repositories they care about it in.
Show 42 quoted lines
> diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
> index f8b845a..7864ca7 100755
> --- a/contrib/completion/git-completion.bash
> +++ b/contrib/completion/git-completion.bash
> @@ -34,6 +34,10 @@
> # are currently in a git repository. The %s token will be
> # the name of the current branch.
> #
> +# In addition, if you set bash.showDirtyState to a true value,
> +# unstaged (*) and staged (+) changes will be shown next to the
> +# branch name.
> +#
> # To submit patches:
> #
> # *) Read Documentation/SubmittingPatches
> @@ -116,10 +120,24 @@ __git_ps1 ()
> fi
> fi
>
> + local w
> + local i
> +
> + if test "$(git config --bool bash.showDirtyState)" = "true"; then
> + git diff --no-ext-diff --ignore-submodules \
> + --quiet --exit-code || w="*"
> + if git rev-parse --quiet --verify HEAD >/dev/null; then
> + git diff-index --cached --quiet \
> + --ignore-submodules HEAD -- || i="+"
> + else
> + i="#"
> + fi
> + fi
> +
> if [ -n "${1-}" ]; then
> - printf "$1" "${b##refs/heads/}$r"
> + printf "$1" "${b##refs/heads/}$w$i$r"
> else
> - printf " (%s)" "${b##refs/heads/}$r"
> + printf " (%s)" "${b##refs/heads/}$w$i$r"
> fi
> fi
> }-- Shawn.