#!/usr/bin/env bash


# This script file is to help get builds started "fresh", when
# the ${BUILD_TOOLS} directory already exists on local file system.
# While it is in this source repository in ${BUILD_TOOLS}, it is
# meant to be executed from the parent directory
# of ${BUILD_TOOLS} on the file system. If completely fresh 
# (first time) install, some "sanity check" code below needs 
# overriden with -f after confirming correct current directory is 
# correctly set in CC, something like /shared/simrel/luna . 


# finds file on users path, before current directory
# hence, non-production users can set their own values for test machines
# not expected on production machine, so we send error output to bit bucket
source aggr_properties.shsource 2>/dev/null

# define these essential variables for production machine, 
# so aggr_properties.shsource does not have to exist there, 
# for this script (in this directory)
BUILD_TOOLS=${BUILD_TOOLS:-org.eclipse.simrel.tools}
BRANCH_TOOLS=${BRANCH_TOOLS:-master}
TMPDIR_TOOLS=${TMPDIR_TOOLS:-sbtools}
CGITURL=${CGITURL:-http://git.eclipse.org/c/simrel}

function usage() 
{
    printf "\n\tUsage: %s [-f] [-v] " $(basename $0) >&2
    printf "\n\t\t%s\t%s" "-f" "Allow fresh creation (confirm correct current directory)." >&2
    printf "\n\t\t%s\t%s" "-c" "Force clean of prereqs directory" >&2
    printf "\n\t\t%s\t%s\n" "-v" "Print verbose debug info." >&2
}


verboseFlag=false
freshFlag=false
cleanFlag=false
while getopts 'hvfc' OPTION
do
    case $OPTION in
        h)    usage
        exit 1
        ;;
        v)    verboseFlag=true
        ;;
        f)    freshFlag=true
        ;;
        c)    cleanFlag=true
        ;;
        ?)    usage
        exit 2
        ;;
    esac
done

# This shift is not required in our particular, current case, 
# But is a common pattern to leave command line args at correct 
# point, so we leave it in. 
shift $(($OPTIND - 1))

# 'env' is handy to print all env variables to log, 
# if needed for debugging
if $verboseFlag
then
    env
    echo "fresh install: $freshFlag"
    echo "verbose output: $verboseFlag"
    echo "force clean prereqs: $cleanFlag"
    echo "BUILD_TOOLS: ${BUILD_TOOLS}"
    echo "TMPDIR_TOOLS=${TMPDIR_TOOLS}"

fi

echo "CGITURL: ${CGITURL}"
echo "BRANCH_TOOLS: ${BRANCH_TOOLS}"

# echo current directory
echo "Current Directory: ${PWD}"

# This is just a sanity check, to see if things are as expected, 
# things might be wrong, if hudson setttings (such as "custom workspace" 
# are not right. 
# At times may have to be skipped, if completely fresh,
# after confirming "current directory" is as expected.

# if freshFlag is set, then "not freshFlag" is false and will skip 
# the sanity check.   
if ! $freshFlag && [[ ! -e ${BUILD_TOOLS} ]]
then
    echo "${BUILD_TOOLS} does not exist as sub directory";
    usage
    exit 1;
fi


# even though we define it above, for safety
# make sure BUILD_TOOLS has been defined and is not zero length, or 
# else the following or else some following "removes" could be bad. 
if [ -z "${BUILD_TOOLS}" ]
then
    echo "The variable BUILD_TOOLS must be defined to run this script"
    usage
    exit 1;
fi


echo "    removing all of ${BUILD_TOOLS} ..."
rm -fr ${BUILD_TOOLS}
mkdir -p "${BUILD_TOOLS}"

# remove if already exists
rm ${BRANCH_TOOLS}.zip* 2>/dev/null
rm -fr ${TMPDIR_TOOLS} 2>/dev/null 

wget --no-verbose -O  ${BRANCH_TOOLS}.zip ${CGITURL}/${BUILD_TOOLS}.git/snapshot/${BRANCH_TOOLS}.zip 2>&1
RC=$?
if [[ $RC != 0 ]] 
then
    echo "   ERROR: Failed to get ${BRANCH_TOOLS}.zip from  ${CGITURL}/${BUILD_TOOLS}.git/snapshot/${BRANCH_TOOLS}.zip"
    echo "   RC: $RC"
    usage
    exit $RC
fi

quietZipFlag=-q
if $verboseFlag
then
    quietZipFlag=
fi

unzip ${quietZipFlag} -o ${BRANCH_TOOLS}.zip -d ${TMPDIR_TOOLS} 
RC=$?
if [[ $RC != 0 ]] 
then
    echo "ERROR:  Failed to unzip ${BRANCH_TOOLS}.zip to ${TMPDIR_TOOLS}"
    echo "   RC: $RC"
    usage
    exit $RC
fi

rsynchvFlag=
if $verboseFlag
then
    rsynchvFlag=-v
fi

rsync $rsynchvFlag -r ${TMPDIR_TOOLS}/${BRANCH_TOOLS}/ ${BUILD_TOOLS}
RC=$?
if [[ $RC != 0 ]] 
then
    echo "ERROR: Failed to copy ${BUILD_TOOLS} from ${TMPDIR_TOOLS}/${BRANCH_TOOLS}/"
    echo "   RC: $RC"
    usage
    exit $RC
fi

echo "    make sure releng control files are executable and have proper EOL ..."
dos2unix ${BUILD_TOOLS}/*.sh* ${BUILD_TOOLS}/*.properties ${BUILD_TOOLS}/*.xml >/dev/null 2>>/dev/null
chmod +x ${BUILD_TOOLS}/*.sh > /dev/null
echo "    Done. "

if $cleanFlag
then
    # should very rarely need to do this, Like, once release. 
    # But Eclipse (OSGi?) creates some files with 
    # only group read access, so to complete remove them, must use 
    # hudsonbuild ID to get completely clean. 
    echo "    removing all of prereqs directory"
    rm -fr prereqs
fi

if ! $verboseFlag
then
    # cleanup unless verbose/debugging
    rm ${BRANCH_TOOLS}.zip* 2>/dev/null
    rm -fr ${TMPDIR_TOOLS} 2>/dev/null
fi

exit 0



