spring-petclinic/infra/scripts/release/bump_file_versions.py
Jesse Houldsworth 00ed61ebb5 tf
2025-10-09 06:46:44 -07:00

83 lines
3 KiB
Python

# This script will bump the versions found in files (charts, pom.xml) during the Feast release process.
import pathlib
import sys
USAGE = f"Usage: python {sys.argv[0]} [--help] | current_semver_version new_semver_version]"
VERSIONS_TO_BUMP = 27
def main() -> None:
args = sys.argv[1:]
if not args or len(args) != 2:
raise SystemExit(USAGE)
current_version = args[0].strip()
new_version = args[1].strip()
if current_version == new_version:
raise SystemExit(f"Current and new versions are the same: {current_version} == {new_version}")
# Validate that the input arguments are semver versions
if not is_semantic_version(current_version):
raise SystemExit(f"Current version is not a valid semantic version: {current_version}")
if not is_semantic_version(new_version):
raise SystemExit(f"New version is not a valid semantic version: {new_version}")
# Get git repo root directory
repo_root = pathlib.Path(__file__).resolve().parent.parent.parent.parent
path_to_file_list = repo_root.joinpath("infra", "scripts", "release", "files_to_bump.txt")
# Get files to bump versions within
with open(path_to_file_list, "r") as f:
files_to_bump = f.read().splitlines()
# The current version should be 0.18.0 or 0.19.0 or 0.20.0 etc
validate_files_to_bump(current_version, files_to_bump, repo_root)
# Bump the version in the files
updated_count = 0
for file in files_to_bump:
components = file.split(" ")
file_path = components[0]
lines = components[1:]
with open(repo_root.joinpath(file_path), "r") as f:
file_contents = f.readlines()
for line in lines:
file_contents[int(line) - 1] = file_contents[int(line) - 1].replace(current_version, new_version)
with open(repo_root.joinpath(file_path), "w") as f:
f.write(''.join(file_contents))
updated_count += 1
print(f"Updated {updated_count} files with new version {new_version}")
def is_semantic_version(version: str) -> bool:
components = version.split(".")
if len(components) != 3:
return False
for component in components:
if not component.isdigit():
return False
return True
def validate_files_to_bump(current_version, files_to_bump, repo_root):
for file in files_to_bump:
components = file.split(" ")
assert len(components) > 1, f"Entry {file} should have a file name, and a list of line numbers with versions"
file_path = components[0]
lines = components[1:]
with open(repo_root.joinpath(file_path), "r") as f:
file_contents = f.readlines()
for line in lines:
assert current_version in file_contents[int(line) - 1], (
f"File `{file_path}` line `{line}` didn't contain version {current_version}. "
f"Contents: {file_contents[int(line) - 1]}"
)
if __name__ == "__main__":
main()