Re: [PATCH] bash prompt: add option to disable for a repository
- From
SZEDER Gábor <szeder@ira.uka.de>
- Date
- Nov 23, 2013, 16:35 UTC
- Message-ID
- <20131123163559.GB13824@goldbirke>
- In-Reply-To
- <1385212703-9611-1-git-send-email-hoxu@users.sf.net>
Hi,
On Sat, Nov 23, 2013 at 03:18:23PM +0200, Heikki Hokkanen wrote:
Show 6 quoted lines
> If bash.prompt is set to false, disable the prompt. This is useful > for huge repositories like the home directory. > > Signed-off-by: Heikki Hokkanen <hoxu@users.sf.net> > --- > git-prompt.sh performance seems to be quite bad for big repositories,
Hm, strange. I wonder what can cause performance problems in big repositories.
Sure, there are status indicators that can be expensive, in particular the indicators for dirty index/worktree, untracked files, and divergence from upstream. However, these must be enabled globally by environment variables and even then can already be disabled on a per-repo basis by configuration variables. And the rest of the prompt code should perform pretty much independently from the repository size.
Show 8 quoted lines
> so > without a way to disable it selectively for repositories, it becomes unusable > for people who have their homedir under git. This patch generalizes the problem > a bit by allowing the prompt to be disabled by setting bash.prompt to false in > any repository. > > contrib/completion/git-prompt.sh | 8 ++++++++ > 1 file changed, 8 insertions(+)
No tests.
Show 19 quoted lines
> diff --git a/contrib/completion/git-prompt.sh b/contrib/completion/git-prompt.sh > index 7b732d2..c982fde 100644 > --- a/contrib/completion/git-prompt.sh > +++ b/contrib/completion/git-prompt.sh > @@ -84,6 +84,8 @@ > # GIT_PS1_SHOWCOLORHINTS to a nonempty value. The colors are based on > # the colored output of "git status -sb" and are available only when > # using __git_ps1 for PROMPT_COMMAND or precmd. > +# > +# To disable prompt for a repository, run "git config bash.prompt false" > > # check whether printf supports -v > __git_printf_supports_v= > @@ -304,6 +306,12 @@ __git_ps1 () > return > fi > > + local prompt_setting > + prompt_setting=$(git config --bool bash.prompt)
I spent quite some time eliminating fork()s and exec()s from the prompt, so a fork() for the command substitution's subshell and a fork()+exec() for running a git command in the main code path saddens me deeply ;)
> + if [ -n "$prompt_setting" ] && [ "$prompt_setting" == "false" ]; then
If $prompt_setting must be false, then checking its non-emptyness is superfluous.
> + return
You can't just return from __git_ps1(), you must update PS1 in prompt command mode. See the few lines just above this hunk.
Show 8 quoted lines
> + fi
> +
> local short_sha
> if [ "$rev_parse_exit_code" = "0" ]; then
> short_sha="${repo_info##*$'\n'}"
> --
> 1.8.4
>