2020-11-21 13:21:37 +02:00
#!/bin/sh
2025-02-24 07:52:59 +02:00
# Copyright (C) 2020-2025 Internet Systems Consortium, Inc. ("ISC")
2020-11-21 13:21:37 +02:00
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
set -eu
# Define some ANSI color codes.
if test -t 1; then
red = '\033[91m'
reset = '\033[0m'
else
red =
reset =
fi
# Print usage.
# Expressions don't expand in single quotes, use double quotes for that. [SC2016]
# shellcheck disable=SC2016
print_usage( ) {
printf \
2025-02-24 08:13:32 +02:00
' Usage: %s { { options} } [ $new_release_tag ]
2020-11-21 13:21:37 +02:00
Options:
[ -d| --debug] enable debug mode, showing every executed command
[ -h| --help] print usage ( this text)
Example:
2025-02-24 08:13:32 +02:00
./tools/bump_lib_versions.sh Kea-1.2.3
2020-11-21 13:21:37 +02:00
' \
" $( basename " ${ 0 } " ) "
}
error( ) {
printf " ${ red } ERROR: %s ${ reset } \\n " " ${ 1 } " 1>& 2
print_usage
exit 1
}
# Parse parameters.
while test ${# } -gt 0; do
case " ${ 1 } " in
# [-d|--debug] enable debug mode, showing every executed command
'-d' | '--debug' ) set -vx ; ;
# [-h|--help] print usage (this text).
'-h' | '--help' ) print_usage; exit 0 ; ;
*)
test -z " ${ new_release_tag +x } " && new_release_tag = ${ 1 } && shift && continue
# Unrecognized argument
error " Unrecognized argument ' ${ 1 } ' " ; ;
esac ; shift
done
is_stable_release( ) {
2020-12-11 20:50:25 +02:00
version_number = $( printf '%s' " ${ 1 } " | cut -d . -f2)
if test $(( version_number % 2 )) -eq 0; then
2020-11-21 13:21:37 +02:00
return 0
else
return 1
fi
}
find_latest_stable_release_tag( ) {
2020-12-11 20:50:25 +02:00
tag_pattern = ${ 1 }
2020-11-21 13:21:37 +02:00
for version in $( git tag | grep -F " ${ tag_pattern } " | tac) ; do
2020-12-07 22:25:28 +02:00
if is_stable_release " ${ version } " ; then
2020-11-21 13:21:37 +02:00
printf '%s' " ${ version } "
return
fi
done
}
2025-02-24 08:13:32 +02:00
old_release_tag = $( git describe --tags HEAD | grep -Eo 'Kea-[0-9]+\.[0-9]+\.[0-9]+' )
if test -z " ${ new_release_tag +x } " ; then
patch_version = $( echo " ${ old_release_tag } " | grep -Eo '[0-9]+$' )
patch_version = $(( patch_version + 1 ))
new_release_tag = $( echo " ${ old_release_tag } " | sed " s/.[0-9]* $/. ${ patch_version } / " )
printf 'No version provided. Assuming that the target version is "%s".' " ${ new_release_tag } "
if test -t 1; then
printf ' Press any key to continue... '
read -r _
fi
printf '\n'
fi
2020-11-21 13:21:37 +02:00
is_old_tag_stable_release = $( is_stable_release " ${ old_release_tag } " && printf true || printf false )
is_new_tag_stable_release = $( is_stable_release " ${ new_release_tag } " && printf true || printf false )
# if any file has changed in a specific library director
# there are 4 possible cases
# 1. old release is stable and new release is stable
2022-08-25 13:57:45 +03:00
# new_version = old_version + 1 (only for updated libs)
2020-11-21 13:21:37 +02:00
# 2. old release is stable and new release is development
2022-08-25 13:57:45 +03:00
# new_version = old_version + 1 (only for updated libs) and + 10 (for all libs)
2020-11-21 13:21:37 +02:00
# 3. old release is development and new release is development
2022-08-25 13:57:45 +03:00
# new_version = old_version + 1 (only for updated libs)
2020-11-21 13:21:37 +02:00
# 4. old release is development and new release is stable
2022-08-25 13:57:45 +03:00
# new_version = old_version + 1 (only for updated libs)
2020-11-21 13:21:37 +02:00
# Get root path.
root_path = $( cd " $( dirname " ${ 0 } " ) /.. " && pwd )
cd " ${ root_path } "
# Check if there are any unstaged changes.
diff = $( git diff 2>& 1)
if test -n " ${ diff } " ; then
2021-01-08 21:12:40 +02:00
printf 'ERROR: stage changes for %s before running this script\n' " ${ root_path } " >& 2
2020-11-21 13:21:37 +02:00
exit 1
fi
increment_extra = 10
increment = 1
2022-08-25 13:57:45 +03:00
major = $( echo " ${ new_release_tag } " | cut -d '-' -f 2 | cut -d '.' -f 1)
middle = $( echo " ${ new_release_tag } " | cut -d '-' -f 2 | cut -d '.' -f 2)
minor = $( echo " ${ new_release_tag } " | cut -d '-' -f 2 | cut -d '.' -f 3)
new_hooks_version = " ${ major } $( printf '%02d' " ${ middle } " ) $( printf '%02d' " ${ minor } " ) "
2020-11-27 18:10:49 +02:00
2025-02-24 07:52:59 +02:00
sed -i'' " s/^\/\/ Version .* of the hooks framework, set for Kea .*/\/\/ Version ${ new_hooks_version } of the hooks framework, set for $( echo " ${ new_release_tag } " | tr '-' ' ' ) / " "src/lib/hooks/hooks.h"
sed -i'' " s/KEA_HOOKS_VERSION.*/KEA_HOOKS_VERSION = ${ new_hooks_version } ;/ " "src/lib/hooks/hooks.h"
2020-11-27 18:10:49 +02:00
2024-06-20 22:25:03 +03:00
for lib in $( git diff --name-only " ${ old_release_tag } " src/lib | cut -d '/' -f 3- | grep -v test | sed " s/\/[^\/]* $// " | sort -uV) ; do
2021-03-26 13:51:56 +02:00
# Skip over files and anything that is not a directory.
if test ! -d " src/lib/ ${ lib } " ; then
continue
fi
2025-02-24 07:52:59 +02:00
# Skip over directories that do not contain a meson.build file.
if test ! -f " src/lib/ ${ lib } /meson.build " ; then
2024-06-20 22:25:03 +03:00
continue
fi
2021-03-26 13:51:56 +02:00
2025-02-24 07:52:59 +02:00
old_version = $( grep -Eo "version: '[0-9.]+'," " src/lib/ ${ lib } /meson.build " | grep -Eo '[0-9.]+' | cut -d '.' -f 1)
2020-11-21 13:21:37 +02:00
new_version = $(( old_version + increment))
2025-02-24 07:52:59 +02:00
sed -i'' " s/version: '.*',/version: ' ${ new_version } .0.0',/ " " src/lib/ ${ lib } /meson.build "
2020-11-21 13:21:37 +02:00
done
2022-08-25 13:57:45 +03:00
if ! ${ is_new_tag_stable_release } && ${ is_old_tag_stable_release } ; then
2024-06-20 22:25:03 +03:00
for lib in $( find 'src/lib' -type d | cut -d '/' -f 3- | grep -v test | sed " s/\/[^\/]* $// " | sort -uV) ; do
2022-08-25 13:57:45 +03:00
# Skip over files and anything that is not a directory.
if test ! -d " src/lib/ ${ lib } " ; then
continue
fi
2025-02-24 07:52:59 +02:00
# Skip over directories that do not contain a meson.build file.
if test ! -f " src/lib/ ${ lib } /meson.build " ; then
2024-06-20 22:25:03 +03:00
continue
fi
2022-08-25 13:57:45 +03:00
2025-02-24 07:52:59 +02:00
old_version = $( grep -Eo "version: '[0-9.]+'," " src/lib/ ${ lib } /meson.build " | grep -Eo '[0-9.]+' | cut -d '.' -f 1)
2022-08-25 13:57:45 +03:00
new_version = $(( old_version + increment_extra))
2025-02-24 07:52:59 +02:00
sed -i'' " s/version: '.*',/version: ' ${ new_version } .0.0',/ " " src/lib/ ${ lib } /meson.build "
2022-08-25 13:57:45 +03:00
done
fi
2022-11-25 23:25:23 +02:00
if ${ is_new_tag_stable_release } ; then
release = 'stable'
else
release = 'development'
fi
2025-05-20 13:56:06 +03:00
author = $( git show -s --format= '%ae' | cut -d '@' -f 1)
branch = $( git branch --show-current)
gitlab_id = $( printf '%s' " ${ branch } " | cut -d '-' -f 1)
echo " \
[ build] ${ author }
2023-02-17 12:27:13 +02:00
The library version numbers have been bumped up for the Kea ${ major } .${ middle } .${ minor }
2022-11-25 23:25:23 +02:00
${ release } release.
2025-05-20 13:56:06 +03:00
( Gitlab #${gitlab_id})" > "./changelog_unreleased/${branch}"