60 lines
1.5 KiB
Plaintext
60 lines
1.5 KiB
Plaintext
# shgit
|
|
# Written in 2019-2021 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()
|
|
{
|
|
: ${SHGIT_BEGIN:=} ${SHGIT_END:= } ${SHGIT_SEP:=:}
|
|
|
|
args=$(git rev-parse --git-dir --is-inside-work-tree 2>/dev/null) ||
|
|
return
|
|
set -- $args
|
|
gitdir=${1:-}
|
|
worktree=${2:-}
|
|
|
|
if ! name=$(git symbolic-ref -q --short HEAD); then
|
|
name=$(git rev-parse --short HEAD 2>/dev/null)
|
|
name=${name:-"?"}
|
|
fi
|
|
|
|
rb=
|
|
rbdir=$gitdir/rebase-merge
|
|
if [ -d "$rbdir" ]; then
|
|
rb=${SHGIT_SEP}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 [ "$worktree" = "true" ]; then
|
|
if [ -n "$(git status --porcelain)" ]; then
|
|
status=$SHGIT_SEP"*"
|
|
fi
|
|
else
|
|
status=$SHGIT_SEP"?"
|
|
fi
|
|
|
|
oldIFS=$IFS
|
|
IFS=" "
|
|
set -- $(git rev-list --left-right --count @{upstream}...HEAD \
|
|
2>/dev/null)
|
|
IFS=$oldIFS
|
|
commits=v${1:-0}^${2:-0}
|
|
commits=${commits#v0}
|
|
commits=${commits%^0}
|
|
commits=${commits:+$SHGIT_SEP$commits}
|
|
|
|
printf "%s%s%s" "$SHGIT_BEGIN" "$name$rb$status$commits" "$SHGIT_END"
|
|
}
|