#!/bin/sh
#Based upon Gef4 publish.sh script

#causes the shell to exit if any subcommand or pipeline returns a non-zero status.
#set -e

# Script may take 10-11 command line parameters:
# $1: Hudson job name: <name>
# $2: Hudson build id: <id>
# $3: Build type: i(ntegration), s(table), r(elease)
# $4: Whether to promote to an update-site: (y)es, (n)o
# $5: Whether to merge the site with an existing one: (y)es, (n)o
# $6: Whether to generate drop files: (y)es, (n)o
# $7: The release label used to label the drop files and (nested) update site, e.g. 3.10.0 or 3.10.1
# $8: The eclipse target version, e.g. neon
# $9: Whether to generate rcp files: (y)es, (n)o
# $10: Papyrus component 
# $11: An optional release label suffix to be appended to drop files and (nested) update site name, e.g. M1, RC1 

#The publish.sh script may be used to publish the build results (update site and drop files and rcp). The script may be called
#without parameters and prompts for everything it requires for publishing an update site, or it may be 
#invoked with respective command line parameters.
if [ $# -eq 12 -o $# -eq 13  ];
then
	jobName=${1}
	echo "jobName: $jobName"
	buildId=${2}
	echo "buildId: $buildId"
	buildType=${3}
	echo "buildType: $buildType"
	site=${4}
	echo "site: $site"
	merge=${5}
	echo "merge: $merge"
	dropFiles=${6}
	echo "dropFiles: $dropFiles"
	releaseLabel=${7}	
	echo "releaseLabel: $releaseLabel"
	eclipseTarget=${8}	
	echo "eclipseTarget: $eclipseTarget"
	rcpFiles=${9}	
	echo "rcpFiles: $rcpFiles"
	component=${10}	
	echo "component: $component"
	eclipseDir=${11}	
	echo "eclipseDir: $eclipseDir"
	eclipseVersion=${12}	
	echo "eclipseVersion: $eclipseVersion"
	if [ -n "${13}" ];
	then
		releaseLabelSuffix=${13}
		echo "releaseLabelSuffix: $releaseLabelSuffix"
	fi
else
	if [ $# -ne 0 ];
	then
		exit 1
	fi
fi

#The root url that enables to find the job with ${hudsonJobRootUrl}/$jobName/$buildId
hudsonJobRootUrl="https://hudson.eclipse.org/papyrus/job/"

#The localization of the local build target update site
targetUpdateSite="archive/releng/org.eclipse.papyrus.${component}.p2/target/repository"
targetRCPRoot="archive/releng/org.eclipse.papyrus.${component}.product/target/products/org.eclipse.papyrus.${component}.product"

#The feature to parse to retrieve the qualifierversion
feature2Parse4QualifierVersion="org.eclipse.papyrus.${component}.feature"

#The specific localization
hudsonRoot="/home/data/httpd/download.eclipse.org/"

remoteUpdateSiteRoot="modeling/mdt/papyrus/components/${component}"
remoteDropDir=${hudsonRoot}/${remoteUpdateSiteRoot}/downloads/${releaseLabel}/drops
remoteUpdateSite="${hudsonRoot}/${remoteUpdateSiteRoot}/${remoteSite}"
remoteRcpDir=${hudsonRoot}/${remoteUpdateSiteRoot}/downloads/${releaseLabel}/rcps



if [ -z "$jobName" ];
then
	echo -n "Please enter the name of the Hudson job you want to promote:"
	read jobName
fi

if [ -z "$buildId" ];
then
	for i in $( find ~/.hudson/jobs/$jobName/builds -type l | sed 's!.*/!!' | sort)
	do
		echo -n "$i, "
	done
	echo "lastStable, lastSuccessful"
	echo -n "Please enter the id of the $jobName build you want to promote:"
	read buildId
fi

if [ "$buildId" = "lastStable" -o "$buildId" = "lastSuccessful" ];
then
	# Reverse lookup the build id (in case lastSuccessful or lastStable was used)
	for i in $(find ~/.hudson/jobs/$jobName/builds/ -type l)
	do
		if [ "$(readlink -f $i)" = "$(readlink -f ~/.hudson/jobs/$jobName/$buildId)" ];
		then
			buildId=${i##*/}
		fi
	done
	echo "Reverse lookup (lastStable/lastSuccessful) yielded buildId: $buildId"
fi

# Determine the local update site we want to publish to
jobDir=$(readlink -f ~/.hudson/jobs/${jobName}/builds/${buildId})
if [ ! -d $jobDir ];
then
	echo "The specified buildId does not refer to an existing build: $buildId"
	exit 1
fi


localUpdateSite=${jobDir}/${targetUpdateSite}
echo "jobDir=${jobDir}"
echo "targetUpdateSite=${targetUpdateSite}"
echo "localUpdateSite=${localUpdateSite}"

localRCPSiteRoot=${jobDir}/${targetRCPRoot}
echo "localRCPSiteRoot=${localRCPSiteRoot}"

echo "Publishing from local update site: $localUpdateSite"

# Select the build type
if [ -z "$buildType" ];
then
    echo -n "Please select which type of build you want to publish to [i(integration), s(table), r(elease)]: "
    read buildType
fi
echo "Publishing as $buildType build"

# check if we are going to promote to an update-site
if [ -z "$site" ];
then
	echo -n "Do you want to promote to an remote update site? [(y)es, (n)o]:"
	read site
fi
if [ "$site" != y -a "$site" != n ];
then
	echo "Parameter site has to be 'y'(es) or 'n'(o) but was: $site"
    exit 0
fi
echo "Promoting to remote update site: $site"

if [ "$site" = y ];
then
	# Determine remote update site we want to promote to
	case $buildType in
		i|I) remoteSite=integration;;
		s|S) remoteSite=milestones;;
		r|R) remoteSite=releases;;
		*) 
		echo "Parameter buildType has to be 'i'(ntegration), 's'(stable), or 'r'(elease), but was: $buildType"
		exit 1 ;;
	esac

	echo "Publishing to remote update-site: $remoteUpdateSite"

	if [ -d "$remoteUpdateSite" ];
	then
		if [ -z "$merge" ];
		then
			echo -n "Do you want to merge with the existing update-site? [(y)es, (n)o]:"
			read merge
		fi
		if [ "$merge" != y -a "$merge" != n ];
		then
			echo "Parameter merge has to be 'y'(es) or 'n'(o) but was: $merge"
			exit 1
		fi
	else
		merge=n
	fi
	echo "Merging with existing site: $merge"
fi

# check if we are going to create drop files
if [ -z "$dropFiles" ];
then
	echo -n "Do you want to create drop files? [(y)es, (n)o]:"
	read dropFiles
fi
if [ "$dropFiles" != y -a "$dropFiles" != n ];
then
	echo "Parameter dropFiles has to be 'y'(es) or 'n'(o) but was: $dropFiles"
	exit 1
fi
echo "Generating drop files: $dropFiles"

# Determine releaseLabel
if [ -z "$releaseLabel" ];
then
    echo -n "Please enter release label (e.g. 3.10.0, 3.10.1M2):"
    read releaseLabel
fi

# Prepare a temp directory
mkdir -p target
cd target
tmpDir="$jobName-publish-tmp"
rm -fr $tmpDir
mkdir -p $tmpDir
cd $tmpDir

# Download and prepare Eclipse SDK, which is needed to merge update site and postprocess repository 
echo "Downloading eclipse to $PWD"

cp ${eclipseDir}/${eclipseVersion} .


ls -la
tar -xzf ${eclipseVersion}
cd eclipse
chmod 700 eclipse
cd ..
if [ ! -d "eclipse" ];
then
    echo "Failed to download an Eclipse SDK, being needed for provisioning."
    exit
fi
# Prepare Eclipse SDK to provide WTP releng tools (used to postprocess repository, i.e set p2.mirrorsURL property)
echo "Installing WTP Releng tools"
./eclipse/eclipse -nosplash --launcher.suppressErrors -clean -debug -application org.eclipse.equinox.p2.director -repository http://download.eclipse.org/webtools/releng/repository/ -installIUs org.eclipse.wtp.releng.tools.feature.feature.group
# Clean up
echo "Cleaning up"
rm ${eclipseVersion}

# Generate drop files
if [ "$dropFiles" = y ];
	then
	
	# Prepare local update site (for drop files)
	echo "Prepare local update site (for drop files)"
	mkdir -p update-site
	cp -R $localUpdateSite/* update-site/
	echo "Copied $localUpdateSite to local directory update-site."
	
	qualifiedVersion=$(find update-site/features/ -maxdepth 1 | grep "${feature2Parse4QualifierVersion}")
	qualifiedVersion=${qualifiedVersion%.jar}
    qualifiedVersion=${qualifiedVersion#*_}
    qualifier=${qualifiedVersion##*.}
    dropDir="${releaseLabel}/$(echo $buildType | tr '[:lower:]' '[:upper:]')$qualifier"
    localDropDir=drops/$dropDir
    echo "Creating drop files in local directory $localDropDir"
    mkdir -p $localDropDir
    
    cd update-site
    zip -r ../$localDropDir/${component}-Update-${releaseLabel}${releaseLabelSuffix}.zip features plugins artifacts.jar content.jar
    md5sum ../$localDropDir/${component}-Update-${releaseLabel}${releaseLabelSuffix}.zip > ../$localDropDir/${component}-Update-${releaseLabel}${releaseLabelSuffix}.zip.md5
    echo "Created ${component}-Update-Site-${releaseLabel}${releaseLabelSuffix}.zip" 
    cd ..  

    # Cleanup local update site (for drop files generation)
	rm -fr update-site

	#generating build.cfg file to be referenced from downloads web page
	echo "generating build.cfg file to be referenced from downloads web page"
    echo "hudson.job.name=$jobName" > $localDropDir/build.cfg
    echo "hudson.job.id=$buildId (${jobDir##*/})" >> $localDropDir/build.cfg
    echo "hudson.job.url= ${hudsonJobRootUrl}/$jobName/$buildId" >> $localDropDir/build.cfg
    
	mkdir -p ${remoteDropDir}
    cp -R $localDropDir/* ${remoteDropDir}/
         
fi

# Generate RCP files
if [ "$rcpFiles" = y ];
	then
	
	# Prepare local rcp site (for rcp files)
	mkdir -p rcp-site
	cp ${localRCPSiteRoot}-linux.gtk.x86_64.zip rcp-site/org.eclipse.papyrus.${component}.product-${releaseLabel}-${releaseLabelSuffix}-linux.gtk.x86_64.zip
	echo "Copied ${localRCPSiteRoot}-linux.gtk.x86_64.zip to local directory rcp-site."
	cp ${localRCPSiteRoot}-macosx.cocoa.x86_64.tar.gz rcp-site/org.eclipse.papyrus.${component}.product-${releaseLabel}-${releaseLabelSuffix}-macosx.cocoa.x86_64.tar.gz
	echo "Copied ${localRCPSiteRoot}-macosx.cocoa.x86_64.tar.gz to local directory rcp-site."
	cp ${localRCPSiteRoot}-win32.win32.x86_64.zip rcp-site/org.eclipse.papyrus.${component}.product-${releaseLabel}-${releaseLabelSuffix}-win32.win32.x86_64.zip
	echo "Copied ${localRCPSiteRoot}-win32.win32.x86_64.zip to local directory rcp-site."
	
	qualifiedVersion=$(find update-site/features/ -maxdepth 1 | grep "${feature2Parse4QualifierVersion}")
	qualifiedVersion=${qualifiedVersion%.jar}
    qualifiedVersion=${qualifiedVersion#*_}
    qualifier=${qualifiedVersion##*.}
    dropDir="${releaseLabel}/$(echo $buildType | tr '[:lower:]' '[:upper:]')$qualifier"

	localRcpDir=rcps/$dropDir
    echo "Creating rcp files in local directory $localRcpDir"
    mkdir -p $localRcpDir
    
    cd rcp-site
    cp * ../$localRcpDir/
    
    echo "Created org.eclipse.papyrus.${component}.product-${releaseLabel}-${releaseLabelSuffix}-linux.gtk.x86_64.zip in ../$localRcpDir/" 
    cd ..  

    # Cleanup local update site (for drop files generation)
	rm -fr rcp-site

	mkdir -p ${remoteRcpDir}/
    cp -R $localRcpDir/* ${remoteRcpDir}/
       
fi

if [ "$site" = y ];
then
	mkdir -p update-site
	updateSiteLabel=${releaseLabel}${releaseLabelSuffix}_${jobName}_${buildId}
	# Prepare composite local update site (transfer into composite if needed)
	if [ "$merge" = y ];
	then
		# check if the remote site is a composite update site
		echo "Merging existing site into local one."
		#if [ -e "$remoteUpdateSite/compositeArtifacts.xml" ];
		#then
			cp -R $remoteUpdateSite/* update-site/
		#else
		#	mkdir -p update-site/pre_${updateSiteLabel}
		#	cp -R $remoteUpdateSite/* update-site/pre_${updateSiteLabel}/
		#fi
	else 
		echo "Skipping merge operation."    
	fi
	# move local update site below composite one
	mkdir -p update-site/${updateSiteLabel}
	cp -R $localUpdateSite/* update-site/${updateSiteLabel}/
    	
	cd update-site
	children=$(find . -maxdepth 1 -type d -print | wc -l)
	children=$(($children-1))
	timestamp=$(date +%s000)

content="
<?xml version='1.0' encoding='UTF-8'?>
<?compositeMetadataRepository version='1.0.0'?>
<repository name='${component} ${remoteSite}' type='org.eclipse.equinox.internal.p2.metadata.repository.CompositeMetadataRepository' version='1.0.0'>
<properties size='1'>
<property name='p2.timestamp' value='${timestamp}'/>
</properties>
<children size='${children}'>
$(
for file in *; do
  if [ -d $file ]; then
printf "<child location='${file}'/>"
  fi
done
)
</children>
</repository>
"
	echo $content > compositeContent.xml

artifact="
<?xml version='1.0' encoding='UTF-8'?>
<?compositeArtifactRepository version='1.0.0'?>
<repository name='${component} ${remoteSite}' type='org.eclipse.equinox.internal.p2.artifact.repository.CompositeArtifactRepository' version='1.0.0'>
<properties size='1'>
<property name='p2.timestamp' value='${timestamp}'/>
</properties>
<children size='${children}'>
$(
for file in *; do
  if [ -d $file ]; then
printf "<child location='${file}'/>"
  fi
done
)
</children>
</repository>
"
	echo $artifact > compositeArtifacts.xml

	cd ..

	# Ensure p2.mirrorURLs property is used in update site
	echo "Updating p2.mirrorURLs property."
	./eclipse/eclipse -nosplash --launcher.suppressErrors -clean -debug -application org.eclipse.wtp.releng.tools.addRepoProperties -vmargs -DartifactRepoDirectory=$PWD/update-site/${updateSiteLabel} -Dp2MirrorsURL="http://www.eclipse.org/downloads/download.php?format=xml&file=/${remoteUpdateSiteRoot}/${remoteSite}/${updateSiteLabel}"

	# Create p2.index file
	if [ ! -e "update-site/p2.index" ];
	then
		echo "Creating p2.index file."
		echo "version = 1" > update-site/p2.index
		echo "metadata.repository.factory.order=compositeContent.xml,\!" >> update-site/p2.index
		echo "artifact.repository.factory.order=compositeArtifacts.xml,\!" >> update-site/p2.index
	fi

	# Backup then clean remote update site
	echo "Creating backup of remote update site."
	if [ -d "$remoteUpdateSite" ];
	then
		if [ -d BACKUP ];
		then
			rm -fr BACKUP
		fi
		mkdir BACKUP
		cp -R $remoteUpdateSite/* BACKUP/
		rm -fr $remoteUpdateSite
	fi

	echo "Publishing contents of local update-site directory to remote update site $remoteUpdateSite"
	mkdir -p $remoteUpdateSite
	cp -R update-site/* $remoteUpdateSite/
fi

# Clean up
echo "Cleaning up"
rm -fr eclipse
rm -fr update-site