#!/bin/sh
# ====================================================================
# Copyright (c) 2021 Obeo
# This program and the accompanying materials
# are made available under the terms of the Eclipse Public License 2.0
# which accompanies this distribution, and is available at
# https://www.eclipse.org/legal/epl-2.0
#
# Contributors:
#    Obeo - initial API and implementation
# ====================================================================

# Exit on error
set -e

# The SSH account to use
export SSH_ACCOUNT="genie.emfcompare@projects-storage.eclipse.org"

PROJECT_NAME="EMF Compare"
MILESTONES_FOLDER="/home/data/httpd/download.eclipse.org/modeling/emf/compare/updates/milestones"
RELEASES_FOLDER="/home/data/httpd/download.eclipse.org/modeling/emf/compare/updates/releases"
DROPS_FOLDER="/home/data/httpd/download.eclipse.org/modeling/emf/compare/downloads/drops"
ZIP_PREFIX="emf-compare-update-"
GROUP="modeling.emfcompare"

if [[ ! ${QUALIFIER} =~ ^[0-9]\.[0-9]\.[0-9]+\.[0-9]{12}$ ]]
then
  echo "$QUALIFIER doesn't match the expected format x.x.x.yyyyMMddhhmm"
  exit 1
fi

IFS=. read MAJOR MINOR MICRO TIMESTAMP <<<"${QUALIFIER}"

VERSION_SHORT=${MAJOR}.${MINOR}
VERSION=${MAJOR}.${MINOR}.${MICRO}

if ssh ${SSH_ACCOUNT} "[ ! -d ${MILESTONES_FOLDER}/${VERSION_SHORT}/S${TIMESTAMP} ]"
then
  echo "couldn't find build with qualifier $QUALIFIER in the promoted milestones"
  exit 1
fi

echo "promoting milestone S${TIMESTAMP} as release ${VERSION}"

ssh ${SSH_ACCOUNT} << EOSSH
  ## copy the drops
  
  cp -r ${DROPS_FOLDER}/${VERSION}/S${TIMESTAMP} ${DROPS_FOLDER}/${VERSION}/R${TIMESTAMP}
  mv ${DROPS_FOLDER}/${VERSION}/R${TIMESTAMP}/${ZIP_PREFIX}*.zip ${DROPS_FOLDER}/${VERSION}/R${TIMESTAMP}/${ZIP_PREFIX}${VERSION}.zip
  rm ${DROPS_FOLDER}/${VERSION}/R${TIMESTAMP}/${ZIP_PREFIX}*.zip.md5
  md5sum ${DROPS_FOLDER}/${VERSION}/R${TIMESTAMP}/${ZIP_PREFIX}${VERSION}.zip > ${DROPS_FOLDER}/${VERSION}/R${TIMESTAMP}/${ZIP_PREFIX}${VERSION}.zip.md5
  chgrp -R ${GROUP} ${DROPS_FOLDER}/${VERSION}/R${TIMESTAMP}

  ## copy the update site

  UPDATE_ROOT_COMPOSITE=false
  if [ ! -d ${RELEASES_FOLDER}/${VERSION_SHORT} ]
  then
    mkdir -p ${RELEASES_FOLDER}/${VERSION_SHORT}
    chgrp -R ${GROUP} ${RELEASES_FOLDER}/${VERSION_SHORT}
    UPDATE_ROOT_COMPOSITE=true
  fi
  cp -r ${MILESTONES_FOLDER}/${VERSION_SHORT}/S${TIMESTAMP} ${RELEASES_FOLDER}/${VERSION_SHORT}/R${TIMESTAMP}
  chgrp -R ${GROUP} ${RELEASES_FOLDER}/${VERSION_SHORT}/R${TIMESTAMP}

  ## update the releases composite

  #cd ${RELEASES_FOLDER}/${VERSION_SHORT}
  #/shared/common/apache-ant-latest/bin/ant -f /shared/modeling/tools/promotion/manage-composite.xml add -Dchild.repository=R${TIMESTAMP} -Dcomposite.name="${PROJECT_NAME} ${VERSION_SHORT} releases"

  #if [ "$UPDATE_ROOT_COMPOSITE" = true ]
  #then
    #cd ${RELEASES_FOLDER}
    #/shared/common/apache-ant-latest/bin/ant -f /shared/modeling/tools/promotion/manage-composite.xml add -Dchild.repository=${VERSION_SHORT} -Dcomposite.name="${PROJECT_NAME} releases"
  #fi

  ## update the "latest" update site

  rm -r ${RELEASES_FOLDER}/latest/*
  cp -r ${RELEASES_FOLDER}/${VERSION_SHORT}/R${TIMESTAMP}/* ${RELEASES_FOLDER}/latest/
EOSSH