#!/bin/sh
#####################################################################
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
#####################################################################

# This shell script tries to be as close to POSIX as possible.
# external dependencies:
#   mkdir
#   tee
#   git rev-parse
#   git rebase --continue

set -x
# Simulate mkdir -p, which isn't POSIX; this is modelled after
# 'install', which is what standard unix makefiles tend to use for the
# purpose
_install_dir() {
	# POSIX doesn't support the shell 'local' keyword, so simulate
	# that with ()
	(
		IFS="/"
		set -- $1
		while [ $# -gt 0 ]; do
			[ -d "$1" ] || mkdir "$1"
			cd "$1"
			shift
		done
	)
}
# create the entire directory path.  Multiple directories can be given.
install_dir() {
	while [ $# -gt 0 ]; do
		_install_dir "$1"
		shift
	done
}

# args:
#  $1: how many loops
#  $2-$#: command to call thru each loop
git_rebase_runner() {
	install_dir runtime/git-rebase/logs
	(
		set -- runtime/git-rebase/logs/*
		if [ -e "$1" ]; then
			rm "$@"
		fi
	)
	total_loops="$1"
	cleaner="$2"
	shift 2
	if [ -e runtime/git-rebase/hook.sh ]; then
		runtime/git-rebase/hook.sh start $total_loops || break
	fi
	eval "$cleaner"
	while [ $total_loops -gt 0 ]; do
		git_rebase_runner_success=0
		total_loops=$(($total_loops - 1))
		hash="$(git rev-parse HEAD)"
		local_log="runtime/git-rebase/logs/$hash.log"
		[ -e "$local_log" ] && rm "$local_log"
		# POSIX tee does not support -a, so we have to run everything
		# inside a single redirection.
		{
			if [ -e runtime/git-rebase/hook.sh ]; then
				runtime/git-rebase/hook.sh pre-run $total_loops || break
			fi
			eval "$@" || break
			eval "$cleaner" || break
			if [ -e runtime/git-rebase/hook.sh ]; then
				runtime/git-rebase/hook.sh post-run $total_loops || break
			fi
		} 2>&1 | tee "runtime/git-rebase/logs/$hash.log"
		git rebase --continue || break
		git_rebase_runner_success=1
	done
	if [ -e runtime/git-rebase/hook.sh ]; then
		runtime/git-rebase/hook.sh stop $total_loops || break
	fi
	# POSIX [ doesn't deal well when one of the arguments is empty; this
	# could occur if $total_loops = 0.
	if [ "z$git_rebase_runner_success" = "z0" ]; then
		eval "$cleaner"
		while [ $total_loops -gt 0 ]; do
			total_loops=$(($total_loops - 1))
			git rebase --continue
		done
	fi
}

run_ant() {
	# POSIX [ doesn't deal well when one of the arguments is empty, and
	# [ doesn't support [ !
	if [ "z$USE_LOCAL_ANT" = "z" ]; then
		ant "$@"
	else
		./ant "$@"
	fi
}

standard_cleanup() {
	run_ant clean-all
}
install_worker() {
	run_ant load-demo
}
fulltestsuite_worker() {
	run_ant load-demo
	run_ant run-tests
}
#git_rebase_runner 3 fulltestsuite_cleanup fulltestsuite_worker
