blob: ccaa8012f94124edb129476fd676cb04744bd6f1 [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 Rust version from rust-toolchain.toml to all Dockerfiles"
echo ""
echo "Options:"
echo " --check Check if all Dockerfiles have the correct Rust version"
echo " --fix Update all Dockerfiles to use the correct Rust version"
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 (parent of scripts directory)
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
cd "$REPO_ROOT"
# Extract Rust version from rust-toolchain.toml
RUST_VERSION=$(grep 'channel' rust-toolchain.toml | sed 's/.*"\(.*\)".*/\1/')
if [ -z "$RUST_VERSION" ]; then
echo -e "${RED}Error: Could not extract Rust version from rust-toolchain.toml${NC}"
exit 1
fi
# Strip trailing ".0" -> e.g., 1.89.0 -> 1.89 (no change if it doesn't end in .0)
RUST_VERSION_SHORT=$(echo "$RUST_VERSION" | sed -E 's/^([0-9]+)\.([0-9]+)\.0$/\1.\2/')
echo "Rust version from rust-toolchain.toml: ${GREEN}$RUST_VERSION${NC} (using ${GREEN}$RUST_VERSION_SHORT${NC} for Dockerfiles)"
echo ""
# Find all Dockerfiles
DOCKERFILES=$(find . -name "Dockerfile*" -type f | grep -v node_modules | grep -v target | sort)
# Track misaligned files
MISALIGNED_FILES=()
TOTAL_FILES=0
FIXED_FILES=0
for dockerfile in $DOCKERFILES; do
# Skip files without ARG RUST_VERSION
if ! grep -q "^ARG RUST_VERSION=" "$dockerfile" 2>/dev/null; then
continue
fi
TOTAL_FILES=$((TOTAL_FILES + 1))
# Get current version in the Dockerfile
CURRENT_VERSION=$(grep "^ARG RUST_VERSION=" "$dockerfile" | head -1 | sed 's/^ARG RUST_VERSION=//')
if [ "$MODE" = "check" ]; then
if [ "$CURRENT_VERSION" != "$RUST_VERSION_SHORT" ]; then
MISALIGNED_FILES+=("$dockerfile")
echo -e "${RED}✗${NC} $dockerfile: ${RED}$CURRENT_VERSION${NC} (expected: ${GREEN}$RUST_VERSION_SHORT${NC})"
else
echo -e "${GREEN}✓${NC} $dockerfile: $CURRENT_VERSION"
fi
elif [ "$MODE" = "fix" ]; then
if [ "$CURRENT_VERSION" != "$RUST_VERSION_SHORT" ]; then
# Update the ARG RUST_VERSION line
sed -i "s/^ARG RUST_VERSION=.*/ARG RUST_VERSION=$RUST_VERSION_SHORT/" "$dockerfile"
FIXED_FILES=$((FIXED_FILES + 1))
echo -e "${GREEN}Fixed${NC} $dockerfile: ${RED}$CURRENT_VERSION${NC} -> ${GREEN}$RUST_VERSION_SHORT${NC}"
else
echo -e "${GREEN}✓${NC} $dockerfile: already correct ($RUST_VERSION_SHORT)"
fi
fi
done
echo ""
echo "────────────────────────────────────────────────"
if [ "$MODE" = "check" ]; then
if [ ${#MISALIGNED_FILES[@]} -eq 0 ]; then
echo -e "${GREEN}✓ All $TOTAL_FILES Dockerfiles are aligned with Rust version $RUST_VERSION_SHORT${NC}"
exit 0
else
echo -e "${RED}✗ Found ${#MISALIGNED_FILES[@]} misaligned Dockerfile(s) out of $TOTAL_FILES:${NC}"
for file in "${MISALIGNED_FILES[@]}"; do
echo -e " ${RED}• $file${NC}"
done
echo ""
echo -e "${YELLOW}Run '$0 --fix' to fix these files${NC}"
exit 1
fi
elif [ "$MODE" = "fix" ]; then
if [ $FIXED_FILES -eq 0 ]; then
echo -e "${GREEN}✓ All $TOTAL_FILES Dockerfiles were already aligned with Rust version $RUST_VERSION_SHORT${NC}"
else
echo -e "${GREEN}✓ Fixed $FIXED_FILES out of $TOTAL_FILES Dockerfiles to use Rust version $RUST_VERSION_SHORT${NC}"
fi
exit 0
fi