#!/bin/bash -xv
#*******************************************************************************
# Copyright (c) 2018, 2019 Willink Transformations and others.
# All rights reserved. This program and the accompanying materials
# are made available under the terms of the Eclipse Public License v2.0
# which accompanies this distribution, and is available at
# http://www.eclipse.org/legal/epl-v20.html
#
# Contributors:
#     E.D.Willink - initial API and implementation
#*******************************************************************************
#
#	Promote the PUBLISH__URL to the downloads 'page'.
#
#	-u PUBLISH__URL			The zip to be published e.g. https://ci.eclipse.org/ocl/job/ocl-master/38/artifact/releng/org.eclipse.ocl.releng.build-site/target/org.eclipse.ocl-6.5.0.v20171021-1702.zip
#	-v PUBLISH__VERSION		Unqualified version e.g. 6.5.0
#	-t PUBLISH__BUILD_T		Build type N/I/S/R, blank suppresses promotion
#	-q PUBLISH__QUALIFIER		Version qualifier e.g. v20171020-1234
#	-a PUBLISH__ALIAS			Non blank to use alias as part of final name
#	-j PUBLISH__JAVADOC		The optional Javadoc zip to be published e.g. https://ci.eclipse.org/ocl/job/ocl-master/38/artifact/releng/org.eclipse.ocl.releng.build-site/target/OCL-javadoc.zip
#	-p PUBLISH__PDFDOC			The optional PDF doc to be published e.g. https://ci.eclipse.org/ocl/job/ocl-master/38/artifact/releng/org.eclipse.ocl.releng.build-site/target/ocl.pdf
#
dropsFolder="/home/data/httpd/download.eclipse.org/modeling/mdt/ocl/downloads/drops/"
javadocFolder="/home/data/httpd/download.eclipse.org/ocl/javadoc/"
pdfdocFolder="/home/data/httpd/download.eclipse.org/ocl/doc/${PUBLISH__VERSION}"
group="modeling.mdt.ocl"
zipPrefix="mdt-ocl-Update-"
localZip="newJavadoc.zip"
pdfName="ocl.pdf"

while getopts u:v:t:q:a:j:p: option
do
case "${option}"
in
u) PUBLISH__URL=${OPTARG};;
v) PUBLISH__VERSION=${OPTARG};;
t) PUBLISH__BUILD_T=${OPTARG};;
q) PUBLISH__QUALIFIER=${OPTARG};;
a) PUBLISH__ALIAS=${OPTARG};;
j) PUBLISH__JAVADOC=${OPTARG};;
p) PUBLISH__PDFDOC=${OPTARG};;
esac
done

if [ -n "${PUBLISH__BUILD_T}" ]
then

  tQualifier="${PUBLISH__BUILD_T}${PUBLISH__QUALIFIER:1:8}${PUBLISH__QUALIFIER:10:4}"
  versionFolder="${dropsFolder}${PUBLISH__VERSION}/${tQualifier}"
  if [ ! -d "${versionFolder}" ]
  then
    mkdir -p ${versionFolder}
  fi

  fileStem="${tQualifier}"
  if [ -n "${PUBLISH__ALIAS}" ]
  then
    fileStem=${PUBLISH__ALIAS}
  fi
  zipFile="${zipPrefix}${fileStem}.zip"

  pushd ${versionFolder}
    curl -s -k ${PUBLISH__URL} > ${zipFile}
    md5sum -b ${zipFile} > ${zipFile}.md5
    sha512sum -b ${zipFile} > ${zipFile}.sha1
    # make sure permissions are for the intended group
    chgrp -R ${group} ${zipFile} ${zipFile}.md5 ${zipFile}.sha1
    chmod -R g+w ${zipFile} ${zipFile}.md5 ${zipFile}.sha1
  popd
  
  if [ ! -d "${javadocFolder}" ]
  then
    mkdir ${javadocFolder}
  fi
  pushd ${javadocFolder}
    curl -s -k ${PUBLISH__JAVADOC} > ${localZip}
    if [ $? -eq 0 ]
    then
      javadocSize=$(wc -c <"$localZip")
      if [ ${javadocSize} -ge 100000 ]						# A small (423 byte) file is an HTTP 404 message
      then
        unzip -ou ${localZip} -d new${PUBLISH__VERSION}
        chgrp -R ${group} new${PUBLISH__VERSION}
        chmod -R g+w new${PUBLISH__VERSION}
        rm -rf ${localZip}
        if [ -d "${PUBLISH__VERSION}" ]
        then
          mv ${PUBLISH__VERSION} old${PUBLISH__VERSION}
          mv new${PUBLISH__VERSION} ${PUBLISH__VERSION}
          rm -rf old${PUBLISH__VERSION}
        else
          mv new${PUBLISH__VERSION} ${PUBLISH__VERSION}
        fi
      fi
    fi
  popd
  
  if [ ! -d "${pdfdocFolder}" ]
  then
    mkdir ${pdfdocFolder}
  fi
  pushd ${pdfdocFolder}
    curl -s -k ${PUBLISH__PDFDOC} > new${pdfName}
    if [ $? -eq 0 ]
    then
      pdfSize=$(wc -c <"new${pdfName}")
      if [ ${pdfSize} -ge 100000 ]						# A small (423 byte) file is an HTTP 404 message
      then
        chgrp -R ${group} new${pdfName}
        chmod -R g+w new${pdfName}
        if [ -f "${pdfName}" ]
        then
          mv ${pdfName} old${pdfName}
          mv new${pdfName} ${pdfName}
          rm -rf old${pdfName}
        else
          mv new${pdfName} ${pdfName}
        fi
      fi
    fi
  popd

fi