From f804958710e50a4f477e63a20fa1318de9a5ad64 Mon Sep 17 00:00:00 2001 From: Frank Gruellich Date: Thu, 4 Sep 2014 15:24:07 +0200 Subject: [PATCH] working version --- lib/git.zsh | 80 ++++++++++++++++++++++++++++++++++++++---- themes/frank.zsh-theme | 27 +++++++++++--- 2 files changed, 97 insertions(+), 10 deletions(-) diff --git a/lib/git.zsh b/lib/git.zsh index 7aa5a0ea2..d03609546 100644 --- a/lib/git.zsh +++ b/lib/git.zsh @@ -1,10 +1,78 @@ -# get the name of the branch we are on +autoload -U add-zsh-hook +add-zsh-hook chpwd update_git_vars +add-zsh-hook preexec schedule_update_git_vars_if_git_cmd +add-zsh-hook precmd update_git_vars_if_scheduled + +function schedule_update_git_vars_if_git_cmd() { + case "$2" in + git*) + __UPDATE_GIT_VARS_NEEDED="true" + ;; + esac +} + +function update_git_vars_if_scheduled() { + if [ "$__UPDATE_GIT_VARS_NEEDED" == "true" ] + then + update_git_vars + unset __UPDATE_GIT_VARS_NEEDED + fi +} + +function update_git_vars() { + local output merge_ref remote_ref remote + local _branch _ahead _behind _staged _conflict _changed _untracked + local branch ahead behind staged conflict changed untracked + unset GIT_STATUS + output="`git symbolic-ref HEAD 2>/dev/null`" || \ + output="`git rev-parse --short HEAD 2>/dev/null`" || return 0 + _branch="${output#refs/heads/}" + + output="`git config branch.$_branch.remote 2>/dev/null`" + if [ -n "$output" ] + then + remote="$output" + merge_ref="`git config branch.$_branch.merge`" + if [ "$remote" == "." ] + then + remote_ref="$merge_ref" + else + remote_ref="refs/remotes/$remote/${merge_ref#refs/heads/}" + fi + output="`git rev-list --left-right $remote_ref..HEAD`" || \ + output="`git rev-list --left-right $merge_ref..HEAD`" + _ahead="`echo -n $output |grep -c '^>'`" + output="`echo -n ${output} |grep -c '.*'`" + _behind="`expr $output - $_ahead`" + fi + output="`git diff --name-status --staged`" + _staged="`echo -n $output |grep -c -v -e '^U\>'`" + _conflict="`echo -n $output |grep -c -e '^U\>'`" + _changed="`git diff --name-status |grep -c -v -e '^U\>'`" + _untracked="`git status --porcelain |grep -c -e '^??'`" + + clean="${ZSH_THEME_GIT_PROMPT_CLEAN_PREFIX}c${ZSH_THEME_GIT_PROMPT_CLEAN_SUFFIX}" + test -n "${_branch}" && branch="${ZSH_THEME_GIT_PROMPT_BRANCH_PREFIX}${_branch}${ZSH_THEME_GIT_PROMPT_BRANCH_SUFFIX}" + test -n "${_behind}" -a "${_behind}" != "0" && behind="${ZSH_THEME_GIT_PROMPT_BEHIND_PREFIX}${_behind}${ZSH_THEME_GIT_PROMPT_BEHIND_SUFFIX}" + test -n "${_ahead}" -a "${_ahead}" != "0" && ahead="${ZSH_THEME_GIT_PROMPT_AHEAD_PREFIX}${_ahead}${ZSH_THEME_GIT_PROMPT_AHEAD_SUFFIX}" + test -n "${_staged}" -a "${_staged}" != "0" && { clean=""; staged="${ZSH_THEME_GIT_PROMPT_STAGED_PREFIX}${_staged}${ZSH_THEME_GIT_PROMPT_STAGED_SUFFIX}"; } + test -n "${_conflict}" -a "${_conflict}" != "0" && { clean=""; conflict="${ZSH_THEME_GIT_PROMPT_CONFLICT_PREFIX}${_conflict}${ZSH_THEME_GIT_PROMPT_CONFLICT_SUFFIX}"; } + test -n "${_changed}" -a "${_changed}" != "0" && { clean=""; changed="${ZSH_THEME_GIT_PROMPT_CHANGED_PREFIX}${_changed}${ZSH_THEME_GIT_PROMPT_CHANGED_SUFFIX}"; } + test -n "${_untracked}" -a "${_untracked}" != "0" && { clean=""; untracked="${ZSH_THEME_GIT_PROMPT_UNTRACKED_PREFIX}${_untracked}${ZSH_THEME_GIT_PROMPT_UNTRACKED_SUFFIX}"; } + + git_status + GIT_STATUS="${ZSH_THEME_GIT_PROMPT_PREFIX}${GIT_STATUS}${ZSH_THEME_GIT_PROMPT_SUFFIX}" +} + function git_prompt_info() { - if [[ "$(command git config --get oh-my-zsh.hide-status 2>/dev/null)" != "1" ]]; then - ref=$(command git symbolic-ref HEAD 2> /dev/null) || \ - ref=$(command git rev-parse --short HEAD 2> /dev/null) || return 0 - echo "$ZSH_THEME_GIT_PROMPT_PREFIX${ref#refs/heads/}$(parse_git_dirty)$ZSH_THEME_GIT_PROMPT_SUFFIX" - fi + if [ "$(command git config --get oh-my-zsh.hide-status 2>/dev/null)" != "1" ] + then + if [ -n "${__UPDATE_GIT_VARS_NEEDED}" ] + then + update_git_vars + fi + echo -n "${GIT_STATUS}" + fi } diff --git a/themes/frank.zsh-theme b/themes/frank.zsh-theme index b8f85bf26..029b9b54e 100644 --- a/themes/frank.zsh-theme +++ b/themes/frank.zsh-theme @@ -4,7 +4,26 @@ RPS1='$(git_prompt_info) %{$reset_color%}%T' PS2='%{$fg_bold[blue]%}[%3~]%{$reset_color%} > ' RPS2='< %{$fg_bold[green]%}%_%{$reset_color%}' -ZSH_THEME_GIT_PROMPT_PREFIX="(%{$fg_bold[blue]%}" -ZSH_THEME_GIT_PROMPT_SUFFIX="%{$reset_color%}" -ZSH_THEME_GIT_PROMPT_DIRTY="%{$reset_color%}|%{$fg_bold[yellow]%}?%{$reset_color%})" -ZSH_THEME_GIT_PROMPT_CLEAN="%{$reset_color%}|%{$fg_bold[green]%}c%{$reset_color%})" +ZSH_THEME_GIT_PROMPT_PREFIX="(" +ZSH_THEME_GIT_PROMPT_BRANCH_PREFIX="%{$fg_bold[blue]%}" +ZSH_THEME_GIT_PROMPT_BRANCH_SUFFIX="%{$reset_color%}" +ZSH_THEME_GIT_PROMPT_BEHIND_PREFIX="<" +ZSH_THEME_GIT_PROMPT_BEHIND_SUFFIX="" +ZSH_THEME_GIT_PROMPT_AHEAD_PREFIX=">" +ZSH_THEME_GIT_PROMPT_AHEAD_SUFFIX="" +ZSH_THEME_GIT_PROMPT_STAGED_PREFIX="%{$fg[red]%}s" +ZSH_THEME_GIT_PROMPT_STAGED_SUFFIX="%{$reset_color%}" +ZSH_THEME_GIT_PROMPT_CONFLICT_PREFIX="%{$fg_bold[red]%}!" +ZSH_THEME_GIT_PROMPT_CONFLICT_SUFFIX="%{$reset_color%}" +ZSH_THEME_GIT_PROMPT_CHANGED_PREFIX="%{$fg[yellow]%}+" +ZSH_THEME_GIT_PROMPT_CHANGED_SUFFIX="%{$reset_color%}" +ZSH_THEME_GIT_PROMPT_UNTRACKED_PREFIX="%{$fg[cyan]%}?" +ZSH_THEME_GIT_PROMPT_UNTRACKED_SUFFIX="%{$reset_color%}" +ZSH_THEME_GIT_PROMPT_CLEAN_PREFIX="%{$fg_bold[green]%}" +ZSH_THEME_GIT_PROMPT_CLEAN_SUFFIX="%{$reset_color%}" +ZSH_THEME_GIT_PROMPT_SUFFIX="%{$reset_color%})" + +function git_status() +{ + GIT_STATUS="${branch}${behind}${ahead}:${clean}${staged}${changed}${conflict}${untracked}" +}