101 lines
3.3 KiB
Python
101 lines
3.3 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
apply-release-changes.py - Cross-platform script to replace main with a specified release version in YML files
|
|
|
|
This script performs two replacements in YML files in .github/workflows/:
|
|
1. Replaces @main with @release/VERSION
|
|
2. Replaces 'test-infra-ref: main' with 'test-infra-ref: release/VERSION'
|
|
|
|
Usage:
|
|
python apply-release-changes.py VERSION
|
|
|
|
Example:
|
|
python apply-release-changes.py 2.7
|
|
"""
|
|
|
|
import os
|
|
import pathlib
|
|
import sys
|
|
from typing import Optional
|
|
|
|
|
|
def replace_in_file(file_path: pathlib.Path, old_text: str, new_text: str) -> None:
|
|
"""Replace all occurrences of old_text with new_text in the specified file."""
|
|
try:
|
|
# Try reading the file without specifying encoding to use the default
|
|
encoding = None
|
|
try:
|
|
content = file_path.read_text()
|
|
except UnicodeDecodeError:
|
|
# If that fails, try with UTF-8
|
|
encoding = "utf-8"
|
|
content = file_path.read_text(encoding=encoding)
|
|
|
|
# Perform the replacement
|
|
new_content = content.replace(old_text, new_text)
|
|
|
|
# Only write if changes were made
|
|
if new_content != content:
|
|
# Write with the same encoding we used to read
|
|
if encoding:
|
|
file_path.write_text(new_content, encoding=encoding)
|
|
else:
|
|
file_path.write_text(new_content)
|
|
print(f"Updated: {file_path}")
|
|
|
|
except Exception as e:
|
|
print(f"Error processing {file_path}: {e}")
|
|
|
|
|
|
def find_repo_root() -> Optional[pathlib.Path]:
|
|
"""Find the git repository root by searching for .git directory."""
|
|
# Start from the current directory and traverse upwards
|
|
current_path = pathlib.Path.cwd().absolute()
|
|
|
|
while current_path != current_path.parent:
|
|
# Check if .git directory exists
|
|
git_dir = current_path / ".git"
|
|
if git_dir.exists() and git_dir.is_dir():
|
|
return current_path
|
|
|
|
# Move up one directory
|
|
current_path = current_path.parent
|
|
|
|
# If we get here, we didn't find a repository root
|
|
return None
|
|
|
|
|
|
def main() -> None:
|
|
# Check if version is provided as command line argument
|
|
if len(sys.argv) != 2:
|
|
print("Error: Exactly one version parameter is required")
|
|
print(f"Usage: python {os.path.basename(__file__)} VERSION")
|
|
print("Example: python apply-release-changes.py 2.7")
|
|
sys.exit(1)
|
|
|
|
# Get version from command line argument
|
|
version = sys.argv[1]
|
|
print(f"Using release version: {version}")
|
|
|
|
# Find the repository root by searching for .git directory
|
|
repo_root = find_repo_root()
|
|
if not repo_root:
|
|
print("Error: Not inside a git repository. Please run from within a git repository.")
|
|
sys.exit(1)
|
|
|
|
print(f"Repository root found at: {repo_root}")
|
|
|
|
# Get path to workflow directory
|
|
workflow_dir = repo_root / ".github" / "workflows"
|
|
|
|
# Process all workflow files and perform both replacements on each file
|
|
for yml_file in workflow_dir.glob("*.yml"):
|
|
replace_in_file(yml_file, "@main", f"@release/{version}")
|
|
replace_in_file(yml_file, "test-infra-ref: main", f"test-infra-ref: release/{version}")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
print("Starting YML updates...")
|
|
main()
|
|
print("YML updates completed.")
|