From 38f7dbc0bb891719c2773714c170fe8fea035d95 Mon Sep 17 00:00:00 2001 From: hgmoll Date: Wed, 13 Jul 2016 15:12:43 +0200 Subject: [PATCH] Fix index lock issue --- gitprompt.sh | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/gitprompt.sh b/gitprompt.sh index 992436f..86c9d22 100755 --- a/gitprompt.sh +++ b/gitprompt.sh @@ -437,6 +437,20 @@ function replaceSymbols() { echo ${VALUE2//_PREHASH_/${GIT_PROMPT_SYMBOLS_PREHASH}} } +function createPrivateIndex { + # Create a copy of the index to avoid conflicts with parallel git commands, e.g. git rebase. + local __GIT_INDEX_FILE + local __GIT_INDEX_PRIVATE + if [[ -z "$GIT_INDEX_FILE" ]]; then + __GIT_INDEX_FILE="$(git rev-parse --git-dir)/index" + else + __GIT_INDEX_FILE="$GIT_INDEX_FILE" + fi + __GIT_INDEX_PRIVATE="/tmp/git-index-private$$" + cp "$__GIT_INDEX_FILE" "$__GIT_INDEX_PRIVATE" 2>/dev/null + echo "$__GIT_INDEX_PRIVATE" +} + function updatePrompt() { local LAST_COMMAND_INDICATOR local PROMPT_LEADING_SPACE @@ -456,6 +470,11 @@ function updatePrompt() { export __GIT_PROMPT_SHOW_UNTRACKED_FILES=${GIT_PROMPT_SHOW_UNTRACKED_FILES} fi + local GIT_INDEX_PRIVATE="$(createPrivateIndex)" + #important to define GIT_INDEX_FILE as local: This way it only affects this function (and below) - even with the export afterwards + local GIT_INDEX_FILE + export GIT_INDEX_FILE="$GIT_INDEX_PRIVATE" + local -a git_status_fields git_status_fields=($("$__GIT_STATUS_CMD" 2>/dev/null)) @@ -528,6 +547,7 @@ function updatePrompt() { fi PS1="${NEW_PROMPT//_LAST_COMMAND_INDICATOR_/${LAST_COMMAND_INDICATOR}${ResetColor}}" + rm "$GIT_INDEX_PRIVATE" 2>/dev/null } # Helper function that returns virtual env information to be set in prompt