| #!/bin/bash -e -u |
| # |
| # Licensed to the Apache Software Foundation (ASF) under one |
| # or more contributor license agreements. See the NOTICE file |
| # distributed with this work for additional information |
| # regarding copyright ownership. The ASF licenses this file |
| # to you under the Apache License, Version 2.0 (the |
| # "License"); you may not use this file except in compliance |
| # with the License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, |
| # software distributed under the License is distributed on an |
| # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| # KIND, either express or implied. See the License for the |
| # specific language governing permissions and limitations |
| # under the License. |
| # |
| |
| 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 |