bash prompt: use bash builtins to check stash state
[gitweb.git] / contrib / completion / git-prompt.sh
index 7d226251283f374a28e94ef91bfba2227dffb41c..afa867030de12916358d24e63c4335b4f43c8a91 100644 (file)
@@ -311,8 +311,12 @@ __git_ps1 ()
                ;;
        esac
 
-       local repo_info="$(git rev-parse --git-dir --is-inside-git-dir \
-               --is-bare-repository --is-inside-work-tree 2>/dev/null)"
+       local repo_info rev_parse_exit_code
+       repo_info="$(git rev-parse --git-dir --is-inside-git-dir \
+               --is-bare-repository --is-inside-work-tree \
+               --short HEAD 2>/dev/null)"
+       rev_parse_exit_code="$?"
+
        if [ -z "$repo_info" ]; then
                if [ $pcmode = yes ]; then
                        #In PC mode PS1 always needs to be set
@@ -321,6 +325,11 @@ __git_ps1 ()
                return
        fi
 
+       local short_sha
+       if [ "$rev_parse_exit_code" = "0" ]; then
+               short_sha="${repo_info##*$'\n'}"
+               repo_info="${repo_info%$'\n'*}"
+       fi
        local inside_worktree="${repo_info##*$'\n'}"
        repo_info="${repo_info%$'\n'*}"
        local bare_repo="${repo_info##*$'\n'}"
@@ -392,8 +401,7 @@ __git_ps1 ()
                                        git describe --tags --exact-match HEAD ;;
                                esac 2>/dev/null)" ||
 
-                               b="$(git rev-parse --short HEAD 2>/dev/null)..." ||
-                               b="unknown"
+                               b="$short_sha..."
                                b="($b)"
                        fi
                fi
@@ -421,14 +429,15 @@ __git_ps1 ()
                   [ "$(git config --bool bash.showDirtyState)" != "false" ]
                then
                        git diff --no-ext-diff --quiet --exit-code || w="*"
-                       if git rev-parse --quiet --verify HEAD >/dev/null; then
+                       if [ -n "$short_sha" ]; then
                                git diff-index --cached --quiet HEAD -- || i="+"
                        else
                                i="#"
                        fi
                fi
-               if [ -n "${GIT_PS1_SHOWSTASHSTATE-}" ]; then
-                       git rev-parse --verify refs/stash >/dev/null 2>&1 && s="$"
+               if [ -n "${GIT_PS1_SHOWSTASHSTATE-}" ] &&
+                  [ -r "$g/refs/stash" ]; then
+                       s="$"
                fi
 
                if [ -n "${GIT_PS1_SHOWUNTRACKEDFILES-}" ] &&