#!/bin/bash

# This script assumes the HPC command line tool `job` is in your path.
# To install HPC go to \\msr-arrays\Tools\HPC-V3-SP3

# Script configuration
HEAD=RR1-N13-09-H44   # HEAD node of a HPC cluster
WORKDIR="\\\\msr-arrays\\Scratch\\msr-pool\\Redmond\\leonardo" # Path for the working directory in the HPC Cluster. It must contain input test files and auxiliary DLLs needed for executing Lean
LEAN_PATH=/cygdrive/c/Users/leonardo/projects/lean
BUILD_PATH=$LEAN_PATH/build
BUILD_TYPE=Debug
REPO=origin
BRANCH=master
LOG=$LEAN_PATH/build_log
RESULT_DIR=$LEAN_PATH/build/results
MAKE_JOBS=20
################################

PREV_COMMIT=$LEAN_PATH/prev_commit

# Update Lean binary
cd $LEAN_PATH
git fetch $REPO
git reset --hard $REPO/$BRANCH
GIT_COMMIT=`git log --oneline -n 1 | cut -d ' ' -f 1`    # Used for BUILDNAME
if [[ ! -a $PREV_COMMIT ]] || [[ `cat $PREV_COMMIT` != $GIT_COMMIT ]] 
then
    mkdir -p $BUILD_PATH
    cd $BUILD_PATH
    rm -rf *
    cmake $LEAN_PATH/src -DCMAKE_BUILD_TYPE=$BUILD_TYPE
    make -j $MAKE_JOBS
    echo `date` : Build $GIT_COMMIT | tee -a $LOG
    echo $GIT_COMMIT > $PREV_COMMIT
else
    echo "$GIT_COMMIT is already built." | tee -a $LOG 
fi 

# Copy lean to workdir in the cluster
cd $BUILD_PATH
cp shell/lean.exe $WORKDIR

# Create new job
JobId=`job new /scheduler:$HEAD | awk '{ print $4 }'`
echo "Created HPC job $JobId"

# Add tasks for executing .lean files at $WORKDIR
for f in `ls $WORKDIR`; do
   if [ ${f:(-5)} == ".lean" ]; then
       job add $JobId /scheduler:$HEAD /workdir:$WORKDIR /stdout:$f.$JobId.out /stderr:$f.$JobId.err /stdin:$f lean.exe
   fi
done

# Submit job
job submit /id:$JobId /scheduler:$HEAD

# Wait job to finish
for (( ; ; )); do
    if job view $JobId /scheduler:$HEAD | grep "State.*Finished"; then
        echo "Job $JobId has finished"
	break
    else 
    if job view $JobId /scheduler:$HEAD | grep "State.*Failed"; then
        echo "Job $JobId has failed"
	echo "======= FAILURE Details from HPC ========="
	job view $JobId /scheduler:$HEAD
	echo "=========================================="
	break
    else
	echo "Waiting for job $JobId"
        sleep 1
    fi 
    fi
done


# Move results to RESULT_DIR
mkdir -p $RESULT_DIR
for f in `ls $WORKDIR`; do
    if [ `expr match "$f" ".*$JobId.out.*"` != 0 ]; then
	echo "Copying $WORKDIR\\$f"
	cp "$WORKDIR\\$f" $RESULT_DIR
	rm "$WORKDIR\\$f"
    fi
    if [ `expr match "$f" ".*$JobId.err.*"` != 0 ]; then
	echo "Copying $WORKDIR\\$f"
	cp "$WORKDIR\\$f" $RESULT_DIR
	rm "$WORKDIR\\$f"
    fi
done