#!/bin/sh
#
# script to update PTP versions
#
# Usage: user_id update_versions ptp_version photran_version [branch]
#
# user_id - user id to use to clone repo
# ptp_version - new version string for PTP (e.g. "5.0.1")
# photran_version - new version string for Photran (e.g. "7.0.1")
# branch - alternate branch to use when updating versions
#
# Note: a "qualifier" suffix will automatically be added to the version where appropriate
#

BRANCH=master

if [ $# -lt 3 ]; then
	echo "usage: update_versions user_id ptp_version photran_version [branch]"
	exit 1
fi

user_id=$1
ptp_version=$2
photran_version=$3

if [ $# -gt 3 ]; then
	BRANCH=$4
fi

if [ -f fix_ptp_versions ]; then
	echo "please remove fix_ptp_versions first"
	exit 1
fi

mkdir fix_ptp_versions
cd fix_ptp_versions

git clone ssh://${user_id}@git.eclipse.org/gitroot/ptp/org.eclipse.photran.git
(cd org.eclipse.photran && git checkout $BRANCH)

git clone ssh://${user_id}@git.eclipse.org/gitroot/ptp/org.eclipse.ptp.git
(cd org.eclipse.ptp && git checkout $BRANCH)

git clone ssh://${user_id}@git.eclipse.org/gitroot/ptp/org.eclipse.ptp.master.git
(cd org.eclipse.ptp.master && git checkout $BRANCH)

PTP_PLUGINS="\
	releng/org.eclipse.ptp.aix.ppc \
	releng/org.eclipse.ptp.linux.ppc \
	releng/org.eclipse.ptp.linux.x86 \
	releng/org.eclipse.ptp.linux.x86_64 \
	releng/org.eclipse.ptp.macosx.ppc \
	releng/org.eclipse.ptp.macosx.x86 \
	releng/org.eclipse.ptp \
	debug/org.eclipse.ptp.debug.sdm \
	core/org.eclipse.ptp.utils \
	core/org.eclipse.ptp.proxy \
	rms/org.eclipse.ptp.rm.ibm.pe.proxy \
	rms/org.eclipse.ptp.rm.ibm.ll.proxy \
	rms/org.eclipse.ptp.rm.slurm.proxy \
	tools/sci/org.eclipse.ptp.sci \
	rdt/org.eclipse.ptp.rdt.core.remotejars"
	
update_feature() {
	sed -e "s/^\([ \t]*\)version=\"[0-9]\.[0-9]\.[0-9]\.qualifier\"/\1version=\"$2\.qualifier\"/" < $1/feature.xml > $1/feature.xml.tmp
	mv $1/feature.xml.tmp $1/feature.xml
}

update_manifest() {
	sed -e "s/^Bundle-Version: *[0-9]\.[0-9]\.[0-9]\.qualifier/Bundle-Version: $2.qualifier/" < $1/META-INF/MANIFEST.MF > $1/META-INF/MANIFEST.MF.tmp
	mv $1/META-INF/MANIFEST.MF.tmp $1/META-INF/MANIFEST.MF
}

for feature in org.eclipse.photran/*-feature; do
	echo "Updating $feature..."
	update_feature $feature $photran_version
done

for feature in org.eclipse.ptp/releng/*-feature; do
	echo "Updating $feature..."
	update_feature $feature $ptp_version
done

for plugin in $PTP_PLUGINS; do
	echo "Updating $plugin..."
	update_manifest org.eclipse.ptp/$plugin $ptp_version
done

(cd org.eclipse.photran && \
	mvn versions:set -DnewVersion="${photran_version}-SNAPSHOT" && \
	mvn org.eclipse.tycho:tycho-versions-plugin:0.14.0:update-pom)

(cd org.eclipse.ptp && \
	mvn versions:set -DnewVersion="${ptp_version}-SNAPSHOT" && \
	mvn org.eclipse.tycho:tycho-versions-plugin:0.14.0:update-pom)

(cd org.eclipse.ptp.master && \
	mvn versions:set -DnewVersion="${ptp_version}-SNAPSHOT")

find . -name pom.xml.versionsBackup -exec rm -f {} \;

#(cd org.eclipse.photran && git commit -m "Update PTP & Photran versions" && git push)
#(cd org.eclipse.ptp && git commit -m "Update PTP & Photran versions" && git push)
#(cd org.eclipse.ptp.master && git commit -m "Update PTP & Photran versions" && git push)

#
# Cleanup
#
#cd ..
#rm -rf fix_ptp_versions

exit 0
