env/utils/shgit

50 lines
1.3 KiB
Plaintext

# env
# Written in 2019 by Lucas
# CC0 1.0 Universal/Public domain - No rights reserved
#
# To the extent possible under law, the author(s) have dedicated all
# copyright and related and neighboring rights to this software to the
# public domain worldwide. This software is distributed without any
# warranty. You should have received a copy of the CC0 Public Domain
# Dedication along with this software. If not, see
# <http://creativecommons.org/publicdomain/zero/1.0/>.
shgit() {
if ! gitdir=$(git rev-parse --git-dir 2>/dev/null) \
|| [ -z "$gitdir" ]; then
return
fi
symbolic=$(git symbolic-ref --short HEAD 2>/dev/null)
hash=$(git rev-parse --short HEAD 2>/dev/null)
name=${symbolic:-${hash:-"?"}}
rb=
rbdir="$gitdir/rebase-merge"
if [ -d "$rbdir" ]; then
rb="REBASE"
read -r name <"$rbdir/head-name"
name=${name##*/}
[ -f "$rbdir/interactive" ] && rb="$rb-i"
rbcount=$(wc -l <"$rbdir/done")
read -r rbtotal <"$rbdir/end"
rb="$rb ${rbcount##* }/$rbtotal"
fi
status=
if [ -z "$(git status --porcelain)" ]; then
status="*"
fi
commits=$(git rev-list --left-right --count @{upstream}...HEAD \
2>/dev/null | {
t=
IFS=" " read -r behind ahead
[ ${behind:-0} -gt 0 ] && t=$t"v$behind"
[ ${ahead:-0} -gt 0 ] && t=$t"^$ahead"
printf "%s" "$t"
})
printf "%s" "$name${rb:+:$rb}${status:+:$status}${commits:+:$commits}"
}