#!/bin/sh -efu

. girar-sh-functions

[ -n "${GIRAR_USER-}" ] ||
	fatal 'GIRAR_USER undefined'

usage()
{
	[ -z "$*" ] || echo >&2 "$PROG: $*"
cat >&2 <<EOF
Usage: $PROG <gear_repo> <tag_file> <repo>
       $PROG <gear_repo> <tag_file> -p <pocket>
EOF
	exit 1
}

if [ "${1-}" = '--help' ]; then
	usage
fi

[ "$#" -le 4 ] || usage 'Too many arguments.'
[ "$#" -ge 3 ] || usage 'Not enough arguments.'

gear="$1"; shift
tag_file="$1"; shift

# detect our arch
SYSARCH=$(uname -m)
[ "$SYSARCH" = "x86_64" ] || SYSARCH=i586

GET_VERSION_IN_REPO="girar-get-package-version-in-repo"
REPO_SUFFIX_COMMAND="girar-get-repo-suffix"
if [ "$#" = 2 ]; then
	if [ "$1" = "-p" ]; then
		GET_VERSION_IN_REPO="girar-get-package-version-in-pocket"
		REPO_SUFFIX_COMMAND="girar-get-repo-suffix -p"
		shift
	else
		usage "Invalid option."
	fi
fi

repo="$1"; shift
suffix="$($REPO_SUFFIX_COMMAND $repo)"


realpath()
{
	readlink -f "$@"
}

get_var()
{
	grep -i "^$1:" | head -n 1 | sed -e "s/^[^:]*[ \t]*:[ \t]*//"

}

relnum_regexp='s|\([a-zA-Z0-9\.]*[a-zA-Z\.]\)\([0-9_]\+\)|\2|'
reltxt_regexp='s|\([a-zA-Z0-9\.]*[a-zA-Z\.]\)\([0-9_]\+\)|\1|'
adjust_release()
{
	local txt num
	local rel="$1"
	if [ -n "$suffix" ]; then
		txt=$(echo $rel | sed -e "$reltxt_regexp")
		num=$(echo $rel | sed -e "$relnum_regexp")
		newnum="0"
		[ "$num" -gt 0 ] 2>/dev/null &&
			newnum=$(($num-1)) || :
		rel="$txt$newnum.$suffix.$num"
	fi
	printf "%s\n" $rel
}

set_var()
{
	subst "s|\($2:\).*\$|\1 $3|" $1
}

set_release()
{
	set_var $1 Release $2
}

commit_changes()
{
	local spec="$1"; shift
	local relver="$1"; shift
	local commit_id="$(git rev-parse --verify master)"

	local name="${GIRAR_PACKAGER_NAME-Girar Packager}"
	local email="${GIRAR_PACKAGER_EMAIL-girar@etersoft.ru}"

	git config user.name "$name"
	git config user.email "$email"

	add_changelog --nocheck -s girar-stamp-spec -a "$name <$email>" -e "- Girar automatic build for commit: $commit_id" $spec

	git commit -m "Girar automatic build with version-release: $relver" $spec
	GNUPGHOME=/usr/lib/girar-gpgkeys git tag -s -u "$email" $relver -m "$relver" 2>/dev/null
	git push -f origin master $relver 2>/dev/null
	printf '%s\n' "$relver" >$tag_file
}

get_gear_spec()
{
	local spec=
	if [ -f ".gear/rules" ]; then
		spec="$(grep "^spec:" .gear/rules | cut -d" " -f2)"
	elif [ -f ".gear-rules" ]; then
		spec="$(grep "^spec:" .gear-rules | cut -d" " -f2)"
	fi
	if [ -z "$spec" ]; then
		spec="$(git ls-tree master |
			sed -ne 's/^[^[:space:]]\+[[:space:]]\+blob[[:space:]]\+[^[:space:]]\+[[:space:]]\+\([^/[:space:]]\+\.spec\)$/\1/p')"
		[ `printf %s "$spec" |wc -l` -le 0 ] ||
			fatal "Too many specfiles found"
	fi

	test -r "$spec" && echo $spec || fatal "Specfile not found"
}

inc_version_release()
{
	local rc
	local relver=$1-$2
	local suffix=${3%.Build*}

	rc=$(rpmvercmp $relver $suffix)

	if [ $rc -lt 0 ]; then
		fatal "$relver: too small for autoincrement of current version-release: $3"
	elif [ $rc = 0 -a $relver != $3 ]; then
		subrel=${3#*.Build}
		subrel=$(($subrel+1))
		printf %s "$2.Build$subrel"
	else
		printf %s "$2.Build1"
	fi
}

workdir=
atexit()
{
	local rc=$?
	trap - EXIT
	[ -z "$workdir" ] || rm -rf -- "$workdir"
	exit $rc
}

trap '' HUP INT QUIT PIPE TERM
trap atexit EXIT

workdir="$(mktemp -dt "$PROG.XXXXXXXXXX")"
tag_file=$(realpath "$tag_file")

unset GIT_DIR
GIT_DIR="$workdir/git"
git clone "$gear" "$GIT_DIR"
cd $GIT_DIR

spec=$(get_gear_spec)

get_package_info
package=$pkg_name
version=$pkg_version
release=$pkg_release
release=$(adjust_release $release)

current_relver=$($GET_VERSION_IN_REPO $package $repo)
[ -z "$current_relver" ] &&
	current_relver="$version-$release"

new_release=$(inc_version_release $version $release $current_relver)
set_release "$spec" "$new_release"

commit_changes "$spec" "$version-$new_release"
