Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
adam.huang
Oh My Zsh
Commits
6811a486
Commit
6811a486
authored
Oct 09, 2020
by
Marc Cornellà
Browse files
Merge branch 'TheDauthi/enhanced-status-prompt' (#5531)
Closes #5531
parents
297238b7
865f6572
Changes
1
Show whitespace changes
Inline
Side-by-side
lib/git.zsh
View file @
6811a486
...
@@ -147,46 +147,102 @@ function git_prompt_long_sha() {
...
@@ -147,46 +147,102 @@ function git_prompt_long_sha() {
SHA
=
$(
__git_prompt_git rev-parse HEAD 2> /dev/null
)
&&
echo
"
$ZSH_THEME_GIT_PROMPT_SHA_BEFORE$SHA$ZSH_THEME_GIT_PROMPT_SHA_AFTER
"
SHA
=
$(
__git_prompt_git rev-parse HEAD 2> /dev/null
)
&&
echo
"
$ZSH_THEME_GIT_PROMPT_SHA_BEFORE$SHA$ZSH_THEME_GIT_PROMPT_SHA_AFTER
"
}
}
# Get the status of the working tree
function
git_prompt_status
()
{
function
git_prompt_status
()
{
emulate
-L
zsh
[[
"
$(
__git_prompt_git config
--get
oh-my-zsh.hide-status 2>/dev/null
)
"
=
1
]]
&&
return
[[
"
$(
__git_prompt_git config
--get
oh-my-zsh.hide-status 2>/dev/null
)
"
=
1
]]
&&
return
local
INDEX STATUS
# Maps a git status prefix to an internal constant
INDEX
=
$(
__git_prompt_git status
--porcelain
-b
2> /dev/null
)
||
return
0
# This cannot use the prompt constants, as they may be empty
STATUS
=
""
local
-A
prefix_constant_map
if
[[
"
${
INDEX
}
"
=
~
$'(^|
\n
)
\\
?
\\
? '
]]
;
then
prefix_constant_map
=(
STATUS
=
"
$ZSH_THEME_GIT_PROMPT_UNTRACKED$STATUS
"
'\?\? '
'UNTRACKED'
fi
'A '
'ADDED'
if
[[
"
${
INDEX
}
"
=
~
$'(^|
\n
)(A |M |MM) '
]]
;
then
'M '
'ADDED'
STATUS
=
"
$ZSH_THEME_GIT_PROMPT_ADDED$STATUS
"
'MM '
'ADDED'
fi
' M '
'MODIFIED'
if
[[
"
${
INDEX
}
"
=
~
$'(^|
\n
)([ AM]M| T) '
]]
;
then
'AM '
'MODIFIED'
STATUS
=
"
$ZSH_THEME_GIT_PROMPT_MODIFIED$STATUS
"
' T '
'MODIFIED'
fi
'R '
'RENAMED'
if
[[
"
${
INDEX
}
"
=
~
$'(^|
\n
)R '
]]
;
then
' D '
'DELETED'
STATUS
=
"
$ZSH_THEME_GIT_PROMPT_RENAMED$STATUS
"
'D '
'DELETED'
fi
'UU '
'UNMERGED'
if
[[
"
${
INDEX
}
"
=
~
$'(^|
\n
)([A ]D|D ) '
]]
;
then
'ahead'
'AHEAD'
STATUS
=
"
$ZSH_THEME_GIT_PROMPT_DELETED$STATUS
"
'behind'
'BEHIND'
'diverged'
'DIVERGED'
'stashed'
'STASHED'
)
# Maps the internal constant to the prompt theme
local
-A
constant_prompt_map
constant_prompt_map
=(
'UNTRACKED'
"
$ZSH_THEME_GIT_PROMPT_UNTRACKED
"
'ADDED'
"
$ZSH_THEME_GIT_PROMPT_ADDED
"
'MODIFIED'
"
$ZSH_THEME_GIT_PROMPT_MODIFIED
"
'RENAMED'
"
$ZSH_THEME_GIT_PROMPT_RENAMED
"
'DELETED'
"
$ZSH_THEME_GIT_PROMPT_DELETED
"
'UNMERGED'
"
$ZSH_THEME_GIT_PROMPT_UNMERGED
"
'AHEAD'
"
$ZSH_THEME_GIT_PROMPT_AHEAD
"
'BEHIND'
"
$ZSH_THEME_GIT_PROMPT_BEHIND
"
'DIVERGED'
"
$ZSH_THEME_GIT_PROMPT_DIVERGED
"
'STASHED'
"
$ZSH_THEME_GIT_PROMPT_STASHED
"
)
# The order that the prompt displays should be added to the prompt
local
status_constants
status_constants
=(
UNTRACKED ADDED MODIFIED RENAMED DELETED
STASHED UNMERGED AHEAD BEHIND DIVERGED
)
local
status_text
=
"
$(
__git_prompt_git status
--porcelain
-b
2> /dev/null
)
"
# Don't continue on a catastrophic failure
if
[[
$?
-eq
128
]]
;
then
return
1
fi
fi
if
$(
__git_prompt_git rev-parse
--verify
refs/stash
>
/dev/null 2>&1
)
;
then
STATUS
=
"
$ZSH_THEME_GIT_PROMPT_STASHED$STATUS
"
# A lookup table of each git status encountered
local
-A
statuses_seen
if
__git_prompt_git rev-parse
--verify
refs/stash &>/dev/null
;
then
statuses_seen[STASHED]
=
1
fi
fi
if
[[
"
${
INDEX
}
"
=
~
$'(^|
\n
)UU '
]]
;
then
STATUS
=
"
$ZSH_THEME_GIT_PROMPT_UNMERGED$STATUS
"
local
status_lines
status_lines
=(
"
${
(@f)
${
status_text
}}
"
)
# If the tracking line exists, get and parse it
if
[[
"
$status_lines
[1]"
=
~
"^## [^ ]+
\[
(.*)
\]
"
]]
;
then
local
branch_statuses
branch_statuses
=(
"
${
(@s/,/)match
}
"
)
for
branch_status
in
$branch_statuses
;
do
if
[[
!
$branch_status
=
~
"(behind|diverged|ahead) ([0-9]+)?"
]]
;
then
continue
fi
fi
if
[[
"
${
INDEX
}
"
=
~
$'(^|
\n
)## [^ ]
\+
.*ahead'
]]
;
then
local
last_parsed_status
=
$prefix_constant_map
[
$match
[
1]]
STATUS
=
"
$ZSH_THEME_GIT_PROMPT_AHEAD$STATUS
"
statuses_seen[
$last_parsed_status
]=
$match
[
2]
done
fi
fi
if
[[
"
${
INDEX
}
"
=
~
$'(^|
\n
)## [^ ]
\+
.*behind'
]]
;
then
STATUS
=
"
$ZSH_THEME_GIT_PROMPT_BEHIND$STATUS
"
# For each status prefix, do a regex comparison
for
status_prefix
in
${
(k)prefix_constant_map
}
;
do
local
status_constant
=
"
${
prefix_constant_map
[
$status_prefix
]
}
"
local
status_regex
=
"(^|
\n
)
$status_prefix
"
if
[[
"
$status_text
"
=
~
$status_regex
]]
;
then
statuses_seen[
$status_constant
]=
1
fi
fi
if
[[
"
${
INDEX
}
"
=
~
$'(^|
\n
)## [^ ]
\+
.*diverged'
]]
;
then
done
STATUS
=
"
$ZSH_THEME_GIT_PROMPT_DIVERGED$STATUS
"
# Display the seen statuses in the order specified
local
status_prompt
for
status_constant
in
$status_constants
;
do
if
((
${
+statuses_seen[
$status_constant
]
}
))
;
then
local
next_display
=
$constant_prompt_map
[
$status_constant
]
status_prompt
=
"
$next_display$status_prompt
"
fi
fi
echo
$STATUS
done
echo
$status_prompt
}
}
# Outputs the name of the current user
# Outputs the name of the current user
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment