Files
SimpleBLE/scripts/check_version.sh
Kevin Dewald c6edaa8221 Fix version
2025-05-29 11:25:02 -07:00

119 lines
4.3 KiB
Bash
Executable File

#!/bin/bash
validate_version_format() {
local version_file_content=$1
echo "- VERSION file format? ($version_file_content)"
if [[ ! "$version_file_content" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
echo " FAIL, format should be major.minor.patch"
return 1
else
echo " OK"
return 0
fi
}
check_tag_version_match() {
local current_commit_tag=$1
local version_file=$2
local last_tag=$3
if [[ -n "$current_commit_tag" ]]; then
# Current commit is tagged
echo "- Git tag consistent with VERSION file?"
if [[ "$current_commit_tag" == "$version_file" ]]; then
echo " OK"
return 0
else
echo " FAIL Tag ($current_commit_tag) does not match VERSION file content ($version_file)."
return 1
fi
else
# Current commit is not tagged, so VERSION file must have been increased manually
# Lets check...
local smallest_tag=$(printf '%s\n' "$version_file" "$last_tag" | sort -V | head -n1)
echo "- VERSION file ($version_file) bumped after last released tag ($last_tag)?"
if [[ "$last_tag" == "$version_file" || "$smallest_tag" == "$version_file" ]]; then
echo " FAIL Version in development should be greater than the last tag, did you forget to bump it?"
return 1
else
echo " OK"
return 0
fi
fi
}
# Function to check if Cargo.toml version matches the VERSION file
check_cargo_version_match() {
local version_file=$1
# Extract the version line from Cargo.toml
local cargo_version=$2
echo "- Cargo.toml consistent with VERSION file?"
if [[ "$cargo_version" == "$version_file"* ]]; then
echo " OK"
return 0
else
echo " FAIL Cargo.toml version ($cargo_version) does not match VERSION file content ($version_file)."
return 1
fi
}
check_changelog() {
local current_commit_tag=$1
if [[ -n "$current_commit_tag" ]]; then
echo "- Release tag found in changelog?"
if grep -q "$current_commit_tag" docs/changelog.rst; then
echo " OK"
return 0
else
echo " FAIL, did you forgot to update changelog?"
return 1
fi
fi
}
###############################################################################
# Test logic
assert_return_value() {
local command="$1"
local expected=$2
local description="$3"
# Run command and redirect output to /dev/null
eval "$command" > /dev/null 2>&1
local actual=$?
if [ $actual -ne $expected ]; then
echo "UNIT TEST FAILED: $command (expected: $expected, got: $actual) Check code logic"
return 1
fi
}
assert_return_value 'validate_version_format "1.1"' 1 || exit 1
assert_return_value 'validate_version_format "1.1.1"' 0 || exit 1
assert_return_value 'check_cargo_version_match "1.1.1" "1.1.2"' 1 || exit 1
assert_return_value 'check_cargo_version_match "1.1.1" "1.1.1"' 0 || exit 1
assert_return_value 'check_cargo_version_match "1.1.1" "1.1.1-dev1"' 0 || exit 1
assert_return_value 'check_cargo_version_match "1.1.1" "1.1.2-dev1"' 1 || exit 1
assert_return_value 'check_tag_version_match "1.1.1" "1.1.2" "1.1.1"' 1 || exit 1
assert_return_value 'check_tag_version_match "1.1.1" "1.1.1" "1.1.1"' 0 || exit 1
assert_return_value 'check_tag_version_match "" "1.1.1" "1.1.1"' 1 || exit 1
assert_return_value 'check_tag_version_match "" "1.1.0" "1.1.1"' 1 || exit 1
assert_return_value 'check_tag_version_match "" "1.1.2" "1.1.1"' 0 || exit 1
assert_return_value 'check_changelog "1.1.9" ' 1 || exit 1
assert_return_value 'check_changelog "0.7.0" ' 0 || exit 1
assert_return_value 'check_changelog "" ' 0 || exit 1
###############################################################################
# Perform checks with real repository versions
current_tag=$(git describe --exact-match --tags HEAD 2>/dev/null | sed 's/^v//')
latest_tag=$(git describe --tags --abbrev=0 | sed 's/^v//')
version_file=$(cat VERSION)
cargo_version=$(grep '^version = ' Cargo.toml | sed 's/version = "\(.*\)"/\1/')
validate_version_format "$version_file" || exit 1
check_cargo_version_match "$version_file" "$cargo_version" || exit 1
check_tag_version_match "$current_tag" "$version_file" "$latest_tag" || exit 1
check_changelog "$current_tag"