#!/bin/sh

#GERRITHOST=gerrit.libreoffice.org
GERRITHOST=logerrit
GERRITURL=ssh://$GERRITHOST/core

get_SHA_for_change() {
	SHA=`ssh ${GERRITHOST?} gerrit query --all-approvals change:$1|grep ref|tail -1|cut -d: -f2`
}

get_REVISION_for_change() {
	REVISION=`ssh ${GERRITHOST?} gerrit query --all-approvals change:$1|grep revision|tail -1|cut -d: -f2`
}

ask_tristate() {
	case $1 in
		[yY] | [yY][Ee][Ss] | [+] )
			ANSWER=y
		;;
		[nN] | [n|N][O|o] | [-] )
			ANSWER=n
		;;
		[] )
			ANSWER=
		;;
		* )
			echo "Please answer with either +,-,y,n,yes,no or the empty string."
			exit 1
		;;
	esac

}

submit() {
		BRANCH=$1
		if test -z "$BRANCH"
		then
			BRANCH=`git symbolic-ref HEAD 2> /dev/null`
			BRANCH="${BRANCH##refs/heads/}"
			if test -z "$BRANCH"
			then
				echo "no branch specified, and could not guess the current branch"
				exit 1
			fi
			echo "no branch specified, guessing current branch $BRANCH"
		fi
		git push $GERRITURL HEAD:refs/for/$BRANCH
}

case "$1" in
	help)
		echo "Usage: ./logerrit subcommand [options]"
		echo "simple and basic tool to interact with LibreOffice gerrit"
		echo "subcommands:"
		echo "             test                    test your gerrit setup"
		echo " --- for submitters:"
		echo "             submit [BRANCH]         submit your change for review"
		echo "             resubmit [BRANCH]       create a new Change-Id and submit your change for review"
		echo "                                     (yes, this modifies your last commit)"
		echo "             nextchange [BRANCH]     reset branch to the remote to start with the next change"
		echo " --- for reviewers:"
		echo "             checkout CHANGEID       checkout the changes for review"
		echo "             pull CHANGEID           pull (and merge) the changes on current branch"
		echo "             cherry-pick CHANGEID    cherry-pick the change on current branch"
		echo "             patch CHANGEID          show the change as a patch"
		echo "             review [CHANGEID]       interactively review a change (current one if no changeid given)"
		echo "             query ....              query for changes for review on project core"
		echo "             <any other gerrit command>"
		echo "advanced users should consider using git review instead:"
		echo "http://wiki.documentfoundation.org/Development/GitReview"
		exit
	;;
	test)
		if test -n "`ssh $GERRITHOST 2>&1|grep \"Welcome to Gerrit Code Review\"`"
		then
			echo "Your gerrit setup was successful!"
		else
			echo "There seems to be trouble."
			echo "please have the output of: ssh -vvvv logerrit"
			echo "at hand when looking for help."
		fi
	;;
	submit)
        submit $2
	;;
    resubmit)
        git log -1 --pretty=%B | grep -v ^Change-Id: | git commit --amend -F -
        submit $2
    ;;
	nextchange)
		if test -n "`git status -s -uno`"
		then
			echo "You have uncommitted changes. Please commit or stash these:"
			git status
			exit 1
		fi
		CHANGEID=`git log --format=format:%b -1 HEAD|grep Change-Id|cut -d: -f2|tr -d \ `
		if test -z "$CHANGEID"
		then
			CHANGEID="NOCHANGEID"
		fi
		BACKUPBRANCH=backup/$CHANGEID-`date +%F-%H%M%S`
		git branch $BACKUPBRANCH
		echo "current state backed up as $BACKUPBRANCH"
		BRANCH=$2
		if test -z "$BRANCH"
		then
			BRANCH=`git symbolic-ref HEAD 2> /dev/null`
			BRANCH="${BRANCH##refs/heads/}"
			if test -z "$BRANCH"
			then
				echo "no branch specified, and could not guess the current branch"
				exit 1
			fi
			echo "no branch specified, guessing current branch $BRANCH"
		fi
		git reset --hard remotes/origin/$BRANCH
	;;
	review)
		CHANGEID=$2
		if test -z "$CHANGEID"
		then
			CHANGEID=`git log --format=format:%b -1 HEAD|grep Change-Id|cut -d: -f2`
			if test -z "$CHANGEID"
			then
				echo "could not find a Change-Id in your last commit, sorry"
				exit 1
			fi
			echo "no Change-Id given on the command line, reviewing change$CHANGEID"
		fi
		MESSAGEREQ=""
		read -p 'was the change verified to build successfully (+) or found not to build (-) or none of that ()? ' VERIFIED
		ask_tristate $VERIFIED
		case "$ANSWER" in
			"y")
				VERIFIEDFLAG=--verified=+1
			;;
			"n")
				VERIFIEDFLAG="--verified=-1"
				MESSAGEREQ="$MESSAGEREQ and explain why you could not verify this"
			;;
			*)
				VERIFIEDFLAG="--verified=0"
			;;

		esac
		read -p 'is the code looking good (+), bad (-) or none of that ()? ' CODEREVIEW
		ask_tristate $CODEREVIEW
		SUBMITFLAG=""
		case "$ANSWER" in
			"y")
				read -p 'do you approve the change (+) too, or prefer someone else to do that ()? ' CODEREVIEW
				ask_tristate $CODEREVIEW
				case "$ANSWER" in
					"y")
						CODEREVIEWFLAG="--code-review=2"
						SUBMITFLAG="--submit"
					;;
					"n")
						CODEREVIEWFLAG="--code-review=1"
					;;
					*)
						CODEREVIEWFLAG="--code-review=1"
					;;
				esac
			;;
			"n")
				read -p 'do you still allow the change to go in () or not (-)? ' CODEREVIEW
				ask_tristate $CODEREVIEW
				case "$ANSWER" in
					"y")
						CODEREVIEWFLAG="--code-review=-1"
						MESSAGEREQ="$MESSAGEREQ and explain why you have reservations about the code"
					;;
					"n")
						CODEREVIEWFLAG="--code-review=-2"
						MESSAGEREQ="$MESSAGEREQ and explain why you want to block this"
					;;
					*)
						CODEREVIEWFLAG="--code-review=-1"
						MESSAGEREQ="$MESSAGEREQ and explain why you have reservations about the code"
					;;
				esac
			;;
			*)
			;;
		esac
		read -p "please type a friendly comment$MESSAGEREQ: " MESSAGE
		get_REVISION_for_change $CHANGEID
		ssh ${GERRITHOST?} gerrit review -m \"$MESSAGE\" $VERIFIEDFLAG $CODEREVIEWFLAG $SUBMITFLAG $REVISION
	;;
	checkout)
		get_SHA_for_change $2
		git fetch $GERRITURL $SHA && git checkout FETCH_HEAD
	;;
	pull)
		get_SHA_for_change $2
		git pull $GERRITURL $SHA
	;;
	cherry-pick)
		get_SHA_for_change $2
		git fetch $GERRITURL $SHA && git cherry-pick FETCH_HEAD
	;;
	patch)
		get_SHA_for_change $2
		git fetch $GERRITURL $SHA && git format-patch -1 --stdout FETCH_HEAD
	;;
	query)
		shift
		ssh ${GERRITHOST?} gerrit query project:core $@
	;;
	*)
		ssh ${GERRITHOST?} gerrit $@
	;;
esac