# shgit
# 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()
{
	: ${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"
}