2025-03-18 19:21:17 +01:00

201 lines
5.8 KiB
Fish

__breeze_variables
function __set_variables
set arr
set -g staged
set -g unstaged
set -g untracked
set -g ignored
set -g unmerged
set -g current_color
set -g hash "#"
set -g colon ":"
end
function __sanitize_flags -d "only allow for predefined flags"
set whitelist "--ignored" "--renames" "--no-renames"
set sanitized
for flag in (string split " " -- $argv)
if contains -- $flag $whitelist
set sanitized $sanitized $flag
end
end
echo $sanitized
end
function __parse_unmerged -a us them -d "parse shorthand status for unmerged paths"
set code "$us$them"
switch $code
case DD
set current_status "both deleted"
set current_color 'red'
case AU
set current_status "added by us"
set current_color 'yellow'
case UD
set current_status "deleted by them"
set current_color 'red'
case UA
set current_status "added by them"
set current_color 'yellow'
case DU
set current_status "deleted by us"
set current_color 'red'
case AA
set current_status "both added"
set current_color 'yellow'
case UU
set current_status "both modified"
set current_color 'green'
end
echo $current_status
end
function __parse_status -a code -d "parse shorthand status"
switch $code
case A
set current_status "new file"
set current_color 'yellow'
case C
set current_status "copied"
set current_color 'magenta'
case D
set current_status "deleted"
set current_color 'red'
case M
set current_status "modified"
set current_color 'green'
case R
set current_status "renamed"
set current_color 'blue'
case !
set current_status "ignored"
set current_color 'white'
case '?'
set current_status "untracked"
set current_color 'cyan'
end
echo $current_status
end
function __parse_state -a state -d "parse the current state"
switch $state
case staged
set current_state "Changes to be committed"
case unstaged
set current_state "Changes not staged for commit"
case untracked
set current_state "Untracked files"
case unmerged
set current_state "Unmerged paths"
case '*'
set current_state "Ignored files"
end
echo $current_state
end
function __handle_renames_and_copies -a idx name -d "removes explict rename or copy paths for unstaged files"
if test $idx = "R"
or test $idx = "C"
set elements (string split " -> " $name)
set name $elements[2]
end
echo $name
end
function __print_branch -d "print the branch information"
printf (set_color black)"$hash "(set_color normal)"On branch: "(set_color --bold white)(git branch --show-current)(set_color normal)\n(set_color black)"$hash\n"
end
function __print_state -a message length -d "print the state message"
if test $length -gt 0
set arrow "➤"
printf (set_color black)"$hash"\n(set_color normal)"$arrow $message$colon"\n(set_color black)"$hash\n"
end
end
function __format_status -a message name -d "foramt the output of the status"
echo (printf "%s %15s$colon %s %s" (set_color $current_color)$hash $message (set_color normal)"/idx/" (set_color $current_color)$name)
end
function __print_status -a st i padding -d "prints the status"
set arr $arr (echo (echo $st | string split "/idx/")[2] | string trim | string replace -r -a '\e\[[^m]*m' '' | string split " -> ")[-1]
printf (string replace "/idx/" (printf "%"$padding"s" [$i]) $st)\n
end
function __print -d "print output to screen"
set length (count $staged $unmerged $unstaged $untracked $ignored)
set idx_padding (math 2 + (count (string split '' $length )))
set states staged unmerged unstaged untracked ignored
__print_branch
set i 1
for state in $states
__print_state (__parse_state $state) (count $$state)
for st in $$state
__print_status $st $i $idx_padding
set i (math $i + 1)
end
end
if test $length -eq 0
echo (set_color black)"$hash"(set_color normal)" nothing to commit, working tree clean"
end
echo (set_color black)"$hash"
set_color normal
end
function __gs -a flags -d "group statuses by state and print to screen"
set unmerged_files (git diff --name-only --diff-filter=U)
for row in (eval (string join " " "git status --porcelain" -- $flags))
set idx (string sub -l 1 $row)
set tree (string sub -s 2 -l 1 $row)
set name (string sub -s 4 $row | string unescape )
if contains $name $unmerged_files
set unmerged $unmerged (__format_status (__parse_unmerged $idx $tree) $name)
continue
end
if test $idx = "?"
set untracked $untracked (__format_status (__parse_status $idx) $name)
continue
end
if test $idx = !
set ignored $ignored (__format_status (__parse_status $idx) $name)
continue
end
if test $idx != " "
set staged $staged (__format_status (__parse_status $idx) $name)
end
if test $tree != " "
set unstaged $unstaged (__format_status (__parse_status $tree) (__handle_renames_and_copies $idx $name))
end
end
__print
end
function gs $argv
set res (git rev-parse --is-inside-work-tree)
if [ $res = 'true' ]
__set_variables
__gs (__sanitize_flags $argv)
else
echo 'fatal: Not a git repository (or any of the parent directories): .git'
end
end