#!/bin/sh

NWD=contrib/workdir/git-new-workdir
MASTER=master

section () {
	printf "\033]0;%s %s\007" "$branch" "$*"

	printf "\n\n\n"
	printf "############ %s %s\n" "$branch" "$*"
	printf "\n\n\n"
}

inst_prefix=$(
	IFS=:
	for p in $PATH
	do
		probed=${p%/git-active/bin}
		if test "$probed" != "$p"
		then
			echo "$probed"
			exit
		fi
	done
	echo $HOME
)

force= with_dash= test_long= M= install= doc= notest= bootstrap= branches= jobs=
scratch= noprove= memtrash=--memtrash with_cocci= with_leaks= with_sha256= san= 
clean= with_meson= breaking=

while	case "$1" in
	--pedantic | --locale=* | --loose) M="$M $1" ;;
	--force) force=$1 ;;
	--dash) with_dash=y ;;
	--clean) clean=y ;;
	--cocci) with_cocci=y ;;
	--no-cocci) with_cocci= ;;
	--long) test_long=--long ;;
	--noinstall) install=noinstall ;;
	--nodoc) doc=no ;;
	--asciidoc) doc=asciidoc ;;
	--asciidoctor) doc=ascidoctor ;;
	--notest) notest=y ;;
	--nomemtrash) memtrash= ;;
	--memtrash) memtrash=--memtrash ;;
	--test=*) test="$1" ;;
	--scratch) scratch=y ;;
	--breaking) breaking=breaking ;;
	--bootstrap) bootstrap=y ;;
	--base=*) BUILDBASE=${1#*=} ;;
	--branches=*) branches=${1#*=} ;;
	--noprove) noprove=$1 ;;
	--san) san=t ;;
	--leaks) with_leaks=t ;;
	--sha256) with_sha256=t ;;
	--meson) with_meson=t ;;
	-j*) jobs=$1 ;;
	--) shift; break ;;
	-*) echo >&2 "Unknown option: $1"; exit 1 ;;
	*) break ;;
	esac
do
	shift
done

if test -n "$doc"
then
	: ;# happy with whatever specified
elif sh -c 'asciidoc --version >/dev/null 2>&1'
then
	doc=asciidoc
elif sh -c 'asciidoctor --version >/dev/null 2>&1'
then
	doc=asciidoctor
else
	doc=no
fi

if test "$doc" = asciidoctor
then
	USE_ASCIIDOCTOR=YesPlease
else
	USE_ASCIIDOCTOR=
fi

GIT_TEST_CHAIN_LINT=1
export GIT_TEST_CHAIN_LINT

GIT_PROVE_OPTS="${GIT_PROVE_OPTS:+$GIT_PROVE_OPTS }--state=slow,save"
export GIT_PROVE_OPTS

test -f /bin/dash || with_dash=
if test -z "$BUILDBASE"
then
	if test -d "$inst_prefix/buildfarm"
	then
		BUILDBASE="$inst_prefix/buildfarm"
	elif test -d "../buildfarm"
	then
		BUILDBASE=../buildfarm
	else
		echo >&2 "Buildbase unknown"
		exit 1
	fi
fi
test -n "$branches" || branches="next $MASTER maint jch seen"
test -n "$jobs" || jobs=-j32

find_installed () {
	branch=$1
	test -f "$inst_prefix/git-$branch/bin/git" &&
	installed=$($inst_prefix/git-$branch/bin/git version) &&
	if version=$(expr "$installed" : '.*\.g\([0-9a-f]*\)$')
	then
		:
	elif version=v$(expr "$installed" : \
		'git version \(.*\)\.rc[0-9]*$')
	then
		version="$version"-$(expr "$installed" : \
			'git version .*\.\(rc[0-9]*\)$')
	else
		version=v$(expr "$installed" : 'git version \(.*\)')
	fi &&
	git rev-parse --verify "$version^0" 2>/dev/null
}

installed_source_trees=" "
for branch in $branches
do
	if	v=$(find_installed $branch) &&
		test -n "$v" &&
		v=$(git rev-parse --verify "$v^{tree}" 2>/dev/null)
	then
		installed_source_trees="$installed_source_trees$v "
	fi
done

for branch in $branches
do
	echo "** $branch **"
	revision=$(git show-ref -s --verify "refs/heads/$branch") || {
		echo "** No $branch"
		continue
	}

	if test ! -d "$BUILDBASE/$branch"
	then
		if test -z "$bootstrap"
		then
			echo "** No $BUILDBASE/$branch"
			continue
		fi
		"$NWD" . "$BUILDBASE/$branch" $branch &&
		ln -s "$(pwd)/Meta" "$BUILDBASE/$branch/Meta" || {
			echo "** Failed to bootstrap $BUILDBASE/$branch"
			continue
		}
	fi

	version=$(find_installed $branch)
	if	test "z$version" = "z$revision"
	then
		echo "* up-to-date version is already installed from $branch"
		test -n "$force" || continue
	fi

	private=$(git rev-parse -q --verify private-$branch 2>/dev/null)
	case $? in 0|1) ;; *) exit $? ;; esac

	vtree=$(git rev-parse --verify "$version^{tree}")
	rtree=$(git rev-parse --verify "$revision^{tree}")
	(
		skip_test=$notest
		case "$doc" in no) skip_doc=1 ;; *) skip_doc= ;; esac
		case "$force" in
		?*)
			;;
		'')
			for xtree in $installed_source_trees $vtree
			do
				if test "z$xtree" = "z$rtree" ||
					git diff --quiet "$xtree" "$rtree" -- . \
					':!GIT-VERSION-GEN' \
					':!RelNotes' \
					':!Documentation/'
				then
					skip_test=1
					break
				fi
			done

			dvtree=$(git rev-parse --verify "$version:Documentation/")
			drtree=$(git rev-parse --verify "$revision:Documentation/")
			if test "z$dvtree" = "z$drtree"
			then
				skip_doc=1
			fi
			;;
		esac

		case "$skip_test" in
		?*)	dotest= ;;
		'')	dotest=test ;;
		esac

		cd "$BUILDBASE/$branch"
		git reset --hard  &&

		case "$scratch$clean" in
		'')
			;;
		*y*)
			saveMeta=$(readlink Meta)
			Meta/Make distclean
			git clean -f -x -d
			ln -s "$saveMeta" Meta
			;;
		esac &&

		case "$(git symbolic-ref HEAD)" in
		"refs/heads/$branch")
			: ;;
		*)
			git checkout "$branch" &&
			git reset --hard || exit
		esac &&

		case "$clean" in
		y)	exit 0 ;;
		esac &&

		case "$private" in
		'')
			;;
		?*)
			git merge --squash --no-commit "$private" || {
				echo >&2 "** Cannot apply private edition changes"
				git reset --hard
			}
			;;
		esac &&

		save=$(git rev-parse HEAD) &&

		if test -n "$with_meson" && test -f "meson.build"
		then
			section meson
			rm -fr "../.$branch.boson" &&
			meson setup "../.$branch.boson" &&
			(
				cd "../.$branch.boson" &&
				meson compile &&
				meson test
			) || exit $?
		fi &&

		# cocci
		if test -n "$with_cocci"
		then
			section coccicheck
			Meta/Make $M $jobs -- coccicheck
		fi &&

		# sparse
		section sparse
		Meta/Make $M $jobs -- NO_REGEX=NoThanks \
			SPARSE_FLAGS=-Wsparse-error sparse &&
		rm -f compat/regex/regex.o &&

		# hdr
		section hdr-check
		Meta/Make $M $jobs -- hdr-check &&

		# test-lint
		section test-lint
		Meta/Make -- -C t test-lint &&

		if test -n "$san"
		then
			section SANITIZE=address,undefined
			SANITIZE=address,undefined Meta/Make $M $jobs test &&
			Meta/Make >/dev/null distclean
		elif test "$breaking$with_leaks$with_sha256$dotest" = test
		then
			section test
			Meta/Make $M $noprove ${test+"$test"} $jobs $test_long \
				  $memtrash \
			    -- ${with_dash:+SHELL_PATH=/bin/dash} "$@" $dotest
		elif test -n "$with_leaks"
		then
			section leaks
			SANITIZE=leak \
			GIT_TEST_PASSING_SANITIZE_LEAK=true \
			Meta/Make -j16 $T CC=clang test &&
			Meta/Make >/dev/null distclean
		elif test -n "$with_sha256"
		then
			section sha256
			GIT_TEST_DEFAULT_HASH=sha256 Meta/Make -j16 $T test
		elif test -n "$breaking"
		then
			section breaking
			Meta/Make -j16 WITH_BREAKING_CHANGES=YesPlease test &&
			Meta/Make >/dev/null distclean
		fi &&

		# docs
		{
			test -n "$skip_doc" ||
			if test "$save" = "$(git rev-parse HEAD)"
			then
				section docs
				Meta/Make $M $jobs -- check-docs &&
				Meta/Make $M $jobs -- $USE_ASCIIDOCTOR doc &&
				Meta/Make $M -- install-man install-html
			else
				echo >&2 "Head moved--not installing docs"
			fi
		} &&

		{
			test z$install = znoinstall ||
			if test "$save" = "$(git rev-parse HEAD)"
			then
				section install
				Meta/Make $jobs $M -- ${with_dash:+SHELL_PATH=/bin/dash} "$@" install
			else
				echo >&2 "Head moved--not installing"
			fi
		} || exit $?

		git reset --hard
	) </dev/null || exit $?

	installed_source_trees="$installed_source_trees$rtree "
done
