blob: fcdca208ff86c34413950bb75e8b139a5b7a755f [file] [log] [blame]
#!/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