#!/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
P=gitcheckout-bench
DEFAULT_VERSION=0
. $SHELLPACK_INCLUDE/common.sh
TIME_CMD=`which time`
if [ "$TIME_CMD" = "" ]; then
        TIMEFORMAT="%2Uuser %2Ssystem %Relapsed %P%%CPU"
        TIME_CMD="time"
fi

GITCHECKOUT_CACHE=hot
GITCHECKOUT_ITERATIONS=10
GITCHECKOUT_SOURCETAR=

# Basic argument parser
TASKSET_SERVER=
TASKSET_CLIENT=
SERVERSIDE_COMMAND=none
SERVERSIDE_NAME=`date +%Y%m%d-%H%M-%S`

while [ "$1" != "" ]; do
	case "$1" in
	-v)
		VERSION=$2
		shift 2
		;;
	--serverside-command)
		SERVERSIDE_COMMAND=$2
		shift 2
		;;
	--serverside-name)
		SERVERSIDE_NAME=$2
		shift 2
		;;
	--git-tar)
		GITCHECKOUT_SOURCETAR=$2
		shift 2
		;;
	--git-source)
		GITCHECKOUT_SOURCE=$2
		shift 2
		;;
	--commits)
		GITCHECKOUT_COMMITS=$2
		shift 2
		;;
	--iterations)
		GITCHECKOUT_ITERATIONS=$2
		shift 2
		;;
	--cache)
		GITCHECKOUT_CACHE=$2
		shift 2
		;;
	*)
		echo Unrecognised option: $1
		shift
	esac
done
if [ "$TASKSET_SERVER" != "" ]; then
	echo TASKSET_SERVER: $TASKSET_SERVER
	echo TASKSET_CLIENT: $TASKSET_CLIENT
fi
if [ -z "$VERSION" ]; then
	VERSION=$DEFAULT_VERSION
fi

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
for ITERATION in `seq 1 $GITCHECKOUT_ITERATIONS`; do
	mmtests_activity iteration $ITERATION
	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
done

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

exit $SHELLPACK_SUCCESS
#### Description Times how long it takes to checkout git repos
#### Details gitcheckout-bench 18
