161 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			161 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/usr/bin/env bash
 | |
| # * release
 | |
| # ** Usage
 | |
| 
 | |
| set -e
 | |
| 
 | |
| usage() {
 | |
|     cat <<EOF
 | |
| release - Help prepare a hledger release.
 | |
| Commands:
 | |
| tools/release              - show this help
 | |
| tools/release relfiles     - symlink important files temporarily in .relfiles/
 | |
| tools/release prep VERSION - prepare this release on today's date
 | |
| tools/release bin          - push the current branch to CI to generate binaries
 | |
| 
 | |
| prep does the following:
 | |
| - autocreates and switches to the appropriate release branch
 | |
| - updates all hledger package versions
 | |
| - updates all built-in docs
 | |
| - updates all changelogs
 | |
| VERSION is major (1.25), minor (1.25.1), fixup (1.25.1.1) or preview (1.25.99.1)
 | |
| (see RELEASING.md).
 | |
| 
 | |
| Setting PAUSE=1, ECHO=1, and/or DRY=1 will cause commands to 
 | |
| be run one at a time, logged, or logged without running.
 | |
| EOF
 | |
|     exit
 | |
| }
 | |
| 
 | |
| # ** hledger version numbers
 | |
| 
 | |
| # First 0-2 parts of a dotted version number.
 | |
| versionMajorPart() {
 | |
|   echo "$1" | sed -E 's/([[:digit:]]+(\.[[:digit:]]+)?).*/\1/'  # seriously...
 | |
| }
 | |
| 
 | |
| # Third part of a dotted version number, if any.
 | |
| versionMinorPart() {
 | |
|   echo "$1" | sed -E -e 's/^[[:digit:]]+(\.[[:digit:]]+(\.)?)?//' -e 's/^([[:digit:]]+).*/\1/'
 | |
| }
 | |
| 
 | |
| # Fourth part of a dotted version number, if any.
 | |
| versionFourthPart() {
 | |
|   echo "$1" | sed -E -e 's/^[[:digit:]]+(\.[[:digit:]]+(\.[[:digit:]]+(\.)?))//' -e 's/^([[:digit:]]+).*/\1/'
 | |
| }
 | |
| 
 | |
| # Does this dotted version number have a .99 third part and no fourth part ?
 | |
| versionIsDev() {
 | |
|   V="$1"
 | |
|   test "$(versionMinorPart "$V")" = 99 -a -z "$(versionFourthPart "$V")"
 | |
| }
 | |
| 
 | |
| # Does this dotted version number have a .99 third part and a fourth part ?
 | |
| versionIsPreview() {
 | |
|   V="$1"
 | |
|   test "$(versionMinorPart "$V")" = 99 -a -n "$(versionFourthPart "$V")"
 | |
| }
 | |
| 
 | |
| # Increment a major version number to the next.
 | |
| majorVersionIncrement() {
 | |
|   python3 -c "print($1 + 0.01)"
 | |
| }
 | |
| 
 | |
| # Appropriate release branch name for the given version number.
 | |
| versionReleaseBranch() {
 | |
|   V="$1"
 | |
|   MAJOR=$(versionMajorPart "$V")
 | |
|   if versionIsDev "$V"; then
 | |
|     echo "$V is not a releasable version" >&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.
 | |
| bin() {
 | |
|   run git push -f origin HEAD:ci-windows
 | |
|   run git push -f origin HEAD:ci-mac
 | |
|   run git push -f origin HEAD:ci-linux-x64
 | |
| }
 | |
| 
 | |
| 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
 |