#!/usr/bin/env bash
#*******************************************************************************
# Copyright (c) 2016, 2017 IBM Corporation and others.
# All rights reserved. This program and the accompanying materials
# are made available under the terms of the Eclipse Public License v1.0
# which accompanies this distribution, and is available at
# http://www.eclipse.org/legal/epl-v10.html
#
# Contributors:
#     David Williams - initial API and implementation
#       Initial version based on similar file in Sim Release repository
#*******************************************************************************


# Small utility to more automatically do the renames the morning of "making visible",
# after artifacts have mirrored. In theory, could be done by a cron or at job.
#
# Note, copy is used, instead of move, so that the parent directory's "modified time" does not change.
# That way the mirroring script won't falsely report "no mirrors" (for a while).
#
# Plus, we "copy over" any existing files, under the assumption that previous labeled files are left in place,
# for a while, so they'd serve as backup. If that ever changes, should make a --backup of
# the original files ... just in case ... but then modified time of parent directory would be
# changed.
#
# And notice we do "artifacts" first, so by the time "content" can be retrieved, by p2, thre will be
# valid artifacts "pointed to". If anyone has already fetched 'content' and in the middle of getting
# artifacts, their downloads should nearly always continue to work (except we do keep only 3 milestones
# in composite, so in theory, they might have stale 'content' data that pointed to an old artifact that
# was no longer in (the newly copied) 'artifacts' file.

function usage ()
{
  printf "\n\t%s" "This utility, ${0##*/}, is to copy the two metadataXX.jars to their final name of metadata.jar." >&2
  printf "\n\t\t%s\n" "Example: ${0##*/} 'trainName' 'checkpoint'" >&2
  printf "\n\t%s" "Both arguments are required." >&2
  printf "\n\t%s" "'trainName' is the final directory segment of where the composite files reside," >&2
  printf "\n\t\t%s\n" "such as neon, oxygen, photon, etc." >&2
  printf "\n\t%s" "'checkpoint' is the pre-visibility label given to the metadata files," >&2
  printf "\n\t\t%s\n" "such as M4, RC1, etc. or simply R for final release, 1 for Update 1, etc.." >&2
  printf "\n\t\t%s\n" "For example, for Neon.1 the file content1.jar is copied to content.jar " >&2
  printf "\n\t\t\t%s\n" "and content1.xml.xz, if it exists, is copied to content.xml.xz" >&2
  printf "\n\t\t%s\n" "If the contentN.jar or artifactsN.jar do not exist, it is treated as an error." >&2
  printf "\n\t\t%s\n" "But if the corresponding "xz" versions do not exist, it is treated as a warning." >&2
}

function changeNamesByCopy ()
{

  REPO_ROOT=$1

  # be paranoid with sanity checks
  if [[ -z "${REPO_ROOT}"  ]]
  then
    printf "\n\t[ERROR] REPO_ROOT must be passed in to this function ${0##*/}\n"
    exit 1
  elif [[ ! -e "${REPO_ROOT}" ]]
  then
    printf "\n\t[ERROR] REPO_ROOT did not exist!\n\tREPO_ROOT: ${REPO_ROOT}\n"
    exit 1
  elif [[ ! -w "${REPO_ROOT}" ]]
  then
    printf "\n\t\[ERROR] We do not appear to have write access to REPO_ROOT\n"
  else
    printf "\n\t[INFO] REPO_ROOT existed as expected:\n\tREPO_ROOT: ${REPO_ROOT}\n\n"
  fi

  artifactsFileName="artifacts"
  contentFileName="content"
  oldArtifactsJarName="${artifactsFileName}${CHECKPOINT}.jar"
  oldContentJarName="${contentFileName}${CHECKPOINT}.jar"
  newArtifactsJarName="${artifactsFileName}.jar"
  newContentJarName="${contentFileName}.jar"
  oldArtifactsXZName="${artifactsFileName}${CHECKPOINT}.xml.xz"
  oldContentXZName="${contentFileName}${CHECKPOINT}.xml.xz"
  newArtifactsXZName="${artifactsFileName}.xml.xz"
  newContentXZName="${contentFileName}.xml.xz"
  
  # Note: we check for all error conditions first, so if there is any one error, we make no changes.
  if [[ ! -e "${REPO_ROOT}/${oldArtifactsJarName}" ]]
  then
    printf "\n\t[ERROR] ${oldArtifactsJarName} did not exist in REPO_ROOT!\n"
    exit 1
  fi
  if [[ ! -e "${REPO_ROOT}/${oldContentJarName}" ]]
  then
    printf "\n\t[ERROR] ${oldContentJarName} did not exist in REPO_ROOT!\n"
    exit 1
  fi

  # TODO: should these be errors?
  if [[ ! -e "${REPO_ROOT}/${oldArtifactsXZName}" ]]
  then
    printf "\n\t[WARNING] ${oldArtifactsXZName} did not exist in REPO_ROOT!\n"
  fi
  if [[ ! -e "${REPO_ROOT}/${oldContentXZName}" ]]
  then
    printf "\n\t[WARNING] ${oldContentXZName} did not exist in REPO_ROOT!\n"
  fi

  # The copy work begins here, still checking for errors on each
  # verbose doesn't help too much if out-format given
  verboseOutput=
  #verboseOutput="--verbose"
  # out-format gives us the names of files copied
  #outputFormat=
  # using %i gives details of "what" changed about existing item. 
  # In our case it typically says something like: '>f..T......artifacts1.jar'
  # Which means "transferred" "file" and its "Time" changed. 
  # (Does say say new name of file, though ... ll -tr will give "most recent" 
  # files at end of listing). 
  outputFormat="--out-format='%i%n%L'"
  rsync ${outputFormat} --group ${verboseOutput} ${REPO_ROOT}/${oldArtifactsJarName} ${REPO_ROOT}/${newArtifactsJarName}
  RC=$?
  if [[ $RC != 0 ]]
  then
    printf "\n\t[ERROR] copy returned a non zero return code for ${oldArtifactsJarName}. RC: $RC\n"
    exit $RC
  fi
  rsync ${outputFormat} --group ${verboseOutput} ${REPO_ROOT}/${oldContentJarName}   ${REPO_ROOT}/${newContentJarName}
  RC=$?
  if [[ $RC != 0 ]]
  then
    printf "\n\t[ERROR] copy returned a non zero return code for ${oldContentJarName}. RC: $RC\n"
    exit $RC
  fi

  if [[ -e ${REPO_ROOT}/${oldArtifactsXZName} ]]
  then
  rsync ${outputFormat} --group ${verboseOutput} ${REPO_ROOT}/${oldArtifactsXZName} ${REPO_ROOT}/${newArtifactsXZName}
  RC=$?
  if [[ $RC != 0 ]]
  then
    printf "\n\t[ERROR] copy returned a non zero return code for ${oldArtifactsXZName}. RC: $RC\n"
    exit $RC
  fi
  fi
  if [[ -e ${REPO_ROOT}/${oldContentXZName} ]]
  then
  rsync ${outputFormat} --group ${verboseOutput} ${REPO_ROOT}/${oldContentXZName}   ${REPO_ROOT}/${newContentXZName}
  RC=$?
  if [[ $RC != 0 ]]
  then
    printf "\n\t[ERROR] copy returned a non zero return code for ${oldContentXZName}. RC: $RC\n"
    exit $RC
  fi
fi

}

# This is entry point to "main" function
# We require both arguments, since to provide a default could lead to
# very bad errors if wrong value of "trainName" was used.

if [[ ! $# = 2 ]]
then
  printf "\n\t[ERROR] Wrong number of arguments to ${0##*/}\n"
  usage
  exit 1
fi


TRAIN_NAME=$1
CHECKPOINT=$2

printf "\n\tArguments to utility were:"
printf "\n\t\tTRAIN_NAME: ${TRAIN_NAME}"
printf "\n\t\tCHECKPOINT: ${CHECKPOINT}\n"

if [[ -z "${CHECKPOINT}" || -z "${TRAIN_NAME}" ]]
then
  # This would be rare. Equates to something like ./makevisible.sh "" M2
  # But, just in case. Note that something like ./makevisible "   " M2
  # is still not handled well.
  printf "\n\t%s\n" "[ERROR]: one or both required arguments were empty?!\n" >&2
  usage
  exit 1
fi

# Note: we do "Sim Rel repo" first, to avoid a small window of users getting
# EPP metadata for update, but the Sim Rel repo not being ready.
# Note: we allow "override" of the repo roots by env. variable to make testing easier.

EPP_REPO_ROOT=${EPP_REPO_ROOT:-/home/data/httpd/download.eclipse.org/technology/epp/packages/${TRAIN_NAME}}
changeNamesByCopy "${EPP_REPO_ROOT}"
RC=$?
if [[ $RC != 0 ]]
then
  printf "\n\t[ERROR] changeNamesByCopy returned non-zero return code. RC: $RC\n"
  exit $RC
fi
exit 0

