diff --git a/lib/git.zsh b/lib/git.zsh index fb4ad8ca6..360fa9086 100644 --- a/lib/git.zsh +++ b/lib/git.zsh @@ -1,18 +1,20 @@ # get the name of the branch we are on function git_prompt_info() { - ref=$(git symbolic-ref HEAD 2> /dev/null) || return + git rev-parse 2> /dev/null || return + ref=$(git symbolic-ref HEAD 2> /dev/null || print '(no branch)') echo "$ZSH_THEME_GIT_PROMPT_PREFIX${ref#refs/heads/}$(parse_git_dirty)$ZSH_THEME_GIT_PROMPT_SUFFIX" } # Checks if working tree is dirty parse_git_dirty() { - local SUBMODULE_SYNTAX='' - if [[ $POST_1_7_2_GIT -gt 0 ]]; then - SUBMODULE_SYNTAX="--ignore-submodules=dirty" - fi - if [[ -n $(git status -s ${SUBMODULE_SYNTAX} 2> /dev/null) ]]; then - echo "$ZSH_THEME_GIT_PROMPT_DIRTY" + gitstatus=$(git status --porcelain ${SUBMODULE_SYNTAX} 2> /dev/null) + if [[ -n "$gitstatus" ]]; then + if [[ "$gitstatus" =~ '^[MADRCU].*$' ]] && (($+ZSH_THEME_GIT_PROMPT_STAGED)); then + echo "$ZSH_THEME_GIT_PROMPT_STAGED" + else + echo "$ZSH_THEME_GIT_PROMPT_DIRTY" + fi else echo "$ZSH_THEME_GIT_PROMPT_CLEAN" fi @@ -21,8 +23,16 @@ parse_git_dirty() { # Checks if there are commits ahead from remote function git_prompt_ahead() { - if $(echo "$(git log origin/$(current_branch)..HEAD 2> /dev/null)" | grep '^commit' &> /dev/null); then - echo "$ZSH_THEME_GIT_PROMPT_AHEAD" + ahead=$(git rev-list origin/$(current_branch)..HEAD -- 2> /dev/null) + behind=$(git rev-list HEAD..origin/$(current_branch) -- 2> /dev/null) + if [[ -n $ahead && -n $behind ]]; then + echo "$ZSH_THEME_GIT_PROMPT_DIVERGED" + elif [[ -n $ahead ]]; then + echo "$ZSH_THEME_GIT_PROMPT_AHEAD" + elif [[ -n $behind ]]; then + echo "$ZSH_THEME_GIT_PROMPT_BEHIND" + else + echo "$ZSH_THEME_GIT_PROMPT_UPTODATE" fi } diff --git a/themes/jgosmann.zsh-theme b/themes/jgosmann.zsh-theme new file mode 100644 index 000000000..0933b104b --- /dev/null +++ b/themes/jgosmann.zsh-theme @@ -0,0 +1,18 @@ +MODE_INDICATOR='%U' + +ZSH_THEME_GIT_PROMPT_STAGED='%F{yellow}' +ZSH_THEME_GIT_PROMPT_DIRTY='%F{red}' +ZSH_THEME_GIT_PROMPT_CLEAN='%F{green}' +ZSH_THEME_GIT_PROMPT_DIVERGED='↕' +ZSH_THEME_GIT_PROMPT_AHEAD='↑' +ZSH_THEME_GIT_PROMPT_BEHIND='↓' +ZSH_THEME_GIT_PROMPT_UPTODATE='|' + +function git_prompt_info() { + git rev-parse 2> /dev/null || return + ref=$(git symbolic-ref HEAD 2> /dev/null || print '(no branch)') + echo "$(git_prompt_ahead)$(parse_git_dirty)${ref#refs/heads/}" +} + +PROMPT='$(vi_mode_prompt_info 2> /dev/null)%m:%F{blue}%1~%f$(git_prompt_info)%{%(?.%F{green}.%F{red})%}%(!.#.>)%f%u ' +RPS1='%(?..%F{red}%? )%F{yellow}$(git_prompt_short_sha)%f'