Files

57 lines
2.1 KiB
Bash

#!/bin/sh
# Release markers refer to source commits, not Maven's workspace version edits.
set -eu
mode=${1:-}
version=${2:-}
tag="portal-release-$version"
if [ -z "$version" ] || ! git check-ref-format "refs/tags/$tag"; then
echo 'Usage: sh scripts/release-notes.sh generate|publish VERSION' >&2
exit 1
fi
commit=$(git rev-parse HEAD)
case "$mode" in
generate)
# Fetch failures must not masquerade as a first release.
if [ "$(git rev-parse --is-shallow-repository)" = true ]; then
git fetch --unshallow origin
fi
git fetch origin 'refs/tags/portal-release-*:refs/tags/portal-release-*'
previous=$(git describe --tags --abbrev=0 --match 'portal-release-*' --exclude "$tag" HEAD 2>/dev/null || true)
range=HEAD
if [ -n "$previous" ]; then
range="$previous..HEAD"
fi
changes=$(git log --reverse --format='- %s (`%h`)' "$range" --)
printf '# Changes in %s\n\nSource commit: `%s`\n\n' "$version" "$commit"
if [ -n "$previous" ]; then
printf 'Since release tag `%s` (nearest release in this branch history).\n\n' "$previous"
else
printf 'First recorded release: includes all available source history.\n\n'
fi
if [ -n "$changes" ]; then
printf '%s\n' "$changes"
else
printf 'No source changes since the previous release.\n'
fi
;;
publish)
if git show-ref --verify --quiet "refs/tags/$tag"; then
if [ "$(git rev-parse "refs/tags/$tag^{commit}")" != "$commit" ]; then
echo "Release tag $tag already identifies another commit" >&2
exit 1
fi
else
git -c user.name='Jenkins' -c user.email='jenkins@locusworks.net' \
tag -a "$tag" "$commit" -m "Release $version"
fi
# Never overwrite a remote release marker.
git push origin "refs/tags/$tag:refs/tags/$tag"
;;
*)
echo 'Usage: sh scripts/release-notes.sh generate|publish VERSION' >&2
exit 1
;;
esac