#!/bin/sh
#
# unpack windows rpm's from opensuse download server, upload files to kde.org and file a related release ticket
#
# Author: Ralf Habacker <ralf.habacker@freenet.de>
#
# requirements:
#
#  osc - opensuse build service command line client
#
# syntax: release-windows-packages [<options>] <mode>
#
# run ./release-windows-packages to see all modes and options
#
NAME=umbrello
# package name on download.kde.org
RELEASE_NAME=umbrello

PACKAGENAME32=mingw32-$NAME
ROOT32=windows\:mingw\:win32
SRCROOT32=${ROOT32}
ARCHOUT32=i686-w64-mingw32
use32=1

PACKAGENAME64=mingw64-$NAME
ROOT64=windows\:mingw\:win64
SRCROOT64=${ROOT64}
ARCHOUT64=x86_64-w64-mingw32
use64=1

REPO=openSUSE_Leap_42.3
SRCREPO=$REPO
usesrc=0

PHABURL=https://phabricator.kde.org
oscoptions="-A https://api.opensuse.org"
apitoken=cli-uxo23l4q5qrzoyscbz5kp4zcngqp
options='projectPHIDs[]=PHID-PROJ-3qa4tomwgrmcmp4ym2ow'

# abort on errors
set -e

echo2() { printf "%s\n" "$*" >&2; }

which 7z >/dev/null 2>&1
if test $? -ne 0; then
    echo "7z not found, run 'zypper install p7zip'"
    exit 1
fi

self=$(realpath $0)

if ! test -d "work"; then
    mkdir work
fi

echo2 "running mode $1"
dryrun=0
update=0
update_symlink=1
curl=curl

# check options
for var in "$@"; do
case $var in
--update-32) ## update i686 variant
	use64=0
	usesrc=0
	update=1
	shift
	;;

--update-64) ## update x86_64 variant
	use32=0
	usesrc=0
	update=1
	shift
	;;

--symlink) ## update 'latest' symbolic link
	update_symlink=1
	shift
	;;

--dryrun) ## simulate upload only
	dryrun=1
	curl="echo curl"
	shift
	;;
esac
done

function clean() {
	rm -rf work/*
}

function download() {
	cd work
	rm -rf binaries
	if test $use32 -eq 1; then
		osc $oscoptions getbinaries --multibuild-package=$PACKAGENAME32-installer $ROOT32 $PACKAGENAME32 $REPO x86_64
		VERSION=$(find binaries/ -name "*$PACKAGENAME32-installer*" | sed "s,^.*$PACKAGENAME32-installer-,,g;s,-.*$,,g")
		echo $VERSION > VERSION
	fi
	if test $use64 -eq 1; then
		osc $oscoptions getbinaries --multibuild-package=$PACKAGENAME64-installer $ROOT64 $PACKAGENAME64 $REPO x86_64
		VERSION=$(find binaries/ -name "*$PACKAGENAME64-installer*" | sed "s,^.*$PACKAGENAME64-installer-,,g;s,-.*$,,g")
		echo $VERSION > VERSION
	fi
	cd ..
	if test $usesrc -eq 1; then
		downloadsrc
	fi
	touch work/$1.finished
}

function getversion() {
	if ! test -f work/VERSION; then
		echo "no version found"
		exit 1;
	fi
	VERSION=$(cat work/VERSION)
}

function downloadsrc() {
	cd work
	# fetch source package
	src32pkg=$(osc $oscoptions ls -b -r $SRCREPO -a x86_64 $SRCROOT32 $PACKAGENAME32 | grep src)
	osc $oscoptions getbinaries --sources $SRCROOT32 $PACKAGENAME32 $SRCREPO x86_64 $src32pkg
	# we only need once source package
	#src64pkg=$(osc $oscoptions ls -b -r $SRCREPO -a x86_64 $SRCROOT64 mingw64-umbrello | grep src)
	#osc $oscoptions getbinaries --sources $SRCROOT64 mingw64-umbrello $SRCREPO x86_64 $src64pkg
	# fetch debug packages
	debug32pkg=$(osc $oscoptions ls -b -r $SRCREPO -a x86_64 $SRCROOT32 $PACKAGENAME32 | grep debug)
	osc $oscoptions getbinaries $SRCROOT32 $PACKAGENAME32 $SRCREPO x86_64 $debug32pkg
	if test -n "$ROOT64"; then
	    debug64pkg=$(osc $oscoptions ls -b -r $SRCREPO -a x86_64 $SRCROOT64 $PACKAGENAME64 | grep debug)
	    osc $oscoptions getbinaries $SRCROOT64 $PACKAGENAME64 $SRCREPO x86_64 $debug64pkg
	fi
	cd ..
	touch $1.finished
}

function unpack()  {
	getversion
	cd work
	files=$(cd binaries; find -name '*installer*' -o -name '*portable*' -o -name '*src*' -o -name '*debugpackage*' | grep "$VERSION" | sed 's,^.,binaries,g')
	if test -d tmp; then
		rm -rf tmp
	fi
	mkdir -p tmp
	for i in $(echo $files); do
		(cd tmp; rpm2cpio ../$i | cpio -idmv)
	done
	cd ..
	touch $1.finished
}

function movepackage() {
	cd work
	rm -rf out
	mkdir -p out
	find tmp/ -type f -name '*.exe' -exec cp {} out \;
	find tmp/ -type f -name '*.7z' -exec cp {} out \;
	find tmp/ -type f -name '*.xz' -exec cp {} out \;
	cd ..
	touch $1.finished
}

function repacksource() {
	# repackage source package
	srcfile=$(find work/tmp -name "$NAME*.xz")
	outfile=$(basename $srcfile | sed 's,\.tar\.xz,\.7z,g')
	(mkdir -p work/srctmp; cd work/srctmp; tar -xJf ../../$srcfile; 7za a ../out/$outfile *; cd ..; rm -rf srctmp)
	touch work/$1.finished
}

function createsha() {
	(cd work/out; find -type f -name '*.7z' -o -name '*.exe' -o -name '*.xz' | sed 's,\./,,g' | sort | xargs sha256sum > $NAME.sha256sum)
	touch work/$1.finished
}

function upload() {
	for i in $(find work/out -name '*.7z' -o -name '*.exe' -o -name '*.xz'); do
		$curl -T $i ftp://upload.kde.org/incoming/
		if test $? -ne 0; then
			echo "upload failed"
			exit 1
		fi
	done
	touch work/$1.finished
}

function createdescription() {
	getversion
	description="Please move the $RELEASE_NAME related files which has been uploaded to upload.kde.org/incoming to download mirror 'stable/$RELEASE_NAME/$VERSION' location"
	if test $update -eq 1; then
		description="$description and remove the old files from this directory."
	elif test $update_symlink -eq 1; then
		description="$description and update the symbolic link 'stable/$RELEASE_NAME/latest' to 'stable/$RELEASE_NAME/$VERSION'"
	else
		description="$description."
	fi
	sums=$(cat work/out/$NAME.sha256sum | gawk 'BEGIN { print "dir	 shasum								   file"}  $2 ~ /mingw32/ { print "win32 " $0 } $2 ~ /mingw64/ { print "win64 " $0 } $2 ~ /\-src/ { print "src   " $0 }')
	echo -e "$description\n\n$sums" > work/description
	cat work/description
	touch work/$1.finished
}

function ticket() {
	getversion
	description=$(cat work/description)
	$curl $PHABURL/api/maniphest.createtask \
	-d api.token=$apitoken \
	-d "title=tarball move request for stable/$RELEASE_NAME/$VERSION" \
	-d "description=$description" \
	-d "$options"
	touch work/$1.finished
}

function sf() {
	clean
	download
	unpack
	movepackage
	if test $usesrc -eq 1; then
		repacksource
	fi
	createsha
	echo "All release related files are located in work/out"
	ls work/out
	touch work/$1.finished
}

function kde() {
	clean
	download
	unpack
	movepackage
	if test $usesrc -eq 1; then
		repacksource
	fi
	createsha
	upload
	echo "Content for ticket creating:"
	createdescription
	echo run "$0 ticket" to submit ticket
	touch work/$1.finished
}

function help() {
	echo "syntax: release-windows-packages [<options>] <mode>"
	echo
	echo "options:"
	gawk '$0 ~ /^--[a-z].*) ##/ { sub(/) ##/,"",$0); a = $1; $1 = ""; printf("    %-20s  - %s\n",a, $0); }' $0
	echo
	echo "modes:"
	gawk '$0 ~ /^[a-z].*) ##/ { sub(/) ##/,"",$0); a = $1; $1 = ""; printf("    %-20s  - %s\n",a, $0); }' $0

}

case $1 in
clean) ## clean working area
	clean;
	;;

download) ## download rpm packages
	download
	;;

downloadsrc) ## download source
	downloadsrc
	;;

unpack) ## unpack rpm files
	unpack
	;;

movepackage) ## move windows binary packages into upload folder
	movepackage
	;;

repacksource) ## repackage source tar ball to 7z
	repacksource
	;;

createsha) ## create sha256sums
	createsha
	;;

upload) ## upload files to staging area
	upload
	;;

createdescription) ## create ticket description
	createdescription
	;;

ticket) ## submit phabricator ticket
	ticket
	;;

sf) ## run all required targets for releasing on sourceforge
	sf
	;;

kde) ## run all required targets for releasing on download.kde.org
	kde
	;;
*)
	help
	;;
esac

exit 0
