diff options
author | Patrick McDermott <patrick.mcdermott@libiquity.com> | 2023-04-20 18:00:46 (EDT) |
---|---|---|
committer | Patrick McDermott <patrick.mcdermott@libiquity.com> | 2023-04-20 18:00:46 (EDT) |
commit | 4a56b33f21acaf84e1e1778debea742e8e23d4b7 (patch) | |
tree | f7787619a237b3467f70dd90128c7ef136d11da0 /scripts | |
parent | 2d03cb276ca8f0675ec620c26fd5d7dfff091e5a (diff) |
build: Add release announcement
Diffstat (limited to 'scripts')
-rwxr-xr-x | scripts/announce-release.sh | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/scripts/announce-release.sh b/scripts/announce-release.sh new file mode 100755 index 0000000..c7f8dea --- /dev/null +++ b/scripts/announce-release.sh @@ -0,0 +1,156 @@ +#!/bin/sh + +set -e + +FROM_NAME='Patrick McDermott' +FROM_EMAIL='patrick.mcdermott@libiquity.com' +SIG="$(cat <<-EOF + Patrick McDermott, CEO + Libiquity + Putting customers in control of high-quality technologies + https://www.libiquity.com/ + EOF + )" +KEY='2250 31F0 47FF E516 63ED 516F 1A45 9ECD E4D6 04BE' +TO_EMAIL='proteanos-dev@lists.proteanos.com' + +package="${1}" +version="${2}" +package_name="${3}" +srcdir="${0%/scripts/announce-release.sh}" + +export GIT_DIR="${srcdir}/.git" + +heading() +{ + local name="${1}" + shift 1 + + printf '%s\n' "${name}" + printf '%s\n' "${name}" | sed 's/./=/g' +} + +about="$(sed -n ' + H; + ${ + g; + s/^\n*[^\n][^\n]*\n[=-][=-]*\n\n*//; + s/\n*[^\n][^\n]*\n[=-][=-]*\n.*$//; + p; + }; + ' "${srcdir}/README")" +news="$(sed -n ' + H; + ${ + g; + s/^\n*[^\n][^\n]*\n[=-][=-]*\n\n*//; + s/^Released: [^\n]*\n\n*//; + s/\n*[^\n][^\n]*\n[=-][=-]*\n.*$//; + p; + }; + ' "${srcdir}/NEWS")" +old_version="$(sed -n "/^${package_name} version /p;" "${srcdir}/NEWS" | \ + sed -n "2{ s/^${package_name} version / Since Version /p; };")" +old_tag="$(git tag --sort=-creatordate | sed -n '2{p;q;}')" +# Empty tree SHA-1 hash: +[ -z "${old_tag}" ] && old_tag='4b825dc642cb6eb9a060e54bf8d69288fbee4904' + +shortlog="$(git shortlog "${old_tag}..HEAD" | \ + sed '/^..*$/s/^//')" +if [ $(printf '%s\n' "${shortlog}" | wc -l) -gt 100 ]; then + shortlog="$(git shortlog -s "${old_tag}..HEAD"; cat <<-EOF + + Commit descriptions suppressed for brevity. To see a log summary with + descriptions, run: + + \$ git shortlog ${old_tag}..${package}/${version} + EOF + )" +fi +diffstat="$(git diff --stat=72 --color=never --find-renames=50% \ + "${old_tag}..HEAD")" +if [ $(printf '%s\n' "${diffstat}" | wc -l) -gt 50 ]; then + diffstat="$(printf '%s\n' "${diffstat}" | tail -n 1; cat <<-EOF + + Difference statistics truncated for brevity. To see full statistics, + run: + + \$ git diff --stat --find-renames=50% \\ + > ${old_tag}..${package}/${version} + EOF + )" +fi + +message="$({ cat | sed 's/=/=3D/g; s/ $/=20/; s/\t$/=09/;'; } <<-EOF + Content-Type: text/plain; charset=UTF-8 + Content-Transfer-Encoding: quoted-printable + + $(heading 'About') + + ${about} + + $(heading 'Downloading') + + Source archives are available from the files site by HTTP or FTP: + + http://files.proteanos.com/pub/${package}/${version}/ + ftp://files.proteanos.com/pub/${package}/${version}/ + + Here are the MD5 checksums: + + $(sed 's/^/ /' MD5SUMS) + + Here are the SHA-256 checksums: + + $(sed 's/^/ /' SHA256SUMS) + + The sources are maintained in a Git repository: + + http://git.proteanos.com/${package}/${package}.git/ + git://git.proteanos.com/${package}/${package}.git/ + + This release is marked by the "${package}/${version}" tag. + + $(heading "NEWS for Version ${version}") + + ${news} + + $(heading "Shortlog of Changes${old_version}") + + ${shortlog} + + $(heading "Diffstat of Changes${old_version}") + + ${diffstat} + + -- + ${SIG} + EOF + )" + +{ sed 's/$/\r/' | /usr/sbin/sendmail -f "${FROM_EMAIL}" \ + "${TO_EMAIL}"; } <<-EOF + Date: $(LC_ALL='POSIX' date '+%a, %d %b %Y %H:%M:%S %z') + From: ${FROM_NAME} <${FROM_EMAIL}> + To: ${TO_EMAIL} + Subject: ${package_name} ${version} released + Message-ID: $(LC_ALL='POSIX' date \ + '+%Y%m%d%H%M%S').${FROM_EMAIL} + Organization: Libiquity LLC + MIME-Version: 1.0 + Content-Type: multipart/signed; micalg=pgp-sha256; boundary="=-=-="; + protocol="application/pgp-signature" + + --=-=-= + ${message} + + --=-=-= + Content-Type: application/pgp-signature + Content-Description: OpenPGP digital signature + + $(printf '%s\n' "${message}" | sed 's/$/\r/' | \ + gpg --local-user "${KEY}" --armor --output - \ + --digest-algo SHA256 --detach-sign) + + --=-=-=-- + EOF |