From: Samir Benmendil Date: Sun, 31 Jan 2021 16:13:28 +0000 (+0000) Subject: zsh/prompt: use porcelain=v2 for getting git status info X-Git-Url: https://git.rmz.io/dotfiles.git/commitdiff_plain/56f123cdddbb302d253edf610c98725be8aa43d6 zsh/prompt: use porcelain=v2 for getting git status info There's a bit more info in there and it's better structured. --- diff --git a/zsh/lib/prompt.zsh b/zsh/lib/prompt.zsh index aaa2694..92b63a0 100644 --- a/zsh/lib/prompt.zsh +++ b/zsh/lib/prompt.zsh @@ -37,45 +37,40 @@ git_prompt_status() { if ! git rev-parse --is-inside-work-tree &>/dev/null; then return fi - local branch ahead behind + local oid head ahead behind local added deleted modified renamed unmerged untracked dirty # Use porcelain status for easy parsing. - local status_cmd="git status --porcelain -b" + local status_cmd="git status --porcelain=v2 -b" # Get current status. while IFS=$'\n' read line; do - if [[ "$line" == \#\#\ * ]]; then - [[ "$line" =~ '## (.*?)(\.\.\.|$)' ]] && branch=$match[1] - [[ "$line" =~ 'ahead ([0-9]+)' ]] && ahead=$match[1] - [[ "$line" =~ 'behind ([0-9]+)' ]] && behind=$match[1] + if [[ "$line" == \#\ * ]]; then + [[ "$line" =~ '# branch.oid ([0-9a-f]+)' ]] && oid=$match[1] + [[ "$line" =~ '# branch.head (.*)' ]] && head=$match[1] + [[ "$line" =~ '# branch.ab \+([0-9]+) -([0-9]+)' ]] && ahead=$match[1] && behind=$match[2] else # Count added, deleted, modified, renamed, unmerged, untracked, dirty. # T (type change) is undocumented, see http://git.io/FnpMGw. # index - [[ "$line" == M[\ MTD]\ * ]] && (( updated++ )) - [[ "$line" == [AC][\ MTD]\ * ]] && (( added++ )) - [[ "$line" == D[\ MT]\ * ]] && (( deleted++ )) - [[ "$line" == R[\ MTD]\ * ]] && (( renamed++ )) + [[ "$line" == 1\ M[.MTD]\ * ]] && (( updated++ )) + [[ "$line" == 1\ [AC][.MTD]\ * ]] && (( added++ )) + [[ "$line" == 1\ D[.MT]\ * ]] && (( deleted++ )) + [[ "$line" == 2\ R[.MTD]\ * ]] && (( renamed++ )) # work tree - [[ "$line" == [\ MARCT]M\ * ]] && (( modified++ )) - [[ "$line" == [\ MARCT]D\ * ]] && (( deleted_wt++ )) - [[ "$line" == \?\?\ * ]] && (( untracked++ )) + [[ "$line" == 1\ [.MARCT]M\ * ]] && (( modified++ )) + [[ "$line" == 1\ [.MARCT]D\ * ]] && (( deleted_wt++ )) + [[ "$line" == \?\ * ]] && (( untracked++ )) - # morge conflicts - [[ "$line" == (AA|DD|U?|?U)\ * ]] && (( unmerged++ )) + # merge conflicts + [[ "$line" == u\ (AA|DD|U?|?U)\ * ]] && (( unmerged++ )) fi done < <(${(z)status_cmd} 2> /dev/null) - local git_status=" %{$fg[yellow]%}" + local git_status=" %{$fg_bold[green]%}" - # Format branch - if [[ -n $branch ]]; then - git_status+="$branch" - else - git_status+="$(git rev-parse --short HEAD 2> /dev/null)" - [[ $? -ne 0 ]] && return - fi + # Format branch and commit + git_status+="$head%{$fg_no_bold[yellow]%}(${oid[1,8]})" # Format upstream local upstream_str