#!/bin/sh set -eu PROJECT_UC= while getopts 'd:V:n:N:m:' flag; do case "$flag" in d) DATE="$OPTARG" ;; V) VVERSION="v$OPTARG" ;; n) PROJECT="$OPTARG" ;; N) PROJECT_UC="$OPTARG" ;; m) MAILING_LIST="$OPTARG" ;; *) exit 2 ;; esac done shift $((OPTIND - 1)) assert_arg() { if [ -z "$1" ]; then echo "Missing $2" >&2 exit 2 fi } assert_arg "${DATE:-}" '-d DATE' assert_arg "${VVERSION:-}" '-V VERSION' assert_arg "${PROJECT:-}" '-n PROJECT' assert_arg "${MAILING_LIST:-}" '-m MAILING_LIST' if [ -z "${PROJECT_UC:-}" ]; then PROJECT_UC="$PROJECT" fi if [ "$(git rev-parse --abbrev-ref HEAD)" != 'main' ]; then echo 'Not on branch "main".' >&2 exit 1 fi if git show "$VVERSION" 1>/dev/null 2>/dev/null; then echo "Version '$VVERSION' already exists." >&2 exit 1 fi if ! printf '%s\n%s\n' "$(git tag)" "$VVERSION" | sort -nct. -k1 -k2 -k3; then echo 'New tag is not bigger than existing ones.' >&2 exit 1 fi if [ "$DATE" != "$(git log -1 --format=%cd --date=short HEAD)" ]; then echo "Date '$DATE' is not up-to-date." >&2 exit 1 fi if [ "Release $VVERSION" != "$(git log --format=%B -1 HEAD | head -n1)" ]; then echo "Commit message isn't 'Release $VVERSION'." >&2 exit 1 fi make clean public dev-check EXTRA_VERSION="$VVERSION" if ! (git diff --quiet && git diff --quiet --staged); then echo 'Dirty repository.' exit 1 fi git tag "$VVERSION" sh aux/workflow/sign-tarballs.sh -n "$PROJECT" printf 'Publish version? [Y/n]: ' >&2 read -r publish if [ "$publish" = 'n' ]; then cat <&2 Now push the tag and the signature before pushing the commit: git push origin refs/notes/signatures/tar.gz -o skip-ci --no-verify git push --tags -o skip-ci --no-verify git push EOF else git push origin refs/notes/signatures/tar.gz -o skip-ci --no-verify git push --tags -o skip-ci --no-verify git push fi