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
6443626a
Commit
6443626a
authored
Aug 01, 2015
by
Marc Cornellà
Browse files
Pull in latest version from olivierverdier/zsh-git-prompt
parent
192de6bc
Changes
2
Hide whitespace changes
Inline
Side-by-side
plugins/git-prompt/git-prompt.plugin.zsh
View file @
6443626a
# ZSH Git Prompt Plugin from:
# http://github.com/olivierverdier/zsh-git-prompt
#
export
__GIT_PROMPT_DIR
=
$ZSH
/plugins/git-prompt
export
__GIT_PROMPT_DIR
=
${
0
:A:h
}
export
GIT_PROMPT_EXECUTABLE
=
${
GIT_PROMPT_USE_PYTHON
:-
"python"
}
# Initialize colors.
autoload
-U
colors
colors
# Allow for functions in the prompt.
setopt PROMPT_SUBST
## Enable auto-execution of functions.
typeset
-ga
preexec_functions
typeset
-ga
precmd_functions
typeset
-ga
chpwd_functions
autoload
-U
add-zsh-hook
# Append git functions needed for prompt.
preexec_functions+
=
'preexec_update_git_vars'
precmd_functions+
=
'precmd_update_git_vars'
chpwd_functions+
=
'chpwd_update_git_vars'
add-zsh-hook chpwd chpwd_update_git_vars
add-zsh-hook preexec preexec_update_git_vars
add-zsh-hook precmd precmd_update_git_vars
## Function definitions
function
preexec_update_git_vars
()
{
case
"
$2
"
in
git
*
)
git
*
|
hub
*
|
gh
*
|
stg
*
)
__EXECUTED_GIT_COMMAND
=
1
;;
esac
}
function
precmd_update_git_vars
()
{
if
[
-n
"
$__EXECUTED_GIT_COMMAND
"
]
;
then
if
[
-n
"
$__EXECUTED_GIT_COMMAND
"
]
||
[
!
-n
"
$ZSH_THEME_GIT_PROMPT_CACHE
"
]
;
then
update_current_git_vars
unset
__EXECUTED_GIT_COMMAND
fi
...
...
@@ -39,19 +41,68 @@ function chpwd_update_git_vars() {
function
update_current_git_vars
()
{
unset
__CURRENT_GIT_STATUS
local
gitstatus
=
"
$__GIT_PROMPT_DIR
/gitstatus.py"
_GIT_STATUS
=
`
python
${
gitstatus
}
`
__CURRENT_GIT_STATUS
=(
"
${
(f)_GIT_STATUS
}
"
)
if
[[
"
$GIT_PROMPT_EXECUTABLE
"
==
"python"
]]
;
then
local
gitstatus
=
"
$__GIT_PROMPT_DIR
/gitstatus.py"
_GIT_STATUS
=
`
python
${
gitstatus
}
2>/dev/null
`
fi
if
[[
"
$GIT_PROMPT_EXECUTABLE
"
==
"haskell"
]]
;
then
local
gitstatus
=
"
$__GIT_PROMPT_DIR
/dist/build/gitstatus/gitstatus"
_GIT_STATUS
=
`
${
gitstatus
}
`
fi
__CURRENT_GIT_STATUS
=(
"
${
(@s
:
:
)_GIT_STATUS
}
"
)
GIT_BRANCH
=
$__CURRENT_GIT_STATUS
[
1]
GIT_AHEAD
=
$__CURRENT_GIT_STATUS
[
2]
GIT_BEHIND
=
$__CURRENT_GIT_STATUS
[
3]
GIT_STAGED
=
$__CURRENT_GIT_STATUS
[
4]
GIT_CONFLICTS
=
$__CURRENT_GIT_STATUS
[
5]
GIT_CHANGED
=
$__CURRENT_GIT_STATUS
[
6]
GIT_UNTRACKED
=
$__CURRENT_GIT_STATUS
[
7]
}
function
prompt_git_info
()
{
git_super_status
()
{
precmd_update_git_vars
if
[
-n
"
$__CURRENT_GIT_STATUS
"
]
;
then
echo
"(%{
${
fg
[red]
}
%}
$__CURRENT_GIT_STATUS
[1]%{
${
fg
[default]
}
%}
$__CURRENT_GIT_STATUS
[2]%{
${
fg
[magenta]
}
%}
$__CURRENT_GIT_STATUS
[3]%{
${
fg
[default]
}
%})"
fi
STATUS
=
"
$ZSH_THEME_GIT_PROMPT_PREFIX$ZSH_THEME_GIT_PROMPT_BRANCH$GIT_BRANCH
%{
${
reset_color
}
%}"
if
[
"
$GIT_BEHIND
"
-ne
"0"
]
;
then
STATUS
=
"
$STATUS$ZSH_THEME_GIT_PROMPT_BEHIND$GIT_BEHIND
%{
${
reset_color
}
%}"
fi
if
[
"
$GIT_AHEAD
"
-ne
"0"
]
;
then
STATUS
=
"
$STATUS$ZSH_THEME_GIT_PROMPT_AHEAD$GIT_AHEAD
%{
${
reset_color
}
%}"
fi
STATUS
=
"
$STATUS$ZSH_THEME_GIT_PROMPT_SEPARATOR
"
if
[
"
$GIT_STAGED
"
-ne
"0"
]
;
then
STATUS
=
"
$STATUS$ZSH_THEME_GIT_PROMPT_STAGED$GIT_STAGED
%{
${
reset_color
}
%}"
fi
if
[
"
$GIT_CONFLICTS
"
-ne
"0"
]
;
then
STATUS
=
"
$STATUS$ZSH_THEME_GIT_PROMPT_CONFLICTS$GIT_CONFLICTS
%{
${
reset_color
}
%}"
fi
if
[
"
$GIT_CHANGED
"
-ne
"0"
]
;
then
STATUS
=
"
$STATUS$ZSH_THEME_GIT_PROMPT_CHANGED$GIT_CHANGED
%{
${
reset_color
}
%}"
fi
if
[
"
$GIT_UNTRACKED
"
-ne
"0"
]
;
then
STATUS
=
"
$STATUS$ZSH_THEME_GIT_PROMPT_UNTRACKED
%{
${
reset_color
}
%}"
fi
if
[
"
$GIT_CHANGED
"
-eq
"0"
]
&&
[
"
$GIT_CONFLICTS
"
-eq
"0"
]
&&
[
"
$GIT_STAGED
"
-eq
"0"
]
&&
[
"
$GIT_UNTRACKED
"
-eq
"0"
]
;
then
STATUS
=
"
$STATUS$ZSH_THEME_GIT_PROMPT_CLEAN
"
fi
STATUS
=
"
$STATUS
%{
${
reset_color
}
%}
$ZSH_THEME_GIT_PROMPT_SUFFIX
"
echo
"
$STATUS
"
fi
}
# Default values for the appearance of the prompt. Configure at will.
ZSH_THEME_GIT_PROMPT_PREFIX
=
"("
ZSH_THEME_GIT_PROMPT_SUFFIX
=
")"
ZSH_THEME_GIT_PROMPT_SEPARATOR
=
"|"
ZSH_THEME_GIT_PROMPT_BRANCH
=
"%{
$fg_bold
[magenta]%}"
ZSH_THEME_GIT_PROMPT_STAGED
=
"%{
$fg
[red]%}%{●%G%}"
ZSH_THEME_GIT_PROMPT_CONFLICTS
=
"%{
$fg
[red]%}%{✖%G%}"
ZSH_THEME_GIT_PROMPT_CHANGED
=
"%{
$fg
[blue]%}%{✚%G%}"
ZSH_THEME_GIT_PROMPT_BEHIND
=
"%{↓%G%}"
ZSH_THEME_GIT_PROMPT_AHEAD
=
"%{↑%G%}"
ZSH_THEME_GIT_PROMPT_UNTRACKED
=
"%{…%G%}"
ZSH_THEME_GIT_PROMPT_CLEAN
=
"%{
$fg_bold
[green]%}%{✔%G%}"
# Set the prompt.
#PROMPT='%B%m%~%b$(prompt_git_info) %# '
# for a right prompt:
#RPROMPT='%b$(prompt_git_info)'
RPROMPT
=
'$(prompt_git_info)'
RPROMPT
=
'$(git_super_status)'
plugins/git-prompt/gitstatus.py
View file @
6443626a
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
from
subprocess
import
Popen
,
PIPE
import
re
# change those symbols to whatever you prefer
symbols
=
{
'ahead of'
:
'↑'
,
'behind'
:
'↓'
,
'staged'
:
'♦'
,
'changed'
:
'‣'
,
'untracked'
:
'…'
,
'clean'
:
'⚡'
,
'unmerged'
:
'≠'
,
'sha1'
:
':'
}
from
__future__
import
print_function
output
,
error
=
Popen
(
[
'git'
,
'status'
],
stdout
=
PIPE
,
stderr
=
PIPE
,
universal_newlines
=
True
).
communicate
()
# change this symbol to whatever you prefer
prehash
=
':'
if
error
:
import
sys
sys
.
exit
(
0
)
lines
=
output
.
splitlines
()
from
subprocess
import
Popen
,
PIPE
behead_re
=
re
.
compile
(
r
"^# Your branch is (ahead of|behind) '(.*)' by (\d+) commit"
)
diverge_re
=
re
.
compile
(
r
"^# and have (\d+) and (\d+) different"
)
import
sys
gitsym
=
Popen
([
'git'
,
'symbolic-ref'
,
'HEAD'
],
stdout
=
PIPE
,
stderr
=
PIPE
)
branch
,
error
=
gitsym
.
communicate
(
)
status
=
''
staged
=
re
.
compile
(
r
'^# Changes to be committed:$'
,
re
.
MULTILINE
)
changed
=
re
.
compile
(
r
'^# Changed but not updated:$'
,
re
.
MULTILINE
)
untracked
=
re
.
compile
(
r
'^# Untracked files:$'
,
re
.
MULTILINE
)
unmerged
=
re
.
compile
(
r
'^# Unmerged paths:$'
,
re
.
MULTILINE
)
error_string
=
error
.
decode
(
'utf-8'
)
if
'fatal: Not a git repository'
in
error_string
:
sys
.
exit
(
0
)
def
execute
(
*
command
):
out
,
err
=
Popen
(
stdout
=
PIPE
,
stderr
=
PIPE
,
*
command
).
communicate
()
if
not
err
:
nb
=
len
(
out
.
splitlines
())
else
:
nb
=
'?'
return
nb
branch
=
branch
.
decode
(
"utf-8"
).
strip
()[
11
:]
if
staged
.
search
(
output
):
nb
=
execute
(
[
'git'
,
'diff'
,
'--staged'
,
'--name-only'
,
'--diff-filter=ACDMRT'
])
status
+=
'%s%s'
%
(
symbols
[
'staged'
],
nb
)
if
unmerged
.
search
(
output
):
nb
=
execute
([
'git'
,
'diff'
,
'--staged'
,
'--name-
only'
,
'--diff-filter=U'
])
status
+=
'%s%s'
%
(
symbols
[
'unmerged'
],
nb
)
if
changed
.
search
(
output
):
nb
=
execute
([
'git'
,
'diff'
,
'--name-only'
,
'--diff-filter=ACDMRT'
])
status
+=
'%s%s'
%
(
symbols
[
'changed'
],
nb
)
if
untracked
.
search
(
output
):
status
+=
symbols
[
'untracked'
]
if
status
==
''
:
status
=
symbols
[
'clean'
]
res
,
err
=
Popen
([
'git'
,
'diff'
,
'--name-status'
],
stdout
=
PIPE
,
stderr
=
PIPE
).
communicate
()
err_string
=
err
.
decode
(
'utf-8'
)
if
'fatal'
in
err_string
:
sys
.
exit
(
0
)
changed_files
=
[
namestat
[
0
]
for
namestat
in
res
.
decode
(
"utf-8"
).
splitlines
()]
staged_files
=
[
namestat
[
0
]
for
namestat
in
Popen
([
'git'
,
'diff'
,
'--staged'
,
'--name-
status'
],
stdout
=
PIPE
).
communicate
()[
0
].
splitlines
()]
nb_changed
=
len
(
changed_files
)
-
changed_files
.
count
(
'U'
)
nb_U
=
staged_files
.
count
(
'U'
)
nb_staged
=
len
(
staged_files
)
-
nb_U
staged
=
str
(
nb_staged
)
conflicts
=
str
(
nb_U
)
changed
=
str
(
nb_changed
)
nb_untracked
=
len
([
0
for
status
in
Popen
([
'git'
,
'status'
,
'--porcelain'
,],
stdout
=
PIPE
).
communicate
()[
0
].
decode
(
"utf-8"
).
splitlines
()
if
status
.
startswith
(
'??'
)])
untracked
=
str
(
nb_untracked
)
remote
=
''
ahead
,
behind
=
0
,
0
bline
=
lines
[
0
]
if
bline
.
find
(
'Not currently on any branch'
)
!=
-
1
:
branch
=
symbols
[
'sha1'
]
+
Popen
([
'git'
,
'rev-parse'
,
'--short'
,
'HEAD'
],
stdout
=
PIPE
).
communicate
()[
0
][:
-
1
]
if
not
branch
:
# not on any branch
branch
=
prehash
+
Popen
([
'git'
,
'rev-parse'
,
'--short'
,
'HEAD'
],
stdout
=
PIPE
).
communicate
()[
0
].
decode
(
"utf-8"
)[:
-
1
]
else
:
branch
=
bline
.
split
(
' '
)[
-
1
]
bstatusline
=
lines
[
1
]
match
=
behead_re
.
match
(
bstatusline
)
if
match
:
remote
=
symbols
[
match
.
groups
()[
0
]]
remote
+=
match
.
groups
()[
2
]
elif
lines
[
2
:]:
div_match
=
diverge_re
.
match
(
lines
[
2
])
if
div_match
:
remote
=
"{behind}{1}{ahead of}{0}"
.
format
(
*
div_match
.
groups
(),
**
symbols
)
remote_name
=
Popen
([
'git'
,
'config'
,
'branch.%s.remote'
%
branch
],
stdout
=
PIPE
).
communicate
()[
0
].
decode
(
"utf-8"
).
strip
()
if
remote_name
:
merge_name
=
Popen
([
'git'
,
'config'
,
'branch.%s.merge'
%
branch
],
stdout
=
PIPE
).
communicate
()[
0
].
decode
(
"utf-8"
).
strip
()
if
remote_name
==
'.'
:
# local
remote_ref
=
merge_name
else
:
remote_ref
=
'refs/remotes/%s/%s'
%
(
remote_name
,
merge_name
[
11
:])
revgit
=
Popen
([
'git'
,
'rev-list'
,
'--left-right'
,
'%s...HEAD'
%
remote_ref
],
stdout
=
PIPE
,
stderr
=
PIPE
)
revlist
=
revgit
.
communicate
()[
0
]
if
revgit
.
poll
():
# fallback to local
revlist
=
Popen
([
'git'
,
'rev-list'
,
'--left-right'
,
'%s...HEAD'
%
merge_name
],
stdout
=
PIPE
,
stderr
=
PIPE
).
communicate
()[
0
]
behead
=
revlist
.
decode
(
"utf-8"
).
splitlines
()
ahead
=
len
([
x
for
x
in
behead
if
x
[
0
]
==
'>'
])
behind
=
len
(
behead
)
-
ahead
out
=
' '
.
join
([
branch
,
str
(
ahead
),
str
(
behind
),
staged
,
conflicts
,
changed
,
untracked
,
])
print
(
out
,
end
=
''
)
print
(
'
\n
'
.
join
([
branch
,
remote
,
status
]))
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