57 lines
2.1 KiB
Bash
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
|