forked from lix-project/lix
180 lines
4.4 KiB
Text
180 lines
4.4 KiB
Text
|
#!/usr/bin/env nix-shell
|
||
|
#!nix-shell -i bash ../shell.nix -I nixpkgs=channel:nixos-unstable-small
|
||
|
# ^^^^^^^
|
||
|
# Only used for bash. shell.nix goes to the flake.
|
||
|
|
||
|
# --- CONFIGURATION ---
|
||
|
|
||
|
# This does double duty for
|
||
|
# - including rl-next
|
||
|
# - marking where to insert new links (right after)
|
||
|
SUMMARY_MARKER_LINE='{{#include ./SUMMARY-rl-next.md}}'
|
||
|
|
||
|
# --- LIB ---
|
||
|
|
||
|
log() {
|
||
|
echo 1>&2 "release-notes:" "$@"
|
||
|
}
|
||
|
logcmd() {
|
||
|
local cmd="$1"
|
||
|
shift
|
||
|
logcmd2 "$cmd" "${*@Q}" "$cmd" "$@"
|
||
|
}
|
||
|
logcmd2() {
|
||
|
local fakecmd="$1"
|
||
|
local fakeargs="$2"
|
||
|
shift
|
||
|
shift
|
||
|
printf 1>&2 "release-notes: \033[34;1m$fakecmd\033[0m "
|
||
|
echo "$fakeargs" 1>&2
|
||
|
"$@"
|
||
|
}
|
||
|
die() {
|
||
|
# ANSI red
|
||
|
printf 1>&2 "release-notes: \033[31;1merror:\033[0m"
|
||
|
echo 1>&2 "" "$@"
|
||
|
exit 1
|
||
|
}
|
||
|
confirm() {
|
||
|
local answer
|
||
|
echo 1>&2 "$@" "[y/n]"
|
||
|
read -r answer
|
||
|
case "$answer" in
|
||
|
y|Y|yes|Yes|YES)
|
||
|
return 0
|
||
|
;;
|
||
|
n|N|no|No|NO)
|
||
|
return 1
|
||
|
;;
|
||
|
*)
|
||
|
echo 1>&2 "please answer y or n"
|
||
|
confirm "$@"
|
||
|
;;
|
||
|
esac
|
||
|
}
|
||
|
report_done() {
|
||
|
logcmd2 "git" "show" git -c pager.show=false show
|
||
|
printf 1>&2 "release-notes: \033[32;1mdone\033[0m\n"
|
||
|
}
|
||
|
|
||
|
# --- PARSE ARGS ---
|
||
|
|
||
|
if [[ $# -gt 0 ]]; then
|
||
|
die "Release notes takes no arguments, but make sure to set VERSION."
|
||
|
fi
|
||
|
|
||
|
# --- CHECKS ---
|
||
|
|
||
|
if [[ ! -e flake.nix ]] || [[ ! -e .git ]]; then
|
||
|
die "must run in repo root"
|
||
|
exit 1
|
||
|
fi
|
||
|
|
||
|
# repo must be clean
|
||
|
if ! git diff --quiet; then
|
||
|
die "repo is dirty, please commit or stash changes"
|
||
|
fi
|
||
|
|
||
|
if ! git diff --quiet --cached; then
|
||
|
die "repo has staged changes, please commit or stash them"
|
||
|
fi
|
||
|
|
||
|
if ! grep "$SUMMARY_MARKER_LINE" doc/manual/src/SUMMARY.md.in >/dev/null; then
|
||
|
# would have been nice to catch this early, but won't be worth the extra infra
|
||
|
die "SUMMARY.md.in is missing the marker line '$SUMMARY_MARKER_LINE', which would be used for inserting a new release notes page. Please fix the script."
|
||
|
fi
|
||
|
|
||
|
if [[ ! -n "${VERSION:-}" ]]; then
|
||
|
die "please set the VERSION environment variable before invoking this script"
|
||
|
exit 1
|
||
|
fi
|
||
|
|
||
|
# version_major_minor: MAJOR.MINOR
|
||
|
# version_full: MAJOR.MINOR.PATCH
|
||
|
# IS_PATCH: true if this is a patch release; append instead of create
|
||
|
if grep -E '^[0-9]+\.[0-9]+$' <<< "$VERSION" >/dev/null; then
|
||
|
log 'is minor'
|
||
|
IS_PATCH=false
|
||
|
version_full="$VERSION.0"
|
||
|
version_major_minor="$VERSION"
|
||
|
elif grep -E '^[0-9]+\.[0-9]+\.0$' <<< "$VERSION" >/dev/null; then
|
||
|
log 'is minor (.0)'
|
||
|
IS_PATCH=false
|
||
|
version_full="$VERSION"
|
||
|
version_major_minor="$(echo "$VERSION" | sed -e 's/\.0$//')"
|
||
|
elif grep -E '^[0-9]+\.[0-9]+\.[0-9]+$' <<< "$VERSION" >/dev/null; then
|
||
|
log 'is patch'
|
||
|
IS_PATCH=true
|
||
|
version_full="$VERSION"
|
||
|
version_major_minor="$(echo "$VERSION" | sed -e 's/\.[0-9]*$//')"
|
||
|
else
|
||
|
die "VERSION must be MAJOR.MINOR[.PATCH], where each is a number, e.g. 2.20 or 2.20.1 (VERSION was set to $VERSION)"
|
||
|
fi
|
||
|
|
||
|
unset VERSION
|
||
|
|
||
|
log "version_major_minor=$version_major_minor"
|
||
|
log "version_full=$version_full"
|
||
|
log "IS_PATCH=$IS_PATCH"
|
||
|
|
||
|
basename=rl-${version_major_minor}.md
|
||
|
file=doc/manual/src/release-notes/$basename
|
||
|
|
||
|
if ! $IS_PATCH; then
|
||
|
if [[ -e $file ]]; then
|
||
|
die "release notes file $file already exists. If you'd like to make a minor release, pass a patch version, e.g. 2.20.1"
|
||
|
fi
|
||
|
fi
|
||
|
|
||
|
# --- DEFAULTS ---
|
||
|
|
||
|
if [[ ! -n "${DATE:-}" ]]; then
|
||
|
DATE="$(date +%Y-%m-%d)"
|
||
|
log "DATE not set, using $DATE"
|
||
|
fi
|
||
|
|
||
|
case "$DATE" in
|
||
|
[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9])
|
||
|
;;
|
||
|
*)
|
||
|
die "DATE must be YYYY-MM-DD, e.g. 2021-12-31 (DATE was set to $DATE)"
|
||
|
;;
|
||
|
esac
|
||
|
|
||
|
# --- DO THE WORK ---
|
||
|
|
||
|
# menu
|
||
|
title="Release $version_major_minor ($DATE)"
|
||
|
# section on page
|
||
|
section_title="Release $version_full ($DATE)"
|
||
|
|
||
|
(
|
||
|
# TODO add minor number, and append?
|
||
|
echo "# $section_title"
|
||
|
echo
|
||
|
changelog-d doc/manual/rl-next | sed -e 's/ *$//'
|
||
|
) | tee -a $file
|
||
|
|
||
|
log "Wrote $file"
|
||
|
|
||
|
if ! $IS_PATCH; then
|
||
|
NEW_SUMMARY_LINE=" - [$title](release-notes/$basename)"
|
||
|
|
||
|
# find the marker line, insert new link after it
|
||
|
escaped_marker="$(echo "$SUMMARY_MARKER_LINE" | sed -e 's/\//\\\//g' -e 's/ /\\ /g')"
|
||
|
escaped_line="$(echo "$NEW_SUMMARY_LINE" | sed -e 's/\//\\\//g' -e 's/ /\\ /g')"
|
||
|
logcmd sed -i -e "/$escaped_marker/a $escaped_line" doc/manual/src/SUMMARY.md.in
|
||
|
fi
|
||
|
|
||
|
for f in doc/manual/rl-next/*.md; do
|
||
|
if [[ config != "$(basename $f)" ]]; then
|
||
|
logcmd git rm $f
|
||
|
fi
|
||
|
done
|
||
|
|
||
|
logcmd git add $file doc/manual/src/SUMMARY.md.in
|
||
|
logcmd git status
|
||
|
logcmd git commit -m "release notes: $version_full"
|
||
|
|
||
|
report_done
|