From 3e023c77ce4ef4f4b78f7c3812c123b91c0dd1cc Mon Sep 17 00:00:00 2001 From: Jacobi Carter Date: Wed, 15 Feb 2012 01:23:29 -0600 Subject: [PATCH] Better git support. --- gitconfig | 3 +- zsh/prompt | 124 ++++++++++++++++++++++++++++++++++++++++++++++++++++- zsh/title | 1 + 3 files changed, 125 insertions(+), 3 deletions(-) diff --git a/gitconfig b/gitconfig index 6d2d511..bf31846 100644 --- a/gitconfig +++ b/gitconfig @@ -25,7 +25,8 @@ untrack-ignored = !git-untracked-ignored info = !git-info amend = commit --amend -C HEAD - r = log --graph --oneline --all -40 --decorate=short + r = "!_(){ git log --graph --oneline --all -40 --decorate=short --color=always $@ | php -r '$log = Array(); foreach( explode( \"\\n\", trim( shell_exec( \"git log --all --pretty=format:\\\"%h %Cgreen(%cr) %C(bold blue)<%an>%Creset\\\" --abbrev-commit --date=relative -5000\" ) ) ) as $line ) { list( $commit, $decor ) = explode( \" \", $line, 2 ); $log[ $commit ] = $decor; } foreach( explode( \"\\n\", trim( file_get_contents( \"php://stdin\" ) ) ) as $line ) { if( preg_match( \"#([a-f0-9]{7})#\", $line, $m ) ) { echo $line . \" \" . $log[ $m[ 1 ] ] . \"\\n\"; } else { echo $line . \"\\n\"; } }'; } ; _" + dc = diff --cached [color] diff = auto status = auto diff --git a/zsh/prompt b/zsh/prompt index cf819e9..56ea417 100755 --- a/zsh/prompt +++ b/zsh/prompt @@ -43,7 +43,127 @@ case "${TERM}" in fi ;; esac +GREEN=$'%{\e[01;32m%}' +RED=$'%{\e[01;31m%}' +GRAY=$'%{\e[01;30m%}' +PURPLE=$'%{\e[00;35m%}' +YELLOW=$'%{\e[01;33m%}' +function havegit () { + if which git > /dev/null + then + local g="$(git rev-parse --git-dir 2>/dev/null)" + if [ -n "$g" ] + then + true + else + false + fi + else + false + fi +} +ZSH_THEME_GIT_PROMPT_UNTRACKED="?" +ZSH_THEME_GIT_PROMPT_ADDED="+" +ZSH_THEME_GIT_PROMPT_MODIFIED="!" +ZSH_THEME_GIT_PROMPT_DELETED="-" +ZSH_THEME_GIT_PROMPT_UNMERGED="&" +ZSH_THEME_GIT_PROMPT_RENAMED=">" +git_prompt_status() { + INDEX=$(git status --porcelain 2> /dev/null) + STATUS="" + if $(echo "$INDEX" | grep '^?? ' &> /dev/null); then + STATUS="$ZSH_THEME_GIT_PROMPT_UNTRACKED$STATUS" + fi + if $(echo "$INDEX" | grep '^A ' &> /dev/null); then + STATUS="$ZSH_THEME_GIT_PROMPT_ADDED$STATUS" + elif $(echo "$INDEX" | grep '^M ' &> /dev/null); then + STATUS="$ZSH_THEME_GIT_PROMPT_ADDED$STATUS" + fi + if $(echo "$INDEX" | grep '^ M ' &> /dev/null); then + STATUS="$ZSH_THEME_GIT_PROMPT_MODIFIED$STATUS" + elif $(echo "$INDEX" | grep '^AM ' &> /dev/null); then + STATUS="$ZSH_THEME_GIT_PROMPT_MODIFIED$STATUS" + elif $(echo "$INDEX" | grep '^ T ' &> /dev/null); then + STATUS="$ZSH_THEME_GIT_PROMPT_MODIFIED$STATUS" + fi + if $(echo "$INDEX" | grep '^R ' &> /dev/null); then + STATUS="$ZSH_THEME_GIT_PROMPT_RENAMED$STATUS" + fi + if $(echo "$INDEX" | grep '^ D ' &> /dev/null); then + STATUS="$ZSH_THEME_GIT_PROMPT_DELETED$STATUS" + elif $(echo "$INDEX" | grep '^AD ' &> /dev/null); then + STATUS="$ZSH_THEME_GIT_PROMPT_DELETED$STATUS" + fi + if $(echo "$INDEX" | grep '^UU ' &> /dev/null); then + STATUS="$ZSH_THEME_GIT_PROMPT_UNMERGED$STATUS" + fi + echo $STATUS +} +function updateprompt () { + if havegit ; then + local gitdir="$(readlink -m $(git rev-parse --git-dir 2>/dev/null))" + local repodir="$(dirname "${gitdir}")" + local reponame="$(basename "${repodir}")" + local curdir="$(pwd)" + local repopath=".${curdir#${repodir}}" + local additional + local branch + if [ -d "$gitdir/rebase-apply" ]; then + if test -f "$gitdir/rebase-apply/rebasing"; then + additional="|${PURPLE}REBASE" + elif test -f "$gitdir/rebase-apply/applying"; then + additional="|${PURPLE}AM" + else + additional="|${PURPLE}AM/REBASE" + fi + branch="$(git symbolic-ref HEAD 2>/dev/null)" + elif [ -f "$gitdir/rebase-merge/interactive" ]; then + additional="|${PURPLE}REBASE-i" + branch="$(cat "$gitdir/rebase-merge/head-name")" + elif [ -d "$gitdir/rebase-merge" ]; then + additional="|${PURPLE}REBASE-m" + branch="$(cat "$gitdir/rebase-merge/head-name")" + elif [ -f "$gitdir/MERGE_HEAD" ]; then + additional="|${PURPLE}MERGING" + branch="$(git symbolic-ref HEAD 2>/dev/null)" + else + if [ -f "$gitdir/BISECT_LOG" ]; then + additional="|${PURPLE}BISECTING" + fi + if ! branch="$(git symbolic-ref HEAD 2>/dev/null)"; then + if ! branch="$(git describe --exact-match HEAD 2>/dev/null)"; then + branch="$(cut -c1-7 "$gitdir/HEAD")..." + fi + fi + fi + branch="${branch##refs/heads/}" + local remote=${$(git rev-parse --verify ${branch}@{upstream} --symbolic-full-name 2>/dev/null)/refs\/remotes\/} + local remotepart="" + local -a gitstatus + if [[ -n ${remote} ]] ; then + # for git prior to 1.7 + # ahead=$(git rev-list origin/${hook_com[branch]}..HEAD | wc -l) + local ahead=$(git rev-list ${branch}@{upstream}..HEAD 2>/dev/null | wc -l) + gitstatus+=( "${GREEN}+${ahead}${GRAY}" ) -PROMPT=${RESETCOLOR}${HOSTCOLOR}$'%n@'${LHOSTNAME}${BLACKCOLOR}':'${PATHCOLOR}$'%45<...<%~ %(?..'${BOLDERRORCOLOR}$')%(!.#.$) '${RESETCOLOR} + # for git prior to 1.7 + # behind=$(git rev-list HEAD..origin/${hook_com[branch]} | wc -l) + local behind=$(git rev-list HEAD..${branch}@{upstream} 2>/dev/null | wc -l) + gitstatus+=( "${RED}-${behind}${GRAY}" ) -RPROMPT=${RESETCOLOR}$'%1(j.'${JOBCOLOR}$'[%j].)%(?..'${ERRORCOLOR}$'[%?])'${CLOCKCOLOR}$'[%t]'${RESETCOLOR} + remotepart="${RESETCOLOR}${GRAY}[${remote} ${(j:/:)gitstatus}]${RESETCOLOR}" + fi + local stashpart="" + if [[ -s ${gitdir}/refs/stash ]] ; then + stashes=$(git stash list 2>/dev/null | wc -l) + stashpart="${RESETCOLOR}${GRAY}(${GREEN}${stashes}${GRAY} stashed)${RESETCOLOR}" + fi + local stats="$(git_prompt_status)" + PROMPT=${RESETCOLOR}${HOSTCOLOR}$'%n@'${LHOSTNAME}${BLACKCOLOR}':'${PATHCOLOR}"${reponame} ${RED}${branch}${YELLOW}${stats}${BLACKCOLOR}${additional} ${PATHCOLOR}"$'%45<...<'"${repopath}"' %(?..'${BOLDERRORCOLOR}$')%(!.#.$) '${RESETCOLOR} + RPROMPT=${RESETCOLOR}${stashpart}${remotepart}$'%1(j.'${JOBCOLOR}$'[%j].)%(?..'${ERRORCOLOR}$'[%?])'${CLOCKCOLOR}$'[%t]'${RESETCOLOR} + else + PROMPT=${RESETCOLOR}${HOSTCOLOR}$'%n@'${LHOSTNAME}${BLACKCOLOR}':'${PATHCOLOR}$'%45<...<%~ %(?..'${BOLDERRORCOLOR}$')%(!.#.$) '${RESETCOLOR} + RPROMPT=${RESETCOLOR}$'%1(j.'${JOBCOLOR}$'[%j].)%(?..'${ERRORCOLOR}$'[%?])'${CLOCKCOLOR}$'[%t]'${RESETCOLOR} + fi +} +updateprompt diff --git a/zsh/title b/zsh/title index 33093e1..b7b3f3f 100755 --- a/zsh/title +++ b/zsh/title @@ -1,6 +1,7 @@ # terminal titles precmd() { + updateprompt local termtitle termtitle=`print -P "%n@%m[%l]"`