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


# finds file on users path, before current directory
# hence, non-production users can set their own values for test machines
source aggr_properties.shsource

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



