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
Ohmyzsh
Commits
1c58a746
Unverified
Commit
1c58a746
authored
Jul 06, 2020
by
Robert Estelle
Committed by
GitHub
Jul 06, 2020
Browse files
lib: safety fix and speed-ups for git.zsh prompt functions (#7804)
parent
d0d01c0b
Changes
1
Hide whitespace changes
Inline
Side-by-side
lib/git.zsh
View file @
1c58a746
# The git prompt's git commands are read-only and should not interfere with
# other processes. This environment variable is equivalent to running with `git
# --no-optional-locks`, but falls back gracefully for older versions of git.
# See git(1) for and git-status(1) for a description of that flag.
#
# We wrap in a local function instead of exporting the variable directly in
# order to avoid interfering with manually-run git commands by the user.
function
__git_prompt_git
()
{
GIT_OPTIONAL_LOCKS
=
0
command
git
"
$@
"
}
# Outputs current branch info in prompt format
function
git_prompt_info
()
{
local
ref
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
if
[[
"
$(
__git_prompt_
git config
--get
oh-my-zsh.hide-status 2>/dev/null
)
"
!=
"1"
]]
;
then
ref
=
$(
__git_prompt_
git symbolic-ref HEAD 2> /dev/null
)
||
\
ref
=
$(
__git_prompt_
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
}
...
...
@@ -13,7 +24,7 @@ function parse_git_dirty() {
local
STATUS
local
-a
FLAGS
FLAGS
=(
'--porcelain'
)
if
[[
"
$(
command
git config
--get
oh-my-zsh.hide-dirty
)
"
!=
"1"
]]
;
then
if
[[
"
$(
__git_prompt_
git config
--get
oh-my-zsh.hide-dirty
)
"
!=
"1"
]]
;
then
if
[[
"
${
DISABLE_UNTRACKED_FILES_DIRTY
:-}
"
==
"true"
]]
;
then
FLAGS+
=
'--untracked-files=no'
fi
...
...
@@ -27,7 +38,7 @@ function parse_git_dirty() {
FLAGS+
=
"--ignore-submodules=
${
GIT_STATUS_IGNORE_SUBMODULES
:-
dirty
}
"
;;
esac
STATUS
=
$(
command
git status
${
FLAGS
}
2> /dev/null |
tail
-n1
)
STATUS
=
$(
__git_prompt_
git status
${
FLAGS
}
2> /dev/null |
tail
-n1
)
fi
if
[[
-n
$STATUS
]]
;
then
echo
"
$ZSH_THEME_GIT_PROMPT_DIRTY
"
...
...
@@ -39,10 +50,10 @@ function parse_git_dirty() {
# Gets the difference between the local and remote branches
function
git_remote_status
()
{
local
remote ahead behind git_remote_status git_remote_status_detailed
remote
=
${
$(
command
git rev-parse
--verify
${
hook_com
[branch]
}
@
{
upstream
}
--symbolic-full-name
2>/dev/null
)
/refs\/remotes\/
}
remote
=
${
$(
__git_prompt_
git rev-parse
--verify
${
hook_com
[branch]
}
@
{
upstream
}
--symbolic-full-name
2>/dev/null
)
/refs\/remotes\/
}
if
[[
-n
${
remote
}
]]
;
then
ahead
=
$(
command
git rev-list
${
hook_com
[branch]
}
@
{
upstream
}
..HEAD 2>/dev/null |
wc
-l
)
behind
=
$(
command
git rev-list HEAD..
${
hook_com
[branch]
}
@
{
upstream
}
2>/dev/null |
wc
-l
)
ahead
=
$(
__git_prompt_
git rev-list
${
hook_com
[branch]
}
@
{
upstream
}
..HEAD 2>/dev/null |
wc
-l
)
behind
=
$(
__git_prompt_
git rev-list HEAD..
${
hook_com
[branch]
}
@
{
upstream
}
2>/dev/null |
wc
-l
)
if
[[
$ahead
-eq
0
]]
&&
[[
$behind
-eq
0
]]
;
then
git_remote_status
=
"
$ZSH_THEME_GIT_PROMPT_EQUAL_REMOTE
"
...
...
@@ -71,11 +82,11 @@ function git_remote_status() {
# it's not a symbolic ref, but in a Git repo.
function
git_current_branch
()
{
local
ref
ref
=
$(
command
git symbolic-ref
--quiet
HEAD 2> /dev/null
)
ref
=
$(
__git_prompt_
git symbolic-ref
--quiet
HEAD 2> /dev/null
)
local
ret
=
$?
if
[[
$ret
!=
0
]]
;
then
[[
$ret
==
128
]]
&&
return
# no git repo.
ref
=
$(
command
git rev-parse
--short
HEAD 2> /dev/null
)
||
return
ref
=
$(
__git_prompt_
git rev-parse
--short
HEAD 2> /dev/null
)
||
return
fi
echo
${
ref
#refs/heads/
}
}
...
...
@@ -83,8 +94,8 @@ function git_current_branch() {
# Gets the number of commits ahead from remote
function
git_commits_ahead
()
{
if
command
git rev-parse
--git-dir
&>/dev/null
;
then
local
commits
=
"
$(
git rev-list
--count
@
{
upstream
}
..HEAD 2>/dev/null
)
"
if
__git_prompt_
git rev-parse
--git-dir
&>/dev/null
;
then
local
commits
=
"
$(
__git_prompt_
git rev-list
--count
@
{
upstream
}
..HEAD 2>/dev/null
)
"
if
[[
-n
"
$commits
"
&&
"
$commits
"
!=
0
]]
;
then
echo
"
$ZSH_THEME_GIT_COMMITS_AHEAD_PREFIX$commits$ZSH_THEME_GIT_COMMITS_AHEAD_SUFFIX
"
fi
...
...
@@ -93,8 +104,8 @@ function git_commits_ahead() {
# Gets the number of commits behind remote
function
git_commits_behind
()
{
if
command
git rev-parse
--git-dir
&>/dev/null
;
then
local
commits
=
"
$(
git rev-list
--count
HEAD..@
{
upstream
}
2>/dev/null
)
"
if
__git_prompt_
git rev-parse
--git-dir
&>/dev/null
;
then
local
commits
=
"
$(
__git_prompt_
git rev-list
--count
HEAD..@
{
upstream
}
2>/dev/null
)
"
if
[[
-n
"
$commits
"
&&
"
$commits
"
!=
0
]]
;
then
echo
"
$ZSH_THEME_GIT_COMMITS_BEHIND_PREFIX$commits$ZSH_THEME_GIT_COMMITS_BEHIND_SUFFIX
"
fi
...
...
@@ -103,21 +114,21 @@ function git_commits_behind() {
# Outputs if current branch is ahead of remote
function
git_prompt_ahead
()
{
if
[[
-n
"
$(
command
git rev-list origin/
$(
git_current_branch
)
..HEAD 2> /dev/null
)
"
]]
;
then
if
[[
-n
"
$(
__git_prompt_
git rev-list origin/
$(
git_current_branch
)
..HEAD 2> /dev/null
)
"
]]
;
then
echo
"
$ZSH_THEME_GIT_PROMPT_AHEAD
"
fi
}
# Outputs if current branch is behind remote
function
git_prompt_behind
()
{
if
[[
-n
"
$(
command
git rev-list HEAD..origin/
$(
git_current_branch
)
2> /dev/null
)
"
]]
;
then
if
[[
-n
"
$(
__git_prompt_
git rev-list HEAD..origin/
$(
git_current_branch
)
2> /dev/null
)
"
]]
;
then
echo
"
$ZSH_THEME_GIT_PROMPT_BEHIND
"
fi
}
# Outputs if current branch exists on remote or not
function
git_prompt_remote
()
{
if
[[
-n
"
$(
command
git show-ref origin/
$(
git_current_branch
)
2> /dev/null
)
"
]]
;
then
if
[[
-n
"
$(
__git_prompt_
git show-ref origin/
$(
git_current_branch
)
2> /dev/null
)
"
]]
;
then
echo
"
$ZSH_THEME_GIT_PROMPT_REMOTE_EXISTS
"
else
echo
"
$ZSH_THEME_GIT_PROMPT_REMOTE_MISSING
"
...
...
@@ -127,62 +138,50 @@ function git_prompt_remote() {
# Formats prompt string for current git commit short SHA
function
git_prompt_short_sha
()
{
local
SHA
SHA
=
$(
command
git rev-parse
--short
HEAD 2> /dev/null
)
&&
echo
"
$ZSH_THEME_GIT_PROMPT_SHA_BEFORE$SHA$ZSH_THEME_GIT_PROMPT_SHA_AFTER
"
SHA
=
$(
__git_prompt_
git rev-parse
--short
HEAD 2> /dev/null
)
&&
echo
"
$ZSH_THEME_GIT_PROMPT_SHA_BEFORE$SHA$ZSH_THEME_GIT_PROMPT_SHA_AFTER
"
}
# Formats prompt string for current git commit long SHA
function
git_prompt_long_sha
()
{
local
SHA
SHA
=
$(
command
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
()
{
emulate
-L
zsh
local
INDEX STATUS
INDEX
=
$(
command
git status
--porcelain
-b
2> /dev/null
)
INDEX
=
$(
__git_prompt_
git status
--porcelain
-b
2> /dev/null
)
||
return
0
STATUS
=
""
if
$(
echo
"
$INDEX
"
|
command grep
-E
'^
\?\? '
&> /dev/null
)
;
then
if
[[
"
$
{
INDEX
}
"
=
~
$'(^|
\n
)
\
\
?
\
\
? '
]]
;
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
"
elif
$(
echo
"
$INDEX
"
|
grep
'^MM '
&> /dev/null
)
;
then
if
[[
"
${
INDEX
}
"
=
~
$'(^|
\n
)(A |M |MM) '
]]
;
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
'^MM '
&> /dev/null
)
;
then
STATUS
=
"
$ZSH_THEME_GIT_PROMPT_MODIFIED$STATUS
"
elif
$(
echo
"
$INDEX
"
|
grep
'^ T '
&> /dev/null
)
;
then
if
[[
"
${
INDEX
}
"
=
~
$'(^|
\n
)([ AM]M| T) '
]]
;
then
STATUS
=
"
$ZSH_THEME_GIT_PROMPT_MODIFIED$STATUS
"
fi
if
$(
echo
"
$INDEX
"
|
grep
'^R '
&> /dev/null
)
;
then
if
[[
"
$
{
INDEX
}
"
=
~
$'(^|
\n
)R '
]]
;
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
'^D '
&> /dev/null
)
;
then
STATUS
=
"
$ZSH_THEME_GIT_PROMPT_DELETED$STATUS
"
elif
$(
echo
"
$INDEX
"
|
grep
'^AD '
&> /dev/null
)
;
then
if
[[
"
${
INDEX
}
"
=
~
$'(^|
\n
)([A ]D|D ) '
]]
;
then
STATUS
=
"
$ZSH_THEME_GIT_PROMPT_DELETED$STATUS
"
fi
if
$(
command
git rev-parse
--verify
refs/stash
>
/dev/null 2>&1
)
;
then
if
$(
__git_prompt_
git rev-parse
--verify
refs/stash
>
/dev/null 2>&1
)
;
then
STATUS
=
"
$ZSH_THEME_GIT_PROMPT_STASHED$STATUS
"
fi
if
$(
echo
"
$INDEX
"
|
grep
'^UU '
&> /dev/null
)
;
then
if
[[
"
$
{
INDEX
}
"
=
~
$'(^|
\n
)UU '
]]
;
then
STATUS
=
"
$ZSH_THEME_GIT_PROMPT_UNMERGED$STATUS
"
fi
if
$(
echo
"
$INDEX
"
|
grep
'^
## [^ ]\+ .*ahead'
&> /dev/null
)
;
then
if
[[
"
$
{
INDEX
}
"
=
~
$'(^|
\n
)
## [^ ]
\+
.*ahead'
]]
;
then
STATUS
=
"
$ZSH_THEME_GIT_PROMPT_AHEAD$STATUS
"
fi
if
$(
echo
"
$INDEX
"
|
grep
'^
## [^ ]\+ .*behind'
&> /dev/null
)
;
then
if
[[
"
$
{
INDEX
}
"
=
~
$'(^|
\n
)
## [^ ]
\+
.*behind'
]]
;
then
STATUS
=
"
$ZSH_THEME_GIT_PROMPT_BEHIND$STATUS
"
fi
if
$(
echo
"
$INDEX
"
|
grep
'^
## [^ ]\+ .*diverged'
&> /dev/null
)
;
then
if
[[
"
$
{
INDEX
}
"
=
~
$'(^|
\n
)
## [^ ]
\+
.*diverged'
]]
;
then
STATUS
=
"
$ZSH_THEME_GIT_PROMPT_DIVERGED$STATUS
"
fi
echo
$STATUS
...
...
@@ -191,20 +190,20 @@ function git_prompt_status() {
# Outputs the name of the current user
# Usage example: $(git_current_user_name)
function
git_current_user_name
()
{
command
git config user.name 2>/dev/null
__git_prompt_
git config user.name 2>/dev/null
}
# Outputs the email of the current user
# Usage example: $(git_current_user_email)
function
git_current_user_email
()
{
command
git config user.email 2>/dev/null
__git_prompt_
git config user.email 2>/dev/null
}
# Output the name of the root directory of the git repository
# Usage example: $(git_repo_name)
function
git_repo_name
()
{
local
repo_path
if
repo_path
=
"
$(
git rev-parse
--show-toplevel
2>/dev/null
)
"
&&
[[
-n
"
$repo_path
"
]]
;
then
if
repo_path
=
"
$(
__git_prompt_
git rev-parse
--show-toplevel
2>/dev/null
)
"
&&
[[
-n
"
$repo_path
"
]]
;
then
echo
${
repo_path
:t
}
fi
}
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