#!/bin/bash
# Note: this is managed by Ansible, as deploy-sh.j2
# Don't modify this file unless its name is deploy-sh.j2
if [[ ${1} = "--repo" ]];
then
    shift
    GITHUB_REPO=$(echo -n "${1}" | tr -c 'A-Za-z0-9_.-/' '-')
    GIT_PREFETCH=https://github.com/${GITHUB_REPO}.git
    shift
else
    GITHUB_REPO=unicode-org/cldr
    GIT_PREFETCH=origin
fi

GITHUB_SHA=$1
UNLOCK=$2
WORKDIR=${TMPDIR-/tmp} # keep all random files here
SERVICE="{{ cldr_openliberty_service }}"

# TODO: "dogit" could be split out as a separate script
dogit() {
    git config --global advice.detachedHead false
    rm -f ${WORKDIR}/git-list.txt
    if [[ ${GITHUB_SHA} = "main" ]];
    then
        echo "changing ${GITHUB_SHA} to 'origin/main' to get the latest"
        GITHUB_SHA=origin/main
    fi
    # There's some risk that if we fetch something that has been rebased,
    # we might get stuck here
    # TODO: add a reset mechanism, if fetch fails we should reset the repo and check out again.

    echo "Git fetch: ${GIT_PREFETCH} @ ${GITHUB_SHA}"
    git fetch -p "${GIT_PREFETCH}" "${GITHUB_SHA}" || exit 1
    git clean -f -d || echo 'warning: err on cleanup'
    # what are we deploying?

    echo    "cldr-trunk was at  :" $(git rev-parse --short HEAD)
    echo -n "you want to move to:"
    git rev-parse --short "${GITHUB_SHA}" || exit 1 # fail on err
    if [[ $(git rev-parse --short HEAD) = $(git rev-parse --short "${GITHUB_SHA}") ]];
    then
        echo "No checkout needed. Continuing with redeploy."
    else
        echo "Deploy will include these new items:"
        echo "---"
        (git log --oneline HEAD..${GITHUB_SHA} | tee ${WORKDIR}/git-list.txt) || exit 1
        echo "---"
        if [[ ! -s ${WORKDIR}/git-list.txt ]]; # if empty..
        then
            echo "Note, ${GITHUB_SHA} is not ahead of HEAD"  $(git rev-parse --short HEAD)
            echo "Checking for items that would be REVERTED if we proceed:"
            echo "---"
            git log --oneline ${GITHUB_SHA}..HEAD
            echo "---"
            if [[ "${UNLOCK}" = "--override" ]];
            then
                echo ".. continuing anyway! due to " "${UNLOCK}"
            else
                echo "STOP. Check the override box if you really want to do this"
                exit 1
            fi
        fi
        git checkout -f ${GITHUB_SHA}
        echo "HEAD is now at" $(git rev-parse --short HEAD) "!"
     fi
}

# Check git first, before undeploying. Want to exit early
(cd  {{ cldr_trunk_path }} && dogit ) || exit 1
#
# stop server
sudo -u root /usr/sbin/service ${SERVICE} stop
# clear cache
if [[ -d /srv/st/config/.cache ]];
then
   echo "Deleting cache /srv/config/.cache"
   sudo /usr/bin/rm -rf /srv/st/config/.cache
fi
rm -fv ${WORKDIR}/cldr-apps.zip ${WORKDIR}/deploystatus
# copy cldr-apps.zip from action runner to server
dd bs=1024000 status=progress of=${WORKDIR}/cldr-apps.zip
# this counts the # of files to make sure it's not too short, but also verifies that unzip is OK
echo ; echo -n 'Unzip check, # of files in cldr-apps.zip: '
(unzip -l ${WORKDIR}/cldr-apps.zip | wc -l ) || exit 1
cd ${WORKDIR} || exit 1
rm -rf ./deploy || exit 1
mkdir ./deploy
cd ./deploy
unzip ${WORKDIR}/cldr-apps.zip
if [[ ! -d ./wlp ]];
then
    echo "Error, did not get a ./wlp dir from this zip.. stop"
    exit 1
fi
# Now, do the deployment!
# exclude these two files
rsync -r --exclude server.env --exclude workarea --exclude bootstrap.properties -v \
      --delete ./wlp/usr/servers/cldr/* /var/lib/openliberty/usr/servers/cldr/ || exit 1
# update datadog
sed -i.old -e "s/DD_GIT_COMMIT_SHA.*/DD_GIT_COMMIT_SHA=${GITHUB_SHA}/g" -e "s%DD_GIT_REPOSITORY_URL.*%DD_GIT_REPOSITORY_URL=github.com/${GITHUB_REPO}%g" /var/lib/openliberty/usr/servers/{{ cldr_openliberty_server }}/server.env
sudo -u root /usr/sbin/service ${SERVICE} start || exit 1
