Files
godot-builds/tools/create-release-metadata.py
Yuri Sizov 40158a6a25 Add a script to automatically generate and upload release
The script must be run from the godot-build-scripts directory
used to build Godot. It requires access to both folders to
read build artifacts from there and create commits here.
2023-10-11 19:56:12 +02:00

107 lines
3.7 KiB
Python

#!/usr/bin/env python3
import argparse
import os
from datetime import datetime
def find_file_checksums(release_path):
files = []
checksums_path = f"{release_path}/SHA512-SUMS.txt"
with open(checksums_path, 'r') as checksums:
for line in checksums:
split_line = line.split(" ")
files.append({
"filename": split_line[1].strip(),
"checksum": split_line[0].strip()
})
return files
def generate_file(version_version: str, version_status: str, git_reference: str):
# Open the file for writing.
basedir = os.environ.get("basedir")
buildsdir = os.environ.get('buildsdir')
output_path = f"{buildsdir}/releases/godot-{version_version}-{version_status}.json"
with open(output_path, 'w') as f:
release_name = version_version
commit_hash = git_reference
if version_status == "stable":
commit_hash = f"{version_version}-stable"
else:
release_name = f"{version_version}-{version_status}"
# Start writing the file with basic meta information.
f.write(
f'{{\n'
f' "name": "{release_name}",\n'
f' "version": "{version_version}",\n'
f' "status": "{version_status}",\n'
f' "release_date": {int(datetime.now().timestamp())},\n'
f' "git_reference": "{commit_hash}",\n'
f'\n'
f' "files": [\n'
)
# Generate the list of files.
release_folder = f"{basedir}/releases/{version_version}-{version_status}"
standard_files = find_file_checksums(f"{release_folder}")
mono_files = find_file_checksums(f"{release_folder}/mono")
for i, file in enumerate(standard_files):
f.write(
f' {{\n'
f' "filename": "{file["filename"]}",\n'
f' "checksum": "{file["checksum"]}"\n'
f' }}{"" if i == len(standard_files) - 1 and len(mono_files) == 0 else ","}\n'
)
for i, file in enumerate(mono_files):
f.write(
f' {{\n'
f' "filename": "{file["filename"]}",\n'
f' "checksum": "{file["checksum"]}"\n'
f' }}{"" if i == len(mono_files) - 1 else ","}\n'
)
# Finish the file.
f.write(
f' ]\n'
f'}}\n'
)
print(f"Written release metadata to '{output_path}'.")
def main() -> None:
if os.environ.get("basedir") == "" or os.environ.get("buildsdir") == "":
print("Failed to create release metadata: Missing 'basedir' (godot-build-scripts) and 'buildsdir' (godot-builds) environment variables.\n")
exit(1)
parser = argparse.ArgumentParser()
parser.add_argument("-v", "--version", default="", help="Godot version in the major.minor.patch format (patch should be omitted for major and minor releases).")
parser.add_argument("-f", "--flavor", default="stable", help="Release flavor, e.g. dev, alpha, beta, rc, stable (defaults to stable).")
parser.add_argument("-g", "--git", default="", help="Git commit hash tagged for this release.")
args = parser.parse_args()
if args.version == "" or args.git == "":
print("Failed to create release metadata: Godot version and git hash cannot be empty.\n")
parser.print_help()
exit(1)
release_version = args.version
release_flavor = args.flavor
if release_flavor == "":
release_flavor = "stable"
generate_file(release_version, release_flavor, args.git)
if __name__ == "__main__":
main()