forked from loafle/openapi-generator-original
* Release versioning script with marker tags. Introduces bump.sh which supports moving from version to version but only within delimiting marker tags in the target file. This script currently doesn't do validations or anything fancy. * Allow bumping version according to type (major,minor,build,revision) * bump.sh will display error if file contents are unchanged
222 lines
5.6 KiB
Bash
Executable File
222 lines
5.6 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
#
|
|
# This script bumps from one version to another
|
|
#
|
|
# Copyright 2018 OpenAPI-Generator Contributors (https://openapi-generator.tech)
|
|
#
|
|
# Licensed 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.
|
|
#
|
|
|
|
declare -r version_regex="([0-9]+).([0-9]+).([0-9]+)-?(SNAPSHOT){0,1}"
|
|
declare start="<!-- RELEASE_VERSION -->"
|
|
declare end="<!-- \/RELEASE_VERSION -->"
|
|
declare from="${version_regex}"
|
|
declare to=""
|
|
declare debug=${debug:-false}
|
|
declare -a from_parts=()
|
|
declare -a to_parts=()
|
|
declare -ar inc=(major minor build snapshot)
|
|
|
|
USAGE="
|
|
USAGE: $0 OPTIONS input_file
|
|
|
|
This script will bump a version number (or other value) between marker tags.
|
|
|
|
OPTIONS:
|
|
-f The 'from' version
|
|
-t The 'to' version
|
|
-s The start tag regex
|
|
default: $start
|
|
-e The end tag regex
|
|
default: $end
|
|
-i Increase by one of: ${inc[@]}
|
|
-h Print this message
|
|
|
|
EXAMPLES:
|
|
|
|
Update to next snapshot version:
|
|
$0 -f 3.0.0 -t 3.0.1-SNAPSHOT pom.xml
|
|
Update build version only (useful for docs)
|
|
$0 -f 3.0.0 -t 3.0.1 pom.xml
|
|
Update from any version to any other version
|
|
$0 -f 1.2.3 -t 9.9.9-SNAPSHOT pom.xml
|
|
Customize the start/end tags
|
|
$0 -f 1.0.0 1.0.1-SNAPSHOT -s \"<!-- START -->\" -e \"<!-- END -->\" pom.xml
|
|
"
|
|
|
|
|
|
## print an error message and exit
|
|
err() {
|
|
>&2 echo -e "$1"
|
|
exit 1
|
|
}
|
|
|
|
## debug log messages. Run with debug=true ./bump.sh
|
|
d() {
|
|
if [[ true = "${debug}" ]]; then
|
|
echo "$1"
|
|
fi
|
|
}
|
|
|
|
## outputs usage and exits
|
|
usage()
|
|
{
|
|
err "${USAGE}"
|
|
exit 1
|
|
}
|
|
|
|
## usage: version input extracted_array
|
|
## - Checks that 'input' is a valid version
|
|
## - Extracts the version parts into 'extracted_array'
|
|
version()
|
|
{
|
|
if [[ "$#" -ne 2 ]]; then
|
|
err "Call function version with two parameters: version string arr"
|
|
fi
|
|
local v=$1
|
|
if [[ "${v}" =~ $version_regex ]]; then
|
|
local major=${BASH_REMATCH[1]}
|
|
local minor=${BASH_REMATCH[2]}
|
|
local build=${BASH_REMATCH[3]}
|
|
local snapshot=false
|
|
if [[ "SNAPSHOT" = "${BASH_REMATCH[4]}" ]]; then
|
|
snapshot=true
|
|
fi
|
|
|
|
d "major=$major minor=$minor build=$build snapshot=$snapshot"
|
|
|
|
eval "$2=(${major} ${minor} ${build} ${snapshot})"
|
|
else
|
|
err "Invalid version: $v"
|
|
fi
|
|
}
|
|
|
|
while getopts "hf:t:s:e:i:" OPTION
|
|
do
|
|
case ${OPTION} in
|
|
f)
|
|
from=${OPTARG}
|
|
;;
|
|
t)
|
|
to=${OPTARG}
|
|
;;
|
|
s)
|
|
start=${OPTARG}
|
|
;;
|
|
e)
|
|
end=${OPTARG}
|
|
;;
|
|
i)
|
|
increase=${OPTARG}
|
|
if [[ ! "${inc[@]}" =~ ${increase} ]];then
|
|
err "Only support increasing by one of: ${inc[@]}"
|
|
fi
|
|
;;
|
|
h)
|
|
usage
|
|
;;
|
|
esac
|
|
done
|
|
|
|
shift $((OPTIND-1))
|
|
file=( "$@" )
|
|
|
|
if [[ ${#file[@]} -eq 0 ]];then
|
|
echo "No file specified" >&2
|
|
usage
|
|
fi
|
|
|
|
if [[ -z "${from}" ]]; then
|
|
echo "No 'from' version specified." >&2
|
|
usage
|
|
fi
|
|
|
|
# TODO: compare steps in from_parts and to_parts.
|
|
version "${from}" from_parts
|
|
|
|
if [[ -z "${to}" ]]; then
|
|
if [[ -z "${increase}" ]]; then
|
|
err "No 'to' version specified."
|
|
else
|
|
case ${increase} in
|
|
major)
|
|
to="$(( ${from_parts[0]} + 1 )).0.0"
|
|
version "$to" to_parts
|
|
;;
|
|
minor)
|
|
to="${from_parts[0]}.$(( ${from_parts[1]} + 1 )).0"
|
|
version "$to" to_parts
|
|
;;
|
|
build)
|
|
to="${from_parts[0]}.${from_parts[1]}.$(( ${from_parts[2]} + 1 ))"
|
|
version "$to" to_parts
|
|
;;
|
|
snapshot)
|
|
if [[ true = ${from_parts[3]} ]]; then
|
|
err "Can't move from SNAPSHOT to SNAPSHOT (from=${from})."
|
|
else
|
|
to="${from_parts[0]}.${from_parts[1]}.$(( ${from_parts[2]} + 1 ))-SNAPSHOT"
|
|
version "$to" to_parts
|
|
fi
|
|
;;
|
|
esac
|
|
fi
|
|
else
|
|
version "${to}" to_parts
|
|
fi
|
|
|
|
if [[ ${from_parts[3]} = true && ${to_parts[3]} = true ]]; then
|
|
err "Moving from SNAPSHOT to SNAPSHOT is not supported."
|
|
fi
|
|
|
|
cat <<EOF > sedscript.sed
|
|
/${start}/,/${end}/{
|
|
s/${from}/${to}/g
|
|
}
|
|
EOF
|
|
|
|
d "Moving from=${from} to=${to}"
|
|
|
|
trap 'rm -f sedscript.sed' EXIT
|
|
|
|
sed_cross() {
|
|
# Cross-platform sed invocation. OSX has no option to show a version number in sed.
|
|
local target=$1
|
|
sed --version >/dev/null 2>&1 && sed -e -i '' -f sedscript.sed "$target" || sed -i '' -E -f sedscript.sed "$target"
|
|
}
|
|
|
|
update_file() {
|
|
local filename=$1
|
|
local error_message="ERROR: Failed to update $filename to target version ${to}"
|
|
local original_hash=$(ruby -r digest -e "p Digest::SHA2.file(\"$filename\").hexdigest")
|
|
local final_hash=""
|
|
if ! sed_cross ${filename}; then
|
|
# occurs if, for example, the file doesn't exist.
|
|
echo "ERROR: Failed to update $filename to target version ${to}" >&2
|
|
fi
|
|
|
|
local final_hash=$(ruby -r digest -e "p Digest::SHA2.file(\"$filename\").hexdigest")
|
|
|
|
if [[ "${original_hash}" = "${final_hash}" ]]; then
|
|
# occurs if, for example, the file doesn't have expected marker tags for replacement
|
|
echo "ERROR: $filename was not modified." >&2
|
|
else
|
|
echo "Updated $filename successfully!"
|
|
fi
|
|
}
|
|
|
|
for filename in "${file[@]}"; do
|
|
update_file ${filename}
|
|
done
|
|
|