6811a486184d7849df1290a7827e18c158cf642a
- Author
- Marc Cornellà <marc.cornella@live.com>
- Committer
- Marc Cornellà <marc.cornella@live.com>
- Date
Message
Diff
This diff is truncated to protect this page.
1diff --git a/lib/git.zsh b/lib/git.zsh
2index b3b25f80262db0545733c2a518c7fc76c6de1728..f9b27949ec123bb10d22a10429f6750af9560250 100644
3--- a/lib/git.zsh
4+++ b/lib/git.zsh
5@@ -147,46 +147,102 @@ function git_prompt_long_sha() {
6 SHA=$(__git_prompt_git rev-parse HEAD 2> /dev/null) && echo "$ZSH_THEME_GIT_PROMPT_SHA_BEFORE$SHA$ZSH_THEME_GIT_PROMPT_SHA_AFTER"
7 }
8
9-# Get the status of the working tree
10 function git_prompt_status() {
11- emulate -L zsh
12-
13 [[ "$(__git_prompt_git config --get oh-my-zsh.hide-status 2>/dev/null)" = 1 ]] && return
14
15- local INDEX STATUS
16- INDEX=$(__git_prompt_git status --porcelain -b 2> /dev/null) || return 0
17- STATUS=""
18- if [[ "${INDEX}" =~ $'(^|\n)\\?\\? ' ]]; then
19- STATUS="$ZSH_THEME_GIT_PROMPT_UNTRACKED$STATUS"
20- fi
21- if [[ "${INDEX}" =~ $'(^|\n)(A |M |MM) ' ]]; then
22- STATUS="$ZSH_THEME_GIT_PROMPT_ADDED$STATUS"
23- fi
24- if [[ "${INDEX}" =~ $'(^|\n)([ AM]M| T) ' ]]; then
25- STATUS="$ZSH_THEME_GIT_PROMPT_MODIFIED$STATUS"
26- fi
27- if [[ "${INDEX}" =~ $'(^|\n)R ' ]]; then
28- STATUS="$ZSH_THEME_GIT_PROMPT_RENAMED$STATUS"
29- fi
30- if [[ "${INDEX}" =~ $'(^|\n)([A ]D|D ) ' ]]; then
31- STATUS="$ZSH_THEME_GIT_PROMPT_DELETED$STATUS"
32- fi
33- if $(__git_prompt_git rev-parse --verify refs/stash >/dev/null 2>&1); then
34- STATUS="$ZSH_THEME_GIT_PROMPT_STASHED$STATUS"
35- fi
36- if [[ "${INDEX}" =~ $'(^|\n)UU ' ]]; then
37- STATUS="$ZSH_THEME_GIT_PROMPT_UNMERGED$STATUS"
38- fi
39- if [[ "${INDEX}" =~ $'(^|\n)## [^ ]\+ .*ahead' ]]; then
40- STATUS="$ZSH_THEME_GIT_PROMPT_AHEAD$STATUS"
41+ # Maps a git status prefix to an internal constant
42+ # This cannot use the prompt constants, as they may be empty
43+ local -A prefix_constant_map
44+ prefix_constant_map=(
45+ '\?\? ' 'UNTRACKED'
46+ 'A ' 'ADDED'
47+ 'M ' 'ADDED'
48+ 'MM ' 'ADDED'
49+ ' M ' 'MODIFIED'
50+ 'AM ' 'MODIFIED'
51+ ' T ' 'MODIFIED'
52+ 'R ' 'RENAMED'
53+ ' D ' 'DELETED'
54+ 'D ' 'DELETED'
55+ 'UU ' 'UNMERGED'
56+ 'ahead' 'AHEAD'
57+ 'behind' 'BEHIND'
58+ 'diverged' 'DIVERGED'
59+ 'stashed' 'STASHED'
60+ )
61+
62+ # Maps the internal constant to the prompt theme
63+ local -A constant_prompt_map
64+ constant_prompt_map=(
65+ 'UNTRACKED' "$ZSH_THEME_GIT_PROMPT_UNTRACKED"
66+ 'ADDED' "$ZSH_THEME_GIT_PROMPT_ADDED"
67+ 'MODIFIED' "$ZSH_THEME_GIT_PROMPT_MODIFIED"
68+ 'RENAMED' "$ZSH_THEME_GIT_PROMPT_RENAMED"
69+ 'DELETED' "$ZSH_THEME_GIT_PROMPT_DELETED"
70+ 'UNMERGED' "$ZSH_THEME_GIT_PROMPT_UNMERGED"
71+ 'AHEAD' "$ZSH_THEME_GIT_PROMPT_AHEAD"
72+ 'BEHIND' "$ZSH_THEME_GIT_PROMPT_BEHIND"
73+ 'DIVERGED' "$ZSH_THEME_GIT_PROMPT_DIVERGED"
74+ 'STASHED' "$ZSH_THEME_GIT_PROMPT_STASHED"
75+ )
76+
77+ # The order that the prompt displays should be added to the prompt
78+ local status_constants
79+ status_constants=(
80+ UNTRACKED ADDED MODIFIED RENAMED DELETED
81+ STASHED UNMERGED AHEAD BEHIND DIVERGED
82+ )
83+
84+ local status_text="$(__git_prompt_git status --porcelain -b 2> /dev/null)"
85+
86+ # Don't continue on a catastrophic failure
87+ if [[ $? -eq 128 ]]; then
88+ return 1
89 fi
90- if [[ "${INDEX}" =~ $'(^|\n)## [^ ]\+ .*behind' ]]; then
91- STATUS="$ZSH_THEME_GIT_PROMPT_BEHIND$STATUS"
92+
93+ # A lookup table of each git status encountered
94+ local -A statuses_seen
95+
96+ if __git_prompt_git rev-parse --verify refs/stash &>/dev/null; then
97+ statuses_seen[STASHED]=1
98 fi
99- if [[ "${INDEX}" =~ $'(^|\n)## [^ ]\+ .*diverged' ]]; then
100- STATUS="$ZSH_THEME_GIT_PROMPT_DIVERGED$STATUS"
101+
102+ local status_lines
103+ status_lines=("${(@f)${status_text}}")
104+