tide/functions/_tide_item_git.fish

68 lines
3.3 KiB
Fish
Raw Normal View History

2021-01-17 22:22:02 +03:00
function _tide_item_git
2021-11-01 18:49:31 +03:00
if git branch --show-current 2>/dev/null | string replace -r "(.{$tide_git_truncation_length}).+" '$1…' | read -l location
2021-10-31 20:53:43 +03:00
git rev-parse --git-dir --is-inside-git-dir | read -f --line git_dir inside_git_dir
set location $_tide_location_color$location
2021-10-31 20:53:43 +03:00
else if test $pipestatus[1] != 0
return
else if git tag --points-at HEAD | string replace -r "(.{$tide_git_truncation_length}).+" '$1…' | read location
git rev-parse --git-dir --is-inside-git-dir | read -f --line git_dir inside_git_dir
set location '#'$_tide_location_color$location
else # --quiet = don't error if there are no commits
2021-10-31 20:53:43 +03:00
git rev-parse --git-dir --is-inside-git-dir --quiet --short HEAD | read -f --line git_dir inside_git_dir sha
set location @$_tide_location_color$sha
end
2021-01-17 02:15:33 +03:00
2021-01-17 04:17:18 +03:00
# Operation
2021-05-12 23:13:51 +03:00
if test -d $git_dir/rebase-merge
2021-09-23 18:35:10 +03:00
read -f step <$git_dir/rebase-merge/msgnum
read -f total_steps <$git_dir/rebase-merge/end
2021-10-26 20:50:54 +03:00
test -f $git_dir/rebase-merge/interactive && set -f operation rebase-i || set -f operation rebase-m
2021-05-12 23:13:51 +03:00
else if test -d $git_dir/rebase-apply
2021-09-23 18:35:10 +03:00
read -f step <$git_dir/rebase-apply/next
read -f total_steps <$git_dir/rebase-apply/last
2021-05-12 23:13:51 +03:00
if test -f $git_dir/rebase-apply/rebasing
2021-09-23 18:35:10 +03:00
set -f operation rebase
2021-05-12 23:13:51 +03:00
else if test -f $git_dir/rebase-apply/applying
2021-09-23 18:35:10 +03:00
set -f operation am
2021-01-17 02:15:33 +03:00
else
2021-09-23 18:35:10 +03:00
set -f operation am/rebase
2021-01-17 02:15:33 +03:00
end
2021-05-12 23:13:51 +03:00
else if test -f $git_dir/MERGE_HEAD
2021-09-23 18:35:10 +03:00
set -f operation merge
2021-05-12 23:13:51 +03:00
else if test -f $git_dir/CHERRY_PICK_HEAD
2021-09-23 18:35:10 +03:00
set -f operation cherry-pick
2021-05-12 23:13:51 +03:00
else if test -f $git_dir/REVERT_HEAD
2021-09-23 18:35:10 +03:00
set -f operation revert
2021-05-12 23:13:51 +03:00
else if test -f $git_dir/BISECT_LOG
2021-09-23 18:35:10 +03:00
set -f operation bisect
2021-01-17 02:15:33 +03:00
end
2021-01-16 20:49:48 +03:00
2021-10-09 19:59:22 +03:00
# Git status/stash + Upstream behind/ahead
test $inside_git_dir = true && set -l _set_dir_opt -C $git_dir/..
2021-10-09 19:59:22 +03:00
# Suppress errors in case we are in a bare repo or there is no upstream
2021-10-01 07:18:16 +03:00
git_info=(git $_set_dir_opt --no-optional-locks status --porcelain 2>/dev/null) \
2021-10-09 19:59:22 +03:00
string match -qr '(0|(?<stash>.*))\n(0|(?<conflicted>.*))\n(0|(?<staged>.*))
(0|(?<dirty>.*))\n(0|(?<untracked>.*))(\n(0|(?<behind>.*))\t(0|(?<ahead>.*)))?' \
"$(git $_set_dir_opt stash list 2>/dev/null | count
string match -r ^UU $git_info | count
string match -r ^[ADMR]. $git_info | count
string match -r ^.[ADMR] $git_info | count
string match -r '^\?\?' $git_info | count
2021-10-09 19:59:22 +03:00
git rev-list --count --left-right @{upstream}...HEAD 2>/dev/null)"
2021-01-17 03:50:50 +03:00
2021-10-03 22:07:00 +03:00
if test -n "$operation$conflicted"
set -g tide_git_bg_color $tide_git_bg_color_urgent
2021-10-03 22:07:00 +03:00
else if test -n "$staged$dirty$untracked"
set -g tide_git_bg_color $tide_git_bg_color_unstable
end
2021-10-31 21:16:17 +03:00
_tide_print_item git $_tide_location_color$tide_git_icon' ' (set_color white; echo -ns $location
2021-09-23 18:35:10 +03:00
set_color $tide_git_color_operation; echo -ns ' '$operation ' '$step/$total_steps
2021-09-24 03:47:59 +03:00
set_color $tide_git_color_upstream; echo -ns ' ⇣'$behind ' ⇡'$ahead
2021-09-08 20:54:31 +03:00
set_color $tide_git_color_stash; echo -ns ' *'$stash
set_color $tide_git_color_conflicted; echo -ns ' ~'$conflicted
set_color $tide_git_color_staged; echo -ns ' +'$staged
set_color $tide_git_color_dirty; echo -ns ' !'$dirty
set_color $tide_git_color_untracked; echo -ns ' ?'$untracked)
end