#!/bin/bash
#This bash script calls the dailyrun.m matlab file to run our daily test decks. 
#It then processes the results and sends an email to the Ice developpers.

#Hard coded options
NUMCPUS_RUN=7
NROPTIONS=""

#some functions
function timer() #{{{1
{
	if [[ $# -eq 0 ]]; then
		echo $(date '+%s')
	else
		local  stime=$1
		etime=$(date '+%s')

		if [[ -z "$stime" ]]; then stime=$etime; fi

		dt=$((etime - stime))
		ds=$((dt % 60))
		dm=$(((dt / 60) % 60))
		dh=$((dt / 3600))
		printf '%d:%02d:%02d' $dh $dm $ds
	fi
} #}}}
function todaydate() #{{{1
{
	suffix=`date | awk '{printf("%s-%s-%s  %s",$2,$3,$6,$4);}'`			 
	echo $suffix;			 
} #}}}
function host_name() #{{{1
{
	#return host name depending on the OS
	if [ "$1" = "winxp32" ] 
	then
		HOST_NAME=`hostname`;
	else
		HOST_NAME=`hostname -s`;
	fi
	echo $HOST_NAME;
} #}}}

#Get configuration
#Initialize variables {{{1
TODAY=$(todaydate);
HOST_NAME=$(host_name $OS);
START_TIME=$(timer);
ISSM_RELEASE="N/A"
USER=$(whoami);
INIT_PATH=$(pwd);
#}}}

#Prepare run
#Windows hack for startup.m {{{1
#windows environments: ISSM_DIR_WIN variable not correctly picked up when using 
#the cron job. just get startup to take the ISSM_DIR variable as the pwd:
if [ "$OS" = "winxp32" ]
then
	cat startup.m | sed 's/clear status/clear status; ISSM_DIR=pwd;/g' > startup.m.bak
	mv startup.m.bak startup.m
fi
#}}}
#create softlink to startup {{{1
cd $ISSM_DIR/test/NightlyRun/
ln -s $ISSM_DIR/startup.m .
#}}}
#Create dailylog directory and info.log {{{1
#put installation elapsed time in info.log
INSTALL_TIME=$(timer)
ELAPSED_INSTALL=$(timer $START_TIME)
rm -rf $ISSM_DIR/dailylog
mkdir  $ISSM_DIR/dailylog
cat << END > $ISSM_DIR/dailylog/info.log
today:     $(echo $TODAY)
user:      $(echo $USER)
host:      $(echo $HOST_NAME)
OS:        N/A
release:   N/A
init_path: $(echo $INIT_PATH)
elapsed_install: $(echo $ELAPSED_INSTALL)
END
#}}}
#check NUMCPUS_RUN options {{{1
if [ "$NUMCPUS_RUN" = "" ]
then
	echo "NUMCPUS_RUN option not found, defaulting to NUMCPUS_RUN = 1"
	NUMCPUS_RUN=1
fi
#}}}

#Run tests
#Launch all tests on different cpus {{{1
for (( i=1;i<=$NUMCPUS_RUN;i++ ))
do
	#Launch matlab and the daily run script
	cat > $ISSM_DIR/dailylog/matlab_run$i.m << EOF
	warning off %necessary to avoid a info.log of several Go for parallel runs
	try,
	cd $ISSM_DIR/test/NightlyRun
	startup;
	$(if [ "$NROPTIONS" = ""  ]
	then
		echo "runme('output','daily','rank',$i,'numprocs',$NUMCPUS_RUN);"
	else
		echo "runme($NROPTIONS,'output','daily','rank',$i,'numprocs',$NUMCPUS_RUN);"
	fi
	)
	catch me,
		%An error occured, get report and exit
		directory=strsplit(pwd,'/');
		message=getReport(me)
		fid=fopen([ISSM_DIR '/dailylog/matlaberror.log'], 'at');
		fprintf(fid,'\nMatlab error occured in: %s\n\n',directory{end});
		fprintf(fid,'%s',message);
		fclose(fid);
	end
	disp('MATLABEXITEDCORRECTLY');
	exit
EOF

	#Start run from dailylog directory
	cd $ISSM_DIR/dailylog/

	#Start test
	MATLAB_VERSION="7.6" #7.2,7.4,7.6 and 7.8
	/usr/local/pkgs/matlab-$MATLAB_VERSION/bin/matlab  -nojvm -nosplash  -r matlab_run$i -logfile matlab_log$i.log &
done

#wait until matlab closes
wait
#}}}
#concatenate all reports {{{1
cd $ISSM_DIR/dailylog/
mv matlab_log1.log  matlab_log.log
for (( i=2;i<=$NUMCPUS_RUN;i++ ))
do
	cat matlab_log.log matlab_log$i.log > matlab_log.log.bak
	mv matlab_log.log.bak matlab_log.log
done
#}}}
#Complete info.log {{{1
if [ $(cat matlab_log.log | grep "MATLABEXITEDCORRECTLY" | wc -l) -eq $NUMCPUS_RUN ]
then
	MATLABCRASH=0
else
	MATLABCRASH=1
fi
ELAPSED_RUN=$(timer $INSTALL_TIME)
ELAPSED_TOTAL=$(timer $START_TIME)
cat << END >>  $ISSM_DIR/dailylog/info.log
elapsed_run:   $(echo $ELAPSED_RUN)
elapsed_total: $(echo $ELAPSED_TOTAL)
matlab_crash:  $(echo $MATLABCRASH)
END
#}}}

#Send Report
#Build html report {{{1
cd $ISSM_DIR/dailylog/
sh ../scripts/report.sh
ln -s $ISSM_DIR/dailylog/report.html $INIT_PATH
echo "html report located in $ISSM_DIR/dailylog/report.html and $INIT_PATH/report.html"
#}}}
