#!/bin/bash

#
# tools/release.sh
#
# Copyright (c) 2014-2021 Simon Fraser University
# Copyright (c) 2003-2021 John Willinsky
# Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
#
# Script to create an automated (incremental) release of OJS.
#
# Usage: release.sh <stable-branch> <distrib dir> <github access token>
#  <stable_branch>: the stable branch to release from (e.g. ojs-stable-2_4_5)
#  <distrib dir>: a directory containing prior tarballs to use in generating
#    patches
#  <github access token>: an API token from
#    https://github.com/settings/applications
#
# NOTE: This script CANNOT currently be used to release a first build of a
# revision (i.e. a -0 build). It can only be used to release -1 and subsequent
# builds of a revision.

# Fail on first error
set -e

# Check for proper usage
if [ -z "$3" ]; then
	echo "Usage: $0 <stable-branch> <distrib dir> <github access token>";
	exit 1;
fi
BRANCH=$1
DISTRIBDIR=$2
ACCESSTOKEN=$3

# Make sure we're at the head of the stable branch
git checkout ${BRANCH}
git pull
cd lib/pkp
git checkout ${BRANCH}
git pull
cd ../..

# Determine the tag of the last release on this branch (e.g. ojs-2_4_5-0)
LASTTAG=`git describe --tags --abbrev=0 $BRANCH`

# Parse the version number information from the tag
[[ $LASTTAG =~ ([a-z]+)-([0-9]+)_([0-9]+)_([0-9]+)-([0-9]+) ]] && APPLICATION="${BASH_REMATCH[1]}" && MAJOR="${BASH_REMATCH[2]}" && MINOR="${BASH_REMATCH[3]}" && REVISION="${BASH_REMATCH[4]}" && LASTBUILD="${BASH_REMATCH[5]}"
THISBUILD=$((LASTBUILD+1))

# Calculate the tag of the next release (e.g. ojs-2_4_5-1
THISTAG=`echo $LASTTAG | sed -r 's/(.*-)([0-9]+)/echo \1$((\2+1))/ge'`

# Other useful bits and pieces
BUILDDATE=`date +%Y-%m-%d`
APPLICATION_UPPER=`echo ${APPLICATION} | tr '[:lower:]' '[:upper:]'`

# Update the version descriptor
LASTPATCHSUFFIX="${MAJOR}.${MINOR}.${REVISION}"
[[ ${LASTBUILD} -ne "" ]] && LASTPATCHSUFFIX="${LASTPATCHSUFFIX}-${LASTBUILD}"
sed -i	-e "s/<tag>.*<\/tag>/<tag>${THISTAG}<\/tag>/" \
	-e "s/<release>.*<\/release>/<release>${MAJOR}.${MINOR}.${REVISION}.${THISBUILD}<\/release>/" \
	-e "s/<date>.*<\/date>/<date>${BUILDDATE}<\/date>/" \
	-e "s/<package>.*<\/package>/<package>http:\/\/pkp.sfu.ca\/${APPLICATION}\/download\/${APPLICATION}-${MAJOR}.${MINOR}.${REVISION}-${THISBUILD}.tar.gz<\/package>/" \
	-e "s/\(<patch .*_to_\).*\(\.patch\.gz.*\)/\1${MAJOR}.${MINOR}.${REVISION}-${THISBUILD}.patch.gz/" \
	dbscripts/xml/version.xml
git add dbscripts/xml/version.xml

# Update the upgrade and install descriptors
sed -i	-e "s/<install version=\".*\">/<install version=\"${MAJOR}.${MINOR}.${REVISION}.${THISBUILD}\">/" \
	dbscripts/xml/upgrade.xml dbscripts/xml/install.xml
git add dbscripts/xml/upgrade.xml dbscripts/xml/install.xml

# Update the README.md
sed -i	-e "s/=== Version: .*/=== Version: ${MAJOR}.${MINOR}.${REVISION}-${THISBUILD}/" \
	-e "s/=== GIT tag: .*/=== GIT tag: ${THISTAG}/" \
	-e "s/=== Release date: .*/=== Release date: ${BUILDDATE}/" \
	docs/README.md
git add docs/README.md

# Update the Doxygen config file
sed -i	-e "s/^\(PROJECT_NUMBER.*= \).*/\1${MAJOR}.${MINOR}.${REVISION}-${THISBUILD}/" \
	docs/dev/*.doxygen

# Generate the release notes
echo -n "Generating release notes"
echo "
Automated Build ${MAJOR}-${MINOR}-${REVISION}.${THISBUILD}
-----------------------
This automated build adds the following fixes to the base release of ${APPLICATION_UPPER} ${MAJOR}.${MINOR}.${REVISION}:
" >> docs/RELEASE

# Get the bug IDs and titles for issues referenced in this release
for ISSUENUM in `(git log --pretty=oneline ${LASTTAG}..HEAD && cd lib/pkp && git log --pretty=oneline ${LASTTAG}..HEAD) | sed -n -e "s/.*pkp\/pkp-lib#\([0-9]\+\).*/\1/p" | sort -n | uniq`; do
	ISSUETITLE=`wget --auth-no-challenge --user=${ACCESSTOKEN} --password=x-oauth-basic -q -O - "https://api.github.com/repos/pkp/pkp-lib/issues/${ISSUENUM}" | php -r "echo trim(json_decode(file_get_contents('php://stdin'))->title);"`
	echo "	#${ISSUENUM}: ${ISSUETITLE}" >> docs/RELEASE
	echo -n "." # Status
done
RELEASE_ALTCOPY="docs/release-notes/README-${MAJOR}.${MINOR}.${REVISION}"
cp docs/RELEASE ${RELEASE_ALTCOPY}
git add docs/RELEASE ${RELEASE_ALTCOPY}
echo " Done."

# Commit the last changes
git add lib/pkp
git commit -m "Automated commits for ${APPLICATION_UPPER} ${MAJOR}.${MINOR}.${REVISION}-${THISBUILD}"
cd lib/pkp
git tag ${THISTAG}
git push --tags
cd ../..
git tag ${THISTAG}
git push --tags

# Build the package
bash tools/buildpkg.sh ${MAJOR}.${MINOR}.${REVISION}-${THISBUILD} ${THISTAG} ${DISTRIBDIR}
