#!/usr/bin/env bash
# SPDX-License-Identifier: GPL-2.0-only
# ${VERSION_NAME}: new version name
# ${COMMIT_ID}: commit id (if not master)
# ${USERNAME}: username (if not default to https)
# ${GPG_KEY_ID}: gpg key id (if not don't sign)
VERSION_NAME=$1
COMMIT_ID=$2
USERNAME=$3
GPG_KEY_ID=$4

set -e

if [ -z "$GPG_TTY" ]; then
	export GPG_TTY=$(tty)
fi

# set local + tz to be reproducible
LC_ALL=C
LANG=C
TZ=UTC0
export LC_ALL LANG TZ

if [ -z "$VERSION_NAME" ] || [ "$VERSION_NAME" = "--help" ] || [ -z "$COMMIT_ID" ]; then
	echo "usage: $0 <version> <commit id> [username] [gpg key id]"
	echo "Tags a new coreboot version and creates a tar archive"
	echo
	echo "version:    New version name to tag the tree with"
	echo "commit id:  check out this commit-id after cloning the coreboot tree"
	echo "username:   clone the tree using ssh://USERNAME - defaults to https://"
	echo "gpg key id: used to tag the version, and generate a gpg signature"
	exit 1
fi

# Verify that tar supports --sort
if ! tar --sort=name -cf /dev/null /dev/null 2>/dev/null ; then
	echo "Error: The installed version of tar does not support --sort"
	echo "       GNU tar version 1.28 or greater is required.  Exiting."
	exit 1
fi

if [ ! -d "coreboot-${VERSION_NAME}" ]; then
	if [ -d .git ]; then
		GIT_REF_OPTS="--reference . --dissociate"
	elif [ -d ../../.git ]; then
		GIT_REF_OPTS="--reference ../.. --dissociate"
	fi
	if [ -n "${USERNAME}" ]; then
		git clone ${GIT_REF_OPTS} "ssh://${USERNAME}@review.coreboot.org:29418/coreboot.git" "coreboot-${VERSION_NAME}"
	else
		git clone ${GIT_REF_OPTS} https://review.coreboot.org/coreboot.git "coreboot-${VERSION_NAME}"
	fi
fi

cd "coreboot-${VERSION_NAME}" || exit 1
if [ -n "$COMMIT_ID" ]; then
	git reset --hard "$COMMIT_ID"
fi

util/crossgcc/buildgcc -W > .crossgcc-version

git submodule update --init --checkout
if [ -n "$GPG_KEY_ID" ]; then
	git tag -a -s -u "$GPG_KEY_ID" --force "$VERSION_NAME" -m "coreboot version $VERSION_NAME"
else
	git tag -a --force "$VERSION_NAME" -m "coreboot version $VERSION_NAME"
fi

printf "%s-%s\n" "$VERSION_NAME"  "$(git log --pretty=%h|head -1)" > .coreboot-version
tstamp=$(git log --pretty=format:%ci -1)
cd ..

exclude_paths="3rdparty/blobs "
exclude_paths+="3rdparty/fsp "
exclude_paths+="3rdparty/intel-microcode "
exclude_paths+="3rdparty/amd_blobs "
exclude_paths+="3rdparty/qc_blobs "

for i in ${exclude_paths}; do
	blobs_paths+="coreboot-${VERSION_NAME}/${i} "
	exclude_opts+="--exclude=coreboot-${VERSION_NAME}/${i} "
done

tar --sort=name --mtime="$tstamp" --owner=coreboot:1000 --group=coreboot:1000 --exclude=*/.git --exclude=*/.gitignore ${exclude_opts} -cvf - "coreboot-${VERSION_NAME}" |xz -9 > "coreboot-${VERSION_NAME}.tar.xz"
tar --sort=name --mtime="$tstamp" --owner=coreboot:1000 --group=coreboot:1000 --exclude=*/.git --exclude=*/.gitignore -cvf - ${blobs_paths} |xz -9 > "coreboot-blobs-${VERSION_NAME}.tar.xz"

if [ -n "${GPG_KEY_ID}" ]; then
	gpg --armor --local-user "$GPG_KEY_ID" --output "coreboot-${VERSION_NAME}.tar.xz.sig" --detach-sig "coreboot-${VERSION_NAME}.tar.xz"
	gpg --armor --local-user "$GPG_KEY_ID" --output "coreboot-blobs-${VERSION_NAME}.tar.xz.sig" --detach-sig "coreboot-blobs-${VERSION_NAME}.tar.xz"
fi
