summaryrefslogtreecommitdiffstats
path: root/scripts
diff options
context:
space:
mode:
authorPatrick 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)
commit4a56b33f21acaf84e1e1778debea742e8e23d4b7 (patch)
treef7787619a237b3467f70dd90128c7ef136d11da0 /scripts
parent2d03cb276ca8f0675ec620c26fd5d7dfff091e5a (diff)
build: Add release announcement
Diffstat (limited to 'scripts')
-rwxr-xr-xscripts/announce-release.sh156
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