#!/usr/bin/env bash

#*******************************************************************************
# Copyright (c) 2019 Eclipse Foundation and others.
# This program and the accompanying materials are made available
# under the terms of the Eclipse Public License 2.0
# which is available at http://www.eclipse.org/legal/epl-v20.html,
# or the MIT License which is available at https://opensource.org/licenses/MIT.
# SPDX-License-Identifier: EPL-2.0 OR MIT
#*******************************************************************************

# This script creates the metadata files for a p2repo at the beginning of a release cycle.
# It pre-populates the composite repository with the content of the last release.
# last_release_dir can be specified with a relative path (e.g. '../2019-03/201903201000') or absolute
# (e.g. 'https://download.eclipse.org/releases/2019-03/201903201000').

# Bash strict-mode
set -o errexit
set -o nounset
set -o pipefail

IFS=$'\n\t'
script_name="$(basename ${0})"

release_name=${1:-}
last_release_dir=${2:-}

releases_root_dir="/home/data/httpd/download.eclipse.org/releases"
new_release_dir="${releases_root_dir}/${release_name}"
timestamp=$(date +%s%3N)

ssh_remote="genie.simrel@projects-storage.eclipse.org"

usage() {
  printf "Usage: %s release_name last_release_dir\n" "$script_name"
  printf "\t%-16s release name (e.g. 2019-06).\n" "release_name"
  printf "\t%-16s last release dir (e.g. '../2019-03/201903201000').\n" "last_release_dir"
}

if [[ -z "${release_name}" ]]; then
  printf "ERROR: release name must not be empty\n"
  usage
  exit 1
fi

if [[ -z "${last_release_dir}" ]]; then
  printf "ERROR: last release dir must not be empty\n"
  usage
  exit 1
fi

#check if dir already exists
if ssh ${ssh_remote} test -d ${new_release_dir}; then
  printf "ERROR: ${new_release_dir} already exists. Skipping...\n"
  exit 1
fi

create_next_release_repo() {
  #create dir locally
  mkdir -p ${release_name}

  pushd ${release_name}

  echo "Creating p2.index..."
  cat <<EOF > p2.index
version=1
metadata.repository.factory.order=compositeContent.xml
artifact.repository.factory.order=compositeArtifacts.xml
EOF

  echo "Creating metadata..."
  #create compositeArtifacts.xml
  cat <<EOG > compositeArtifacts.xml
<?xml version='1.0' encoding='UTF-8'?>
<?compositeArtifactRepository version='1.0.0'?>
<repository name='Eclipse Repository'  type='org.eclipse.equinox.internal.p2.artifact.repository.CompositeArtifactRepository' version='1.0.0'>
  <properties size='3'>
    <property name='p2.timestamp' value='${timestamp}'/>
    <property name='p2.compressed' value='true'/>
    <property name='p2.atomic.composite.loading' value='true'/>
  </properties>
  <children size='2'>
    <child location='../../technology/epp/packages/${release_name}' />
    <child location='${last_release_dir}' />
  </children>
</repository>
EOG

  #create compositeContent.xml
  cat <<EOH > compositeContent.xml
<?xml version='1.0' encoding='UTF-8'?>
<?compositeMetadataRepository version='1.0.0'?>
<repository name='Eclipse Repository'  type='org.eclipse.equinox.internal.p2.metadata.repository.CompositeMetadataRepository' version='1.0.0'>
  <properties size='3'>
    <property name='p2.timestamp' value='${timestamp}'/>
    <property name='p2.compressed' value='true'/>
    <property name='p2.atomic.composite.loading' value='true'/>
  </properties>
  <children size='2'>
    <child location='../../technology/epp/packages/${release_name}' />
    <child location='${last_release_dir}' />
  </children>
</repository>
EOH

  echo "compositeArtifacts.xml"
  cat compositeArtifacts.xml
  echo "compositeContent.xml"
  cat compositeContent.xml

  echo "Creating jars..."
  zip compositeArtifacts.jar compositeArtifacts.xml
  zip compositeContent.jar compositeContent.xml
  rm *.xml

  echo "Check dir structure..."
  ls -al

  popd
}

create_next_release_repo

echo "SCPing to download server..."

scp -r ${release_name} ${ssh_remote}:${releases_root_dir}/

echo "Done."