#!/bin/bash
# This benchmark checks how long it takes to do cache cold or hot checkouts
# between two kernel versions. It is somewhat metadata intensive
#
# Copyright Mel Gorman 2013
###SHELLPACK preamble gitcheckout-bench 0

GITCHECKOUT_CACHE=hot
GITCHECKOUT_ITERATIONS=10
GITCHECKOUT_SOURCETAR=

###SHELLPACK parseargBegin
###SHELLPACK parseargParam --git-tar	GITCHECKOUT_SOURCETAR
###SHELLPACK parseargParam --git-source	GITCHECKOUT_SOURCE
###SHELLPACK parseargParam --commits	GITCHECKOUT_COMMITS
###SHELLPACK parseargParam --iterations GITCHECKOUT_ITERATIONS
###SHELLPACK parseargParam --cache      GITCHECKOUT_CACHE
###SHELLPACK parseargEnd
###SHELLPACK monitor_hooks

install-depends git-core

# Get the git repository
###SHELLPACK init_only_start
	pushd $SHELLPACK_DATA > /dev/null
	if [ "$GITCHECKOUT_SOURCETAR" != "" -a "$GITCHECKOUT_SOURCETAR" != "none" ]; then
		echo Using $GITCHECKOUT_SOURCETAR
		wget -q -O gitcheckout.tar.gz $GITCHECKOUT_SOURCETAR
		if [ $? -ne 0 ]; then
			rm -f gitcheckout.tar.gz
		fi
	fi
	if [ -e gitcheckout.tar.gz ]; then
		tar -xf gitcheckout.tar.gz
		if [ $? -ne 0 ]; then
			die "$P: tar xf gitcheckout.tar.gz failed"
		fi
		DST_DIR=`tar tf gitcheckout.tar.gz | head -n 1 | awk -F / '{print $1}'`
		mv $DST_DIR gitcheckout
	else
		echo Cloning $GITCHECKOUT_SOURCE
		git clone $GITCHECKOUT_SOURCE gitcheckout || exit $SHELLPACK_ERROR
	fi
###SHELLPACK init_only_end

GITCHECKOUT_COMMITS=`echo $GITCHECKOUT_COMMITS | sed -e 's/,/ /g'`
sysctl -w vm.drop_caches=3

echo Warming up
mmtests_activity warmup
cd $SHELLPACK_DATA/gitcheckout   || exit $SHELLPACK_ERROR
for COMMIT in $GITCHECKOUT_COMMITS; do
	git checkout $COMMIT || exit $SHELLPACK_ERROR
done

echo "#!/bin/bash
for COMMIT in $GITCHECKOUT_COMMITS; do
	git checkout \$COMMIT
done
" > $SHELLPACK_TEMP/gitcheckout.sh
chmod u+x $SHELLPACK_TEMP/gitcheckout.sh

mkdir -p $LOGDIR_RESULTS
monitor_pre_hook $LOGDIR_RESULTS $P
###SHELLPACK iteration_begin $GITCHECKOUT_ITERATIONS
	if [ "$GITCHECKOUT_CACHE" = "cold" ]; then
		echo Dropping caches as per requested
		sync
		sysctl -w vm.drop_caches=3
	fi

	echo Iteration $ITERATION/$GITCHECKOUT_ITERATIONS
	$TIME_CMD $SHELLPACK_TEMP/gitcheckout.sh 2>> $LOGDIR_RESULTS/time.$ITERATION
	grep elapsed $LOGDIR_RESULTS/time.$ITERATION
###SHELLPACK iteration_end
monitor_post_hook $LOGDIR_RESULTS $P

# Summarise and cleanup
popd > /dev/null
grep elapsed $LOGDIR_RESULTS/time.* | tee $LOGDIR_RESULTS/time
rm -rf $SHELLPACK_DATA/gitcheckout

exit $SHELLPACK_SUCCESS
