#!/bin/bash
#
# Copyright (C) 2011 Denis 'GNUtoo' Carikli <GNUtoo@no-log.org>
# Copyright (C) 2011-2015 Paul Kocialkowski <contact@paulk.fr>
# Copyright (C) 2017 Wolfgang Wiedmeyer <wolfgit@wiedmeyer.de>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
#

set -e

# Variables
SCRIPT="$0"

REPLICANT_DIR=""
RELEASE_DIR=""
RELEASE_TYPE=""

ARGS_COUNT=2

release_signatures_tools () {
	if ! [ -d "$TOOLS" ]
	then
		return
	fi

	dir=$( pwd )

	cd "$TOOLS"
	for tool in $RELEASE_TOOLS
	do
		gpg --default-key "$RELEASE_KEY" --armor --output "$tool.asc" --detach-sign "$tool"
	done
	cd "$dir"
}

release_signatures_images () {
	if ! [ -d "$IMAGES" ]
	then
		return
	fi

	cd "$IMAGES"
	for device in $RELEASE_DEVICES
	do
		for image in $RELEASE_IMAGES
		do
			if [ -f "$IMAGES/$device/$image" ]
			then
				gpg --default-key "$RELEASE_KEY" --armor --output "$IMAGES/$device/$image.asc" --detach-sign "$IMAGES/$device/$image"
			fi
		done
	done
}

release_signatures () {
	echo "Releasing signatures"

	release_signatures_tools
	release_signatures_images

	mkdir -p "$SECURITY"
	gpg --armor --output "$SECURITY/$RELEASE_KEY.asc" --export "$RELEASE_KEY"

	dir=$( pwd )

	cd "$SECURITY"
	rm "security.sha256"
	sha256sum * > "security.sha256"
	cd "$dir"
}

release_images () {
	echo "Releasing images"

	for device in $RELEASE_DEVICES
	do
		echo "Releasing images for $device"
		mkdir -p "$IMAGES/$device"

		for image in $RELEASE_IMAGES
		do
			if [ -f "$RELEASE_IMAGES_DIR/$device/$image" ]
			then
				cp "$RELEASE_IMAGES_DIR/$device/$image" "$IMAGES/$device/"
			fi
		done

		dir=$( pwd )

		cd "$IMAGES/$device"
		sha256sum * > "$device.sha256"
		cd "$dir"
	done
}

release_tools () {
	echo "Releasing tools"
	mkdir -p "$TOOLS"

	for tool in $RELEASE_TOOLS
	do
		cp "$RELEASE_TOOLS_DIR/$tool" "$TOOLS/"
	done

	dir=$( pwd )

	cd "$TOOLS"
	sha256sum * > "tools.sha256"
	cd "$dir"
}

release_scripts () {
	echo "Releasing scripts"
	mkdir -p "$SCRIPTS"

	for script in $RELEASE_SCRIPTS
	do
		cp "$RELEASE_SCRIPTS_DIR/$script" "$SCRIPTS/"
	done
}

release_security () {
	echo "Releasing security"
	mkdir -p "$SECURITY"

	for security in $RELEASE_SECURITY
	do
		cp "$RELEASE_SECURITY_DIR/$security" "$SECURITY/"
	done

	dir=$( pwd )

	cd "$SECURITY"
	sha256sum * > "security.sha256"
	cd "$dir"
}

release_metadata_about () {
	cat "$REPLICANT_DIR/vendor/replicant/README.mkdn" | awk "/^Replicant$/{replicant=1} /^LineageOS$/{replicant=0} replicant" > "$METADATA/readme.txt"
}

release_metadata_date () {
	date "+%Y-%m-%d" > "$METADATA/date.txt"
}

release_metadata_changelog () {
	cat "$REPLICANT_DIR/vendor/replicant/CHANGELOG.mkdn" \
		| awk "/### .*/{n++} n==1, /### .*/ {n++} n==2" \
		| sed '/===============/q' | tac | sed -e '/===============/,+1d' | tac > "$METADATA/changelog.txt"
}

release_metadata_release () {
	echo "replicant-$RELEASE" > "$METADATA/release.txt"
}

release_metadata_prebuilt () {
	if [ -d "$REPLICANT_DIR/vendor/replicant/prebuilt/common/apps/" ] ; then
		dir=$( pwd )

		cd "$REPLICANT_DIR/vendor/replicant/prebuilt/common/apps/"
		sha256sum *.apk > "$METADATA/prebuilt.sha256"
		cd "$dir"
	fi
}

release_metadata_git () {
	dir=$( pwd )
	cd "$REPLICANT_DIR"

	for git_repo in ".repo/manifests"
	do
		cd $git_repo
		echo "manifest"
		git show --format=oneline -s "replicant-$RELEASE"
		echo ""
		cd "$REPLICANT_DIR"

	done > "$METADATA/git-tags.txt"

	$REPO list -p | while read git_repo
	do
		if ! [ "$git_repo" = "manifest" ]
		then
			cd $git_repo
			echo "$git_repo"
			git show --format=oneline -s $(git describe)
			echo ""
			cd "$REPLICANT_DIR"
		fi
	done >> "$METADATA/git-tags.txt"

	$REPO manifest -r -o "$METADATA/manifest.xml"

	cd "$dir"
}

release_metadata () {
	echo "Releasing metadata"
	mkdir -p "$METADATA"
	release_metadata_git
	release_metadata_prebuilt
	release_metadata_release
	release_metadata_changelog
	release_metadata_date
	release_metadata_about
}

print_help () {
	echo "$SCRIPT: [REPLICANT_DIR] [RELEASE_DIR] (RELEASE_TYPE)"
}

# Check for the correct number of args
if [ "$#"  -lt "$ARGS_COUNT" ]
then
	print_help
	exit 1
fi

REPLICANT_DIR="$(realpath $1)"
RELEASE_DIR="$(realpath $2)"
RELEASE_TYPE="$3"

. releasevars.sh

RELEASE_TOOLS_DIR="$REPLICANT_DIR/out/host/linux-x86/bin"
RELEASE_TOOLS="adb fastboot heimdall mkbootimg unpackbootimg"
RELEASE_IMAGES_DIR="$REPLICANT_DIR/out/dist"
RELEASE_SCRIPTS_DIR=$( dirname "$SCRIPT" )
RELEASE_SCRIPTS="release.sh releasediff.sh releasetag.sh releasevars.sh releasebuild.sh"
RELEASE_SECURITY_DIR="$REPLICANT_DIR/vendor/replicant-security"
RELEASE_SECURITY="media.x509.pem platform.x509.pem releasekey.x509.pem shared.x509.pem"

case "$RELEASE_TYPE" in
	"signatures_tools")
		release_signatures_tools
		;;

	"signatures_images")
		release_signatures_images
		;;

	"signatures")
		release_signatures
		;;

	"images")
		release_images
		;;

	"tools")
		release_tools
		;;

	"scripts")
		release_scripts
		;;

	"security")
		release_security
		;;

	"metadata_about")
		release_metadata_about
		;;

	"metadata_date")
		release_metadata_date
		;;

	"metadata_changelog")
		release_metadata_changelog
		;;

	"metadata_release")
		release_metadata_release
		;;

	"metadata_prebuilt")
		release_metadata_prebuilt
		;;

	"metadata_git")
		release_metadata_git
		;;

	"metadata")
		release_metadata
		;;
	*)
		release_metadata
		release_security
		release_scripts
		release_tools
		release_images
		;;
esac
