blob: 7abc966d0ca1585ed83e75b8652e4bfc440c0430 [file] [log] [blame]
#!/bin/bash
# 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.
set -euo pipefail
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# Default mode
MODE=""
# Parse arguments
while [[ $# -gt 0 ]]; do
case $1 in
--check)
MODE="check"
shift
;;
--fix)
MODE="fix"
shift
;;
--help|-h)
echo "Usage: $0 [--check|--fix]"
echo ""
echo "Sync Python SDK version between Cargo.toml and pyproject.toml"
echo ""
echo "Options:"
echo " --check Check if versions are synchronized"
echo " --fix Update the older version to match the newer one"
echo " --help Show this help message"
exit 0
;;
*)
echo -e "${RED}Error: Unknown option $1${NC}"
echo "Use --help for usage information"
exit 1
;;
esac
done
# Require mode to be specified
if [ -z "$MODE" ]; then
echo -e "${RED}Error: Please specify either --check or --fix${NC}"
echo "Use --help for usage information"
exit 1
fi
# Get the repository root (two levels up from scripts/ci/)
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
cd "$REPO_ROOT"
CARGO_TOML="foreign/python/Cargo.toml"
PYPROJECT_TOML="foreign/python/pyproject.toml"
# Extract version from Cargo.toml
CARGO_VERSION=$(grep '^version = ' "$CARGO_TOML" | head -1 | sed 's/version = "\(.*\)"/\1/')
# Extract version from pyproject.toml
PYPROJECT_VERSION=$(grep '^version = ' "$PYPROJECT_TOML" | head -1 | sed 's/version = "\(.*\)"/\1/')
if [ -z "$CARGO_VERSION" ]; then
echo -e "${RED}Error: Could not extract version from $CARGO_TOML${NC}"
exit 1
fi
if [ -z "$PYPROJECT_VERSION" ]; then
echo -e "${RED}Error: Could not extract version from $PYPROJECT_TOML${NC}"
exit 1
fi
# Normalize versions for comparison (both to PEP 440 format with .dev)
normalize_version() {
local v="$1"
echo "${v//-dev/.dev}"
}
# Convert PEP 440 format to Cargo format
to_cargo_format() {
local v="$1"
echo "${v//.dev/-dev}"
}
# Compare two versions, returns:
# 0 if equal
# 1 if first is greater
# 2 if second is greater
compare_versions() {
local v1="$1"
local v2="$2"
# Normalize both versions
v1=$(normalize_version "$v1")
v2=$(normalize_version "$v2")
if [ "$v1" = "$v2" ]; then
echo 0
return
fi
# Extract base version and dev number
local base1 dev1 base2 dev2
if [[ "$v1" =~ ^([0-9]+\.[0-9]+\.[0-9]+)(\.dev([0-9]+))?$ ]]; then
base1="${BASH_REMATCH[1]}"
dev1="${BASH_REMATCH[3]:-0}"
else
base1="$v1"
dev1="0"
fi
if [[ "$v2" =~ ^([0-9]+\.[0-9]+\.[0-9]+)(\.dev([0-9]+))?$ ]]; then
base2="${BASH_REMATCH[1]}"
dev2="${BASH_REMATCH[3]:-0}"
else
base2="$v2"
dev2="0"
fi
# Compare base versions using sort -V
local sorted
sorted=$(printf '%s\n%s' "$base1" "$base2" | sort -V | head -1)
if [ "$base1" != "$base2" ]; then
if [ "$sorted" = "$base1" ]; then
echo 2 # v2 is greater
else
echo 1 # v1 is greater
fi
return
fi
# Base versions are equal, compare dev numbers
if [ "$dev1" -gt "$dev2" ]; then
echo 1
elif [ "$dev1" -lt "$dev2" ]; then
echo 2
else
echo 0
fi
}
CARGO_NORMALIZED=$(normalize_version "$CARGO_VERSION")
PYPROJECT_NORMALIZED=$(normalize_version "$PYPROJECT_VERSION")
echo "Python SDK version check:"
echo " Cargo.toml: $CARGO_VERSION (normalized: $CARGO_NORMALIZED)"
echo " pyproject.toml: $PYPROJECT_VERSION"
echo ""
if [ "$MODE" = "check" ]; then
if [ "$CARGO_NORMALIZED" = "$PYPROJECT_NORMALIZED" ]; then
echo -e "${GREEN}✓ Python SDK versions are synchronized${NC}"
exit 0
else
echo -e "${RED}✗ Python SDK versions are NOT synchronized${NC}"
echo ""
echo "Please ensure both files have the same version:"
echo " - $CARGO_TOML: use format like '0.6.4-dev1'"
echo " - $PYPROJECT_TOML: use format like '0.6.4.dev1'"
echo ""
echo -e "${YELLOW}Run '$0 --fix' to fix this automatically${NC}"
exit 1
fi
elif [ "$MODE" = "fix" ]; then
if [ "$CARGO_NORMALIZED" = "$PYPROJECT_NORMALIZED" ]; then
echo -e "${GREEN}✓ Python SDK versions are already synchronized${NC}"
exit 0
fi
COMPARISON=$(compare_versions "$CARGO_VERSION" "$PYPROJECT_VERSION")
if [ "$COMPARISON" = "1" ]; then
# Cargo version is newer, update pyproject.toml
NEW_PYPROJECT_VERSION="$CARGO_NORMALIZED"
echo -e "${YELLOW}Cargo.toml has newer version, updating pyproject.toml...${NC}"
sed -i "s/^version = \"$PYPROJECT_VERSION\"/version = \"$NEW_PYPROJECT_VERSION\"/" "$PYPROJECT_TOML"
echo -e "${GREEN}✓ Updated $PYPROJECT_TOML: $PYPROJECT_VERSION -> $NEW_PYPROJECT_VERSION${NC}"
elif [ "$COMPARISON" = "2" ]; then
# pyproject version is newer, update Cargo.toml
NEW_CARGO_VERSION=$(to_cargo_format "$PYPROJECT_NORMALIZED")
echo -e "${YELLOW}pyproject.toml has newer version, updating Cargo.toml...${NC}"
sed -i "s/^version = \"$CARGO_VERSION\"/version = \"$NEW_CARGO_VERSION\"/" "$CARGO_TOML"
echo -e "${GREEN}✓ Updated $CARGO_TOML: $CARGO_VERSION -> $NEW_CARGO_VERSION${NC}"
fi
exit 0
fi