fix: fix current version comparison logic for pre-releases (#7946)

Signed-off-by: liyang <daviderli614@gmail.com>
This commit is contained in:
liyang
2026-04-10 16:37:52 +08:00
committed by GitHub
parent 59021ce83b
commit a53a0d57ad

View File

@@ -30,13 +30,72 @@ CLEAN_LATEST=$(echo "$LATEST_VERSION" | sed 's/^v//' | sed 's/-nightly-.*//')
echo "Current version: $CLEAN_CURRENT"
echo "Latest release version: $CLEAN_LATEST"
# Use sort -V to compare versions
HIGHER_VERSION=$(printf "%s\n%s" "$CLEAN_CURRENT" "$CLEAN_LATEST" | sort -V | tail -n1)
# Function to extract base version (without pre-release suffix)
get_base_version() {
echo "$1" | sed -E 's/-(alpha|beta|rc|pre).*//'
}
if [ "$HIGHER_VERSION" = "$CLEAN_CURRENT" ]; then
# Function to check if a version is pre-release
is_prerelease() {
[[ "$1" =~ -(alpha|beta|rc|pre) ]]
}
# Compare versions properly considering pre-release
compare_versions() {
local current=$1
local latest=$2
# Extract base versions
local current_base=$(get_base_version "$current")
local latest_base=$(get_base_version "$latest")
# Compare base versions first
HIGHER_BASE=$(printf "%s\n%s" "$current_base" "$latest_base" | sort -V | tail -n1)
if [ "$HIGHER_BASE" = "$latest_base" ] && [ "$current_base" != "$latest_base" ]; then
# Latest has higher base version
echo "current_older"
return
elif [ "$HIGHER_BASE" = "$current_base" ] && [ "$current_base" != "$latest_base" ]; then
# Current has higher base version
echo "current_newer"
return
fi
# Base versions are equal, compare pre-release status
if [ "$current_base" = "$latest_base" ]; then
# If current is pre-release and latest is not, current is older
if is_prerelease "$current" && ! is_prerelease "$latest"; then
echo "current_older"
return
fi
# If latest is pre-release and current is not, current is newer
if ! is_prerelease "$current" && is_prerelease "$latest"; then
echo "current_newer"
return
fi
fi
# Both are same type or different base versions already handled, use sort -V
HIGHER_VERSION=$(printf "%s\n%s" "$current" "$latest" | sort -V | tail -n1)
if [ "$HIGHER_VERSION" = "$current" ]; then
echo "current_newer_or_equal"
else
echo "current_older"
fi
}
RESULT=$(compare_versions "$CLEAN_CURRENT" "$CLEAN_LATEST")
if [ "$RESULT" = "current_newer" ] || [ "$RESULT" = "current_newer_or_equal" ]; then
echo "Current version ($CLEAN_CURRENT) is NEWER than or EQUAL to latest ($CLEAN_LATEST)"
echo "is-current-version-latest=true" >> $GITHUB_OUTPUT
if [ -n "$GITHUB_OUTPUT" ]; then
echo "is-current-version-latest=true" >> $GITHUB_OUTPUT
fi
else
echo "Current version ($CLEAN_CURRENT) is OLDER than latest ($CLEAN_LATEST)"
echo "is-current-version-latest=false" >> $GITHUB_OUTPUT
if [ -n "$GITHUB_OUTPUT" ]; then
echo "is-current-version-latest=false" >> $GITHUB_OUTPUT
fi
fi