mirror of
https://github.com/ohmyzsh/ohmyzsh.git
synced 2026-01-30 02:44:42 +01:00
Avoid looking for dirty submodules when git >= 1.7.2 using the --ignore-submodules=dirty option. Avoid looking at untracked files and other types of files when the theme does not display them. This dramatically speeds up performance.
190 lines
6.1 KiB
Bash
190 lines
6.1 KiB
Bash
# get the name of the branch we are on
|
|
function git_prompt_info() {
|
|
ref=$(git symbolic-ref HEAD 2> /dev/null) || \
|
|
ref=$(git rev-parse --short HEAD 2> /dev/null) || return
|
|
echo "$ZSH_THEME_GIT_PROMPT_PREFIX${ref#refs/heads/}$(parse_git_dirty)$ZSH_THEME_GIT_PROMPT_SUFFIX"
|
|
}
|
|
|
|
|
|
# Checks if working tree is dirty
|
|
parse_git_dirty() {
|
|
if [[ -z "$ZSH_THEME_GIT_PROMPT_DIRTY" &&
|
|
-z "$ZSH_THEME_GIT_PROMPT_CLEAN" ]]; then
|
|
return
|
|
fi
|
|
|
|
local SUBMODULE_SYNTAX=''
|
|
local GIT_STATUS=''
|
|
|
|
if [[ "$(git config --get oh-my-zsh.hide-status)" != "1" ]]; then
|
|
if [[ $POST_1_7_2_GIT -gt 0 ]]; then
|
|
SUBMODULE_SYNTAX="--ignore-submodules=dirty"
|
|
fi
|
|
if [[ "$DISABLE_UNTRACKED_FILES_DIRTY" != "true" ]]; then
|
|
GIT_STATUS=$(git status -s ${SUBMODULE_SYNTAX} 2> /dev/null | tail -n1)
|
|
else
|
|
GIT_STATUS=$(git status -s ${SUBMODULE_SYNTAX} -uno 2> /dev/null | tail -n1)
|
|
fi
|
|
if [[ -n $(git status -s ${SUBMODULE_SYNTAX} -uno 2> /dev/null) ]]; then
|
|
echo "$ZSH_THEME_GIT_PROMPT_DIRTY"
|
|
else
|
|
echo "$ZSH_THEME_GIT_PROMPT_CLEAN"
|
|
fi
|
|
else
|
|
echo "$ZSH_THEME_GIT_PROMPT_CLEAN"
|
|
fi
|
|
}
|
|
|
|
# get the difference between the local and remote branches
|
|
git_remote_status() {
|
|
remote=${$(git rev-parse --verify ${hook_com[branch]}@{upstream} --symbolic-full-name 2>/dev/null)/refs\/remotes\/}
|
|
if [[ -n ${remote} ]] ; then
|
|
ahead=$(git rev-list ${hook_com[branch]}@{upstream}..HEAD 2>/dev/null | wc -l)
|
|
behind=$(git rev-list HEAD..${hook_com[branch]}@{upstream} 2>/dev/null | wc -l)
|
|
|
|
if [ $ahead -eq 0 ] && [ $behind -gt 0 ]
|
|
then
|
|
echo "$ZSH_THEME_GIT_PROMPT_BEHIND_REMOTE"
|
|
elif [ $ahead -gt 0 ] && [ $behind -eq 0 ]
|
|
then
|
|
echo "$ZSH_THEME_GIT_PROMPT_AHEAD_REMOTE"
|
|
elif [ $ahead -gt 0 ] && [ $behind -gt 0 ]
|
|
then
|
|
echo "$ZSH_THEME_GIT_PROMPT_DIVERGED_REMOTE"
|
|
fi
|
|
fi
|
|
}
|
|
|
|
# Checks if there are commits ahead from remote
|
|
function git_prompt_ahead() {
|
|
if [[ -n $(git rev-list -1 --first-parent @{upstream}..HEAD 2>/dev/null) ]]; then
|
|
echo "$ZSH_THEME_GIT_PROMPT_AHEAD"
|
|
fi
|
|
}
|
|
|
|
# Formats prompt string for current git commit short SHA
|
|
function git_prompt_short_sha() {
|
|
SHA=$(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() {
|
|
SHA=$(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
|
|
git_prompt_status() {
|
|
local NO_DIRTY_SUBMODULES=''
|
|
local NO_UNTRACKED=''
|
|
|
|
if [[ $POST_1_7_2_GIT -gt 0 ]]; then
|
|
NO_DIRTY_SUBMODULES="--ignore-submodules=dirty"
|
|
fi
|
|
|
|
if [[ -z "$ZSH_THEME_GIT_PROMPT_UNTRACKED" ]]; then
|
|
NO_UNTRACKED="--untracked-files=no"
|
|
fi
|
|
|
|
# This could use --porcelain but git does not print
|
|
# the branch ahead/behind information when --porcelain is used.
|
|
INDEX=$(git status -s -b ${NO_DIRTY_SUBMODULES} ${NO_UNTRACKED} 2>/dev/null)
|
|
STATUS=""
|
|
|
|
if [[ -n "$ZSH_THEME_GIT_PROMPT_UNTRACKED" ]]; then
|
|
if echo "$INDEX" | grep -E '^\?\? ' &> /dev/null; then
|
|
STATUS="$ZSH_THEME_GIT_PROMPT_UNTRACKED$STATUS"
|
|
fi
|
|
fi
|
|
|
|
if [[ -n "$ZSH_THEME_GIT_PROMPT_ADDED" ]]; then
|
|
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"
|
|
fi
|
|
fi
|
|
|
|
if [[ -n "$ZSH_THEME_GIT_PROMPT_MODIFIED" ]]; then
|
|
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 '^ T ' &> /dev/null; then
|
|
STATUS="$ZSH_THEME_GIT_PROMPT_MODIFIED$STATUS"
|
|
fi
|
|
fi
|
|
|
|
if [[ -n "$ZSH_THEME_GIT_PROMPT_RENAMED" ]]; then
|
|
if echo "$INDEX" | grep '^R ' &> /dev/null; then
|
|
STATUS="$ZSH_THEME_GIT_PROMPT_RENAMED$STATUS"
|
|
fi
|
|
fi
|
|
|
|
if [[ -n "$ZSH_THEME_GIT_PROMPT_DELETED" ]]; then
|
|
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
|
|
STATUS="$ZSH_THEME_GIT_PROMPT_DELETED$STATUS"
|
|
fi
|
|
fi
|
|
|
|
if [[ -n "$ZSH_THEME_GIT_PROMPT_STASHED" ]]; then
|
|
if git rev-parse --verify refs/stash &> /dev/null; then
|
|
STATUS="$ZSH_THEME_GIT_PROMPT_STASHED$STATUS"
|
|
fi
|
|
fi
|
|
|
|
if [[ -n "$ZSH_THEME_GIT_PROMPT_UNMERGED" ]]; then
|
|
if echo "$INDEX" | grep '^UU ' &> /dev/null; then
|
|
STATUS="$ZSH_THEME_GIT_PROMPT_UNMERGED$STATUS"
|
|
fi
|
|
fi
|
|
|
|
if [[ -n "$ZSH_THEME_GIT_PROMPT_AHEAD" ]]; then
|
|
if echo "$INDEX" | grep '^## .*ahead' &> /dev/null; then
|
|
STATUS="$ZSH_THEME_GIT_PROMPT_AHEAD$STATUS"
|
|
fi
|
|
fi
|
|
|
|
if [[ -n "$ZSH_THEME_GIT_PROMPT_BEHIND" ]]; then
|
|
if echo "$INDEX" | grep '^## .*behind' &> /dev/null; then
|
|
STATUS="$ZSH_THEME_GIT_PROMPT_BEHIND$STATUS"
|
|
fi
|
|
fi
|
|
|
|
if [[ -n "$ZSH_THEME_GIT_PROMPT_DIVERGED" ]]; then
|
|
if echo "$INDEX" | grep '^## .*diverged' &> /dev/null; then
|
|
STATUS="$ZSH_THEME_GIT_PROMPT_DIVERGED$STATUS"
|
|
fi
|
|
fi
|
|
|
|
echo $STATUS
|
|
}
|
|
|
|
#compare the provided version of git to the version installed and on path
|
|
#prints 1 if input version <= installed version
|
|
#prints -1 otherwise
|
|
function git_compare_version() {
|
|
local INPUT_GIT_VERSION=$1;
|
|
local INSTALLED_GIT_VERSION
|
|
INPUT_GIT_VERSION=(${(s/./)INPUT_GIT_VERSION});
|
|
INSTALLED_GIT_VERSION=($(git --version 2>/dev/null));
|
|
INSTALLED_GIT_VERSION=(${(s/./)INSTALLED_GIT_VERSION[3]});
|
|
|
|
for i in {1..3}; do
|
|
if [[ $INSTALLED_GIT_VERSION[$i] -lt $INPUT_GIT_VERSION[$i] ]]; then
|
|
echo -1
|
|
return 0
|
|
fi
|
|
done
|
|
echo 1
|
|
}
|
|
|
|
#this is unlikely to change so make it all statically assigned
|
|
if [[ -z "$POST_1_7_2_GIT" ]]; then
|
|
POST_1_7_2_GIT=$(git_compare_version "1.7.2")
|
|
fi
|
|
#clean up the namespace slightly by removing the checker function
|
|
unset -f git_compare_version
|