#!/usr/bin/env bash

#
#  helper script: generate deblobbed stable u-boot source code releases
#
#	Copyright (C) 2020,2021 Leah Rowe <info@minifree.org>
#	Copyright (C) 2022 Denis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org>
#	Copyright (C) 2022 Alper Nebi Yasak <alpernebiyasak@gmail.com>
#
#    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/>.
#

[ "x${DEBUG+set}" = 'xset' ] && set -v
set -u -e

revision="r2"

supported_uboot_versions=" \
	2021.07 \
	2022.07 \
"

topdir="$(realpath $(dirname $(realpath $0))/../../../../)"
uboot_release_topdir="${topdir}/release/u-boot-libre"

release_files=""

usage()
{
	progname="resources/scripts/build/release/u-boot-libre"

	printf "Usage:\n"
	printf "\t%s                  # %s\n" \
	       "${progname}" \
	       "Release deblobbed u-boot tarballs for all supported versions"
	printf "\t%s [version]        # %s\n" \
	       "${progname}" \
	       "Release deblobbed u-boot tarballs for the given versions"
	printf "\t%s --list-versions  # %s\n" \
	       "${progname}" \
	       "List supported u-boot versions"
	printf "\t%s --help           # %s\n" \
	       "${progname}" \
	       "Prints this help"
}

append_release_file()
{
	if [ -z "${release_files}" ] ; then
		release_files="${release_files}$1"
	else
		release_files="${release_files} $1"
	fi
}

append_release_files()
{
	for file in "$@" ; do
		append_release_file "${file}"
	done
}

print_release_files()
{
	version="$1"
	printf "Source code archives for u-boot-libre-%s-%s available at:\n" \
	       "${version}" "${revision}"

	for file in ${release_files} ; do
		printf "\t${file}\n"
	done
}

release_deblobbed_uboot()
{
	version="$1"

	release_version_dir="${uboot_release_topdir}/${version}-${revision}"
	tmpdir="${release_version_dir}/u-boot-libre-${version}-${revision}"
	tarball="${tmpdir}.tar"

	printf "Building source code archive, version %s revision %s\n" \
	       "${version}" "${revision}"

	cd "${topdir}"
	"${topdir}/download" u-boot "v${version}"

	rm -rf \
	   "${tmpdir}/" \
	   "${tarball}" \
	   "${tarball}.lz" \
	   "${tarball}.xz"

	mkdir -p "$(dirname ${tmpdir})"
	cp -R "u-boot/v${version}/" "${tmpdir}"

	rm -rf ${tmpdir}/.git ${tmpdir}/.gitignore
	make -C ${tmpdir} distclean

	prefix="$(dirname ${tmpdir} | sed 's#^/*##')/"
	tar cf "${tarball}" "${tmpdir}" \
	    --transform="s#${prefix}##" \
	    --format=gnu \
	    --sort=name \
	    --owner=0 --group=0 --numeric-owner \
	    --mtime="@${SOURCE_DATE_EPOCH:-0}" \

	lzip -9 --keep -vv "${tarball}"
	xz   -9 --keep -vv "${tarball}"

	rm -rf "${tmpdir}/"

	append_release_files \
	       "${tarball}" \
	       "${tarball}.lz" \
	       "${tarball}.xz"
}

release_uboot_blobs_list()
{
	version="$1"

	blobs_list="$(${topdir}/download u-boot --blobs-list v${version})"

	release_version_dir="${uboot_release_topdir}/${version}-${revision}"
	destination="${release_version_dir}/blobs-${version}-${revision}.list"

	cd "${topdir}"

	rm -rf \
	   "${destination}" \
	   "${destination}.lz" \
	   "${destination}.xz"

	install -m 755 -d "${release_version_dir}"
	install -m 644 -T "${blobs_list}" "${destination}"

	lzip -9 --keep -vv "${destination}"
	xz   -9 --keep -vv "${destination}"

	append_release_files \
	    "${destination}" \
	    "${destination}.lz" \
	    "${destination}.xz"
}

release_uboot_deblob_script()
{
	version="$1"

	deblob_script="$(${topdir}/download u-boot --gen-deblob-script v${version})"

	release_version_dir="${uboot_release_topdir}/${version}-${revision}"
	destination="${release_version_dir}/deblob-${version}-${revision}.sh"

	cd "${topdir}"

	rm -rf \
	   "${destination}" \
	   "${destination}.lz" \
	   "${destination}.xz"

	install -m 755 -d "${release_version_dir}"
	install -m 644 -T "${deblob_script}" "${destination}"

	lzip -9 --keep -vv "${destination}"
	xz   -9 --keep -vv "${destination}"

	append_release_files \
	    "${destination}" \
	    "${destination}.lz" \
	    "${destination}.xz"
}

if [ $# -eq 0 ] ; then
	for version in ${supported_uboot_versions} ; do
		release_deblobbed_uboot "${version}"
		release_uboot_blobs_list "${version}"
		release_uboot_deblob_script "${version}"
		print_release_files "${version}"
	done
	exit 0
elif [ $# -eq 1 -a "$1" == "--help" ] ; then
	usage
	exit 0
elif [ $# -eq 1 -a "$1" == "--list-versions" ] ; then
	for version in ${supported_uboot_versions} ; do
		printf "${version}\n"
	done
	exit 0
elif [ $# -eq 1 ] ; then
	found=0
	for revision in ${supported_uboot_revisions} ; do
		if [ "${revision}" = "$1" ] ; then
			release_deblobbed_uboot "$1"
			release_uboot_blobs_list "$1"
			release_uboot_deblob_script "$1"
			print_release_files "$1"
			exit 0
		fi
	done

	printf "Error: Version '${1}' is not supported\n"

	exit 1
fi

exit 0