#!/usr/bin/env bash # * release # ** Usage set -e usage() { cat <&2 exit 1 elif versionIsPreview "$V"; then echo "$(majorVersionIncrement "$MAJOR")-branch" else echo "$MAJOR-branch" fi } # ** git # Does the named branch exist in this git repo ? gitBranchExists() { B="$1" git branch -l "$B" | grep -q "$B" } # Switch to the named git branch, creating it if it doesn't exist. gitSwitchAutoCreate() { B="$1" if gitBranchExists "$B"; then git switch "$B" else git switch -c "$B" fi } # ** main # Run a command with optional logging ($ECHO), dry-running ($DRY) and pausing ($PAUSE). run() { if [[ -n $PAUSE ]]; then read -rp "pausing, next is: $*" elif [[ -n $ECHO || -n $DRY ]]; then echo "$@" fi if [[ -z $DRY ]]; then "$@"; fi } # Symlink important files temporarily in .relfiles/. relfiles() { echo "linking important release files in .relfiles/ for convenient access..." mkdir -p .relfiles cd .relfiles for f in \ ../stack.yaml \ ../Shake.hs \ ../CHANGELOGS.md \ ../RELEASING.md \ ../CHANGES.md \ ../hledger/CHANGES.md \ ../hledger-ui/CHANGES.md \ ../hledger-web/CHANGES.md \ ../hledger-lib/CHANGES.md \ ../site/src/release-notes.md \ ../site/src/install.md \ ../doc/ANNOUNCE \ ; do ln -sf $f .; done } # Create/switch to appropriate release branch and prepare for release. prep() { VERSION="$1" [[ -z "$VERSION" ]] && usage BRANCH=$(versionReleaseBranch "$VERSION") COMMIT="-c" echo "Switching to $BRANCH, auto-creating it if needed..." run gitSwitchAutoCreate "$BRANCH" echo "Bumping all version strings to $VERSION ..." run ./Shake setversion "$VERSION" $COMMIT echo "Updating all command help texts for embedding..." run ./Shake cmdhelp $COMMIT echo "Updating all dates in man pages..." run ./Shake mandates echo "Generating all the manuals in all formats...." run ./Shake manuals $COMMIT echo "Updating CHANGES.md files with latest commits..." run ./Shake changelogs $COMMIT } # Push the current branch to the CI branches that generate platform binaries. # Assumes the github remote is named "github". bin() { run git push -f github HEAD:binaries } if declare -f "$1" > /dev/null; then "$@"; else usage; fi # ** notes # *** rerunning # **** creates empty doc update commits # **** creates duplicate changelog headings # ***** CHANGES.md's version "1.24.99.1" is not yet tagged, can't list changes