]> git.alrj.org Git - zsh.d.git/blobdiff - S60_git
Git prompt: Fix missing subdirectory
[zsh.d.git] / S60_git
diff --git a/S60_git b/S60_git
index 037e8b3aebb190ce5819caa6ba70b754f573e734..7a9ba7a1d0fbd4f060530a8f2ab119fdcc3ea202 100644 (file)
--- a/S60_git
+++ b/S60_git
@@ -1,17 +1,17 @@
 #! /usr/bin/zsh
 
-export __ZSH_GIT_BASEDIR=""
-export __ZSH_GIT_SUBDIR=""
-export __ZSH_GIT_BRANCH=""
-export __ZSH_GIT_ACTION=""
-export __ZSH_GIT_STATUS=""
-export __ZSH_GIT_VARS_INVALID=1
-export __ZSH_GIT_STATUS_INVALID=1
+__ZSH_GIT_BASEDIR=""
+__ZSH_GIT_SUBDIR=""
+__ZSH_GIT_BRANCH=""
+__ZSH_GIT_ACTION=""
+__ZSH_GIT_STATUS=""
+__ZSH_GIT_VARS_INVALID=1
+__ZSH_GIT_STATUS_INVALID=1
 
 
 git_chpwd() {
   # On cd, invalidate git status in prompt
-  export __ZSH_GIT_VARS_INVALID=1
+  __ZSH_GIT_VARS_INVALID=1
 }
 
 
@@ -19,12 +19,12 @@ git_preexec() {
   # On git command, invalidate git status in prompt
   case "$1" in
     git*)
-      export __ZSH_GIT_VARS_INVALID=1
+      __ZSH_GIT_VARS_INVALID=1
       ;;
   esac
 
   # *any* command could invalidate the repository status (new file, ...)
-  export __ZSH_GIT_STATUS_INVALID=1
+  __ZSH_GIT_STATUS_INVALID=1
 }
 
 
@@ -52,11 +52,11 @@ git_get_status() {
 
 
 git_parse() {
-    # psvar[3] == current action (merge, rebase, ...)
-    # psvar[4] == current branch
-    # psvar[5] == repository base directory
-    # psvar[6] == current subdir into repository
-    # psvar[7] == status (untracked, unstaged, staged)
+    # psvar[5] == current action (merge, rebase, ...)
+    # psvar[6] == current branch
+    # psvar[7] == repository base directory
+    # psvar[8] == current subdir into repository
+    # psvar[9] == status (untracked, unstaged, staged)
 
     local git_dir ref base_dir sub_dir action branch gitstat gitstatus
 
@@ -65,11 +65,11 @@ git_parse() {
     if [[ "${__ZSH_GIT_VARS_INVALID}" == "0" && "${__ZSH_GIT_STATUS_INVALID}" == "0" ]]; then
 
       # reuse previous values
-      psvar[3]=${__ZSH_GIT_ACTION}
-      psvar[4]=${__ZSH_GIT_BRANCH}
-      psvar[5]=${__ZSH_GIT_BASEDIR}
-      psvar[6]=${__ZSH_GIT_SUBDIR}
-      psvar[7]=${__ZSH_GIT_STATUS}
+      psvar[5]=${__ZSH_GIT_ACTION}
+      psvar[6]=${__ZSH_GIT_BRANCH}
+      psvar[7]=${__ZSH_GIT_BASEDIR}
+      psvar[8]=${__ZSH_GIT_SUBDIR}
+      psvar[9]=${__ZSH_GIT_STATUS}
 
       return
     fi
@@ -78,15 +78,15 @@ git_parse() {
     if [[ "${__ZSH_GIT_VARS_INVALID}" == "0" && "${__ZSH_GIT_STATUS_INVALID}" == "1" ]]; then
 
       # reuse previous values
-      psvar[3]=${__ZSH_GIT_ACTION}
-      psvar[4]=${__ZSH_GIT_BRANCH}
-      psvar[5]=${__ZSH_GIT_BASEDIR}
-      psvar[6]=${__ZSH_GIT_SUBDIR}
+      psvar[5]=${__ZSH_GIT_ACTION}
+      psvar[6]=${__ZSH_GIT_BRANCH}
+      psvar[7]=${__ZSH_GIT_BASEDIR}
+      psvar[8]=${__ZSH_GIT_SUBDIR}
 
-      export __ZSH_GIT_STATUS=$(git_get_status)
-      psvar[7]=${__ZSH_GIT_STATUS}
+      __ZSH_GIT_STATUS=$(git_get_status)
+      psvar[9]=${__ZSH_GIT_STATUS}
 
-      export __ZSH_GIT_STATUS_INVALID=0
+      __ZSH_GIT_STATUS_INVALID=0
       return
     fi
 
@@ -95,10 +95,15 @@ git_parse() {
 
     git_dir=$(git rev-parse --git-dir 2> /dev/null) || return
 
-    base_dir=${$(readlink -f "$git_dir/..")/$HOME/'~'}
+    if [[ "$(git rev-parse --is-bare-repository)" == "true" ]]; then
+      base_dir=${$(readlink -f "$git_dir")/$HOME/'~'}
+      sub_dir=${$(pwd)#$(readlink -f "$git_dir")}
+    else
+      base_dir=${$(readlink -f "$git_dir/..")/$HOME/'~'}
+      sub_dir=${$(pwd)#$(readlink -f "$git_dir/..")}
+    fi
 
-    sub_dir=$(git rev-parse --show-prefix)
-    sub_dir=${sub_dir%/}
+    sub_dir=${sub_dir#/}
     ref=$(git symbolic-ref HEAD 2> /dev/null) || return
 
     action=""
@@ -132,21 +137,21 @@ git_parse() {
     gitstatus=`git_get_status`
 
     # Got here, we're in git
-    psvar[3]=${action}
-    psvar[4]=${branch#refs/heads/}
-    psvar[5]=${base_dir}
-    psvar[6]=${sub_dir}
-    psvar[7]=${gitstatus}
+    psvar[5]=${action}
+    psvar[6]=${branch#refs/heads/}
+    psvar[7]=${base_dir}
+    psvar[8]=${sub_dir}
+    psvar[9]=${gitstatus}
     
     # Save for next time
-    export __ZSH_GIT_BASEDIR="${base_dir}"
-    export __ZSH_GIT_SUBDIR="${sub_dir}"
-    export __ZSH_GIT_BRANCH="${branch#refs/heads/}"
-    export __ZSH_GIT_ACTION="${action}"
-    export __ZSH_GIT_STATUS="${gitstatus}"
-
-    export __ZSH_GIT_VARS_INVALID=0
-    export __ZSH_GIT_STATUS_INVALID=0
+    __ZSH_GIT_BASEDIR="${base_dir}"
+    __ZSH_GIT_SUBDIR="${sub_dir}"
+    __ZSH_GIT_BRANCH="${branch#refs/heads/}"
+    __ZSH_GIT_ACTION="${action}"
+    __ZSH_GIT_STATUS="${gitstatus}"
+
+    __ZSH_GIT_VARS_INVALID=0
+    __ZSH_GIT_STATUS_INVALID=0
 }