;tools: release
This commit is contained in:
		
							parent
							
								
									757c548c17
								
							
						
					
					
						commit
						b71680dffd
					
				
							
								
								
									
										126
									
								
								tools/release
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										126
									
								
								tools/release
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,126 @@ | |||||||
|  | #!/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 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 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | # Create/switch to appropriate release branch and prepare for release. | ||||||
|  | prep() { | ||||||
|  |   VERSION="$1" | ||||||
|  |   [[ -z "$VERSION" ]] && usage | ||||||
|  |   BRANCH=$(versionReleaseBranch "$VERSION") | ||||||
|  |   COMMIT="-c" | ||||||
|  |   run gitSwitchAutoCreate "$BRANCH" | ||||||
|  |   run ./Shake setversion "$VERSION" $COMMIT | ||||||
|  |   run ./Shake cmdhelp $COMMIT | ||||||
|  |   run ./Shake mandates | ||||||
|  |   run ./Shake manuals $COMMIT | ||||||
|  |   run ./Shake changelogs $COMMIT | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | # Push the current branch to the CI branches that generate platform binaries. | ||||||
|  | bin() { | ||||||
|  |   run git push -f origin master:ci-windows | ||||||
|  |   run git push -f origin master:ci-mac | ||||||
|  |   run git push -f origin master:ci-linux-x64 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | if declare -f "$1" > /dev/null; then "$@"; else usage; fi | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user