Hi, It was pointed out about a year ago that displaying the git-specific bash prompt on Windows/MinGW takes quite long, long enough to be noticeable. And indeed, while in a subdirectory of a repository and stash indicator enabled and my laptop running from battery I get this: $ time prompt=$(__git_ps1) real 0m0.412s user 0m0.048s sys 0m0.210s This is mainly caused by the numerous fork()s and exec()s to create subshells and run git commands, which are rather expensive on Windows. This patch series eliminates many command substitutions and git commands from __git_ps1() by reorganizing code or replacing them with bash builtins. This speeds up the prompt immensely: now I get the same prompt as above in about 10ms(!). Timing results are shown in the log message of patch 19. Unfortunately, to achive this users have to change their configuration, in particular change their $PS1 and $PROMPT_COMMAND (see patch 19) and should enable the discovery of git repositories across filesystem boundaries (see patch 10). There are two RFC patches in there (9 and 18), please have a look. Here's an outline of the series: First, a couple of tests for the bash prompt, to lessen the chance that I break something ;) These are basically the same patches that I sent out a while ago in [1], the only noteworthy change is that I renamed the helper library to lib-bash.sh (from lib-completion.sh), because all it does is to run tests under bash and there is nothing completion-specific in there. [1]: http://thread.gmane.org/gmane.comp.version-control.git/195587/focus=195711 [PATCH 01/19] tests: move code to run tests under bash into a helper library [PATCH 02/19] tests: add tests for the bash prompt functions in the completion script The next four patches contain a couple of fixes and cleanups: [PATCH 03/19] completion: use __gitdir() in _git_log() [PATCH 04/19] completion: respect $GIT_DIR [PATCH 05/19] bash prompt: don't show the prompt when .git/HEAD is unreadable [PATCH 06/19] bash prompt: return early from __git_ps1() when not in a git repository These four make __gitdir() faster, so they'll benefit not only the bash prompt but completing refs, aliases, config variables, etc., too. [PATCH 07/19] completion: make __gitdir() store repository path in $__git_dir [PATCH 08/19] completion: use $__git_dir instead of $(__gitdir) [RFC PATCH 09/19] completion: platform-specific helper function to get physical path [PATCH 10/19] completion: use bash builtins to search for repository These three make the main codepath in __git_ps1() faster by eliminating a couple of command substitutions and git commands. [PATCH 11/19] bash prompt: use bash builtins to find out current branch [PATCH 12/19] bash prompt: use bash builtins to check whether inside git dir [PATCH 13/19] bash prompt: check whether inside the worktree only when necessary Eliminate some more command substitutions and git commands that are not necessarily run for every prompt: [PATCH 14/19] bash prompt: use bash builtins to find out current branch during rebase [PATCH 15/19] bash prompt: use bash builtins to get detached HEAD abbrev. object name [PATCH 16/19] bash prompt: display stash and upstream state even inside the repository [PATCH 17/19] bash prompt: use bash builtins to check stash state [RFC PATCH 18/19] bash prompt: avoid command substitution when checking for untracked files And finally get rid of the command substitution used to include the git prompt in $PS1: [PATCH 19/19] bash prompt: alternative git prompt without command substitution Enjoy. Best, Gábor SZEDER Gábor (19): tests: move code to run tests under bash into a helper library tests: add tests for the bash prompt functions in the completion script completion: use __gitdir() in _git_log() completion: respect $GIT_DIR bash prompt: don't show the prompt when .git/HEAD is unreadable bash prompt: return early from __git_ps1() when not in a git repository completion: make __gitdir() store repository path in $__git_dir completion: use $__git_dir instead of $(__gitdir) completion: platform-specific helper function to get physical path completion: use bash builtins to search for repository bash prompt: use bash builtins to find out current branch bash prompt: use bash builtins to check whether inside git dir bash prompt: check whether inside the worktree only when necessary bash prompt: use bash builtins to find out current branch during rebase bash prompt: use bash builtins to get detached HEAD abbrev. object name bash prompt: display stash and upstream state even inside the repository bash prompt: use bash builtins to check stash state bash prompt: avoid command substitution when checking for untracked files bash prompt: alternative git prompt without command substitution contrib/completion/git-completion.bash | 315 ++++++++++------- t/lib-bash.sh | 18 + t/t9902-completion.sh | 14 +- t/t9903-bash-prompt.sh | 593 +++++++++++++++++++++++++++++++++ 4 files changed, 815 insertions(+), 125 deletions(-) create mode 100644 t/lib-bash.sh create mode 100755 t/t9903-bash-prompt.sh -- 1.7.10.1.541.gb1be298 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html