X-Git-Url: https://git.alrj.org/?p=zsh.d.git;a=blobdiff_plain;f=S60_git;h=1061cf575a0a04d47412070ac157bdf7cc2b71fa;hp=54e61d477ad110bc101814a157c7fdf88db7c995;hb=HEAD;hpb=4e8ef2688401ea492adc5ded48d85f447e9100ac diff --git a/S60_git b/S60_git index 54e61d4..1061cf5 100644 --- a/S60_git +++ b/S60_git @@ -1,10 +1,12 @@ #! /usr/bin/zsh +# Those can be used, for instance to construct the prompt: __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 @@ -12,6 +14,7 @@ __ZSH_GIT_STATUS_INVALID=1 git_chpwd() { # On cd, invalidate git status in prompt __ZSH_GIT_VARS_INVALID=1 + __ZSH_GIT_BASEDIR="" } @@ -27,24 +30,31 @@ git_preexec() { __ZSH_GIT_STATUS_INVALID=1 } - git_get_status() { # Return only git status local gitstat gitstatus - gitstat=$(git status 2> /dev/null | grep '\(# Untracked\|# Changes\|# Changed but not updated:\)') + gitstat=$(LANG=C git status 2> /dev/null | grep '\(Untracked\|Changes\|Changed but not updated:\)') + # 'fix for mcedit parser gitstatus="" - if [[ $(echo ${gitstat} | grep -c "^# Changes to be committed:$") > 0 ]]; then - gitstatus='+' + if [[ $(echo ${gitstat} | grep -c "^Changes to be committed:$") > 0 ]]; then + gitstatus='✚' + fi + + if [[ $(echo ${gitstat} | grep -c "^Changed but not updated:$") > 0 || \ + $(echo ${gitstat} | grep -c "^Changes not staged for commit:$") > 0 ]]; then + gitstatus="${gitstatus}✹" fi - if [[ $(echo ${gitstat} | grep -c "^\# Changed but not updated:$") > 0 ]]; then - gitstatus="${gitstatus}!" + if [[ $(echo ${gitstat} | grep -c "^Untracked files:$") > 0 ]]; then + gitstatus="${gitstatus}★" fi - if [[ $(echo ${gitstat} | grep -c "^# Untracked files:$") > 0 ]]; then - gitstatus="${gitstatus}?" + if [[ -z $gitstatus ]]; then + gitstatus="%{${fg_bold[green]}%}✔%{$reset_color%}" + else + gitstatus="%{${fg_bold[yellow]}%}$gitstatus%{$reset_color%}" fi echo $gitstatus @@ -52,40 +62,16 @@ git_get_status() { git_parse() { - # 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 - # If nothing has been invalidated if [[ "${__ZSH_GIT_VARS_INVALID}" == "0" && "${__ZSH_GIT_STATUS_INVALID}" == "0" ]]; then - - # reuse previous values - 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 # If only status has been invalidated if [[ "${__ZSH_GIT_VARS_INVALID}" == "0" && "${__ZSH_GIT_STATUS_INVALID}" == "1" ]]; then - - # reuse previous values - psvar[5]=${__ZSH_GIT_ACTION} - psvar[6]=${__ZSH_GIT_BRANCH} - psvar[7]=${__ZSH_GIT_BASEDIR} - psvar[8]=${__ZSH_GIT_SUBDIR} - __ZSH_GIT_STATUS=$(git_get_status) - psvar[9]=${__ZSH_GIT_STATUS} - __ZSH_GIT_STATUS_INVALID=0 return fi @@ -95,10 +81,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="" @@ -122,28 +113,18 @@ git_parse() { action="-merge" branch="$ref" else - test -f "$git_dir/BISECT_LOG" && psvar[3]="bisect" + test -f "$git_dir/BISECT_LOG" && action="-bisect" branch="$(git symbolic-ref HEAD 2>/dev/null)" || \ branch="$(git describe --exact-match HEAD 2>/dev/null)" || \ branch="$(cut -c1-7 "$git_dir/HEAD")..." fi - # Status - gitstatus=`git_get_status` - - # Got here, we're in git - psvar[5]=${action} - psvar[6]=${branch#refs/heads/} - psvar[7]=${base_dir} - psvar[8]=${sub_dir} - psvar[9]=${gitstatus} - - # Save for next time + __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_STATUS=`git_get_status` __ZSH_GIT_VARS_INVALID=0 __ZSH_GIT_STATUS_INVALID=0