#!/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

install-depends git-core

# Get the git repository
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

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
###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

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

exit $SHELLPACK_SUCCESS
