| #!/bin/bash -e -u |
| |
| usage(){ |
| echo >&2 'Usage: release-make [ --release <version> ] [ --next <version> ]' |
| echo >&2 'Creates and tags a release based on the current branch.' |
| echo >&2 'Arguments are optional - if omitted, the script tries to work out the correct versions.' |
| echo >&2 'release <version> should be a full version number, such as 3.6.0-RC1' |
| echo >&2 'next <version> should be a snapshot version number, such as 3.6.0-RC2-SNAPSHOT' |
| echo >&2 'This command will preview what it is going to do and require confirmation before it makes changes.' |
| } |
| |
| [ $# -eq 0 ] && echo >&2 "No arguments given, so I'm going to try and figure it out myself. Invoke with the --help option if you want to find how to invoke this script." |
| |
| release_tag_ver= |
| release_branch_ver= |
| |
| while [ $# -gt 0 ]; do |
| case $1 in |
| --release) shift; release_tag_ver=$1;; |
| --next) shift; release_branch_ver=$1;; |
| *) usage; exit 1;; |
| esac |
| shift |
| done |
| |
| # Some magic to derive the anticipated version of the release. |
| # Use xpath to query the version number in the pom |
| xpath='xpath' |
| type -P $xpath &>/dev/null && { |
| set +e |
| current_version=$( xpath pom.xml '/project/version/text()' 2>/dev/null ) |
| set -e |
| } || { |
| echo "Cannot guess version number as $xpath command not found." |
| } |
| # If the user didn't supply the release version, strip -SNAPSHOT off the current version and use that |
| [ -z "$release_tag_ver" ] && release_tag_ver=${current_version%-SNAPSHOT} |
| |
| # More magic, this time to guess the next version. |
| # If the user didn't supply the next version, modify the digits off the end of the release to increment by one and append -SNAPSHOT |
| [ -z "$release_branch_ver" ] && release_branch_ver=$( echo ${release_tag_ver} | perl -n -e 'if (/^(.*)(\d+)$/) { print $1.($2+1)."-SNAPSHOT\n" }' ) |
| |
| current_branch=$( git name-rev --name-only HEAD ) |
| |
| echo "The release is on the branch: ${current_branch}" |
| echo "The current version (detected) is: ${current_version}" |
| echo "The release version is: ${release_tag_ver}" |
| echo "Development on the release branch continues with version: ${release_branch_ver}" |
| echo -n 'Enter "y" if this is correct, anything else to abort: ' |
| read input |
| [ "$input" == "y" ] || { echo >&2 Aborted. ; exit 1 ; } |
| |
| # Warn if the current branch is master |
| [ ${current_branch} == "master" ] && { |
| echo Current branch is ${current_branch}. Usually, releases are made from a release branch. |
| echo -n 'Enter "y" if this is correct, anything else to abort: ' |
| read input |
| [ "$input" == "y" ] || { echo >&2 Aborted. ; exit 1 ; } |
| } |
| |
| # Release prepare |
| mvn release:clean release:prepare -PExample,Launcher,Four,Three --batch-mode -DautoVersionSubmodules=true -DreleaseVersion=${release_tag_ver} -DdevelopmentVersion=${release_branch_ver} |
| |
| # Release perform |
| mvn release:perform -PExample,Launcher,Four,Three --batch-mode |