mirror of
https://github.com/godotengine/godot-builds.git
synced 2026-01-01 01:48:13 +03:00
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.
192 lines
7.5 KiB
Python
192 lines
7.5 KiB
Python
### This script has been used to generate initial data for this repository
|
|
### and is preserved as a reference. DO NOT USE IT.
|
|
|
|
### Generate GitHub releases for each official Godot release.
|
|
###
|
|
### For each release creates a canned release summary based on
|
|
### release's characteristics, then publishes a new GitHub release
|
|
### in the linked repository. Make sure to use gh to configure
|
|
### the default repository for this project's folder.
|
|
###
|
|
### Generated release notes are available in tmp/notes for examination.
|
|
|
|
|
|
import json
|
|
import os
|
|
import subprocess
|
|
import yaml
|
|
|
|
|
|
website_versions = []
|
|
|
|
|
|
# Helpers.
|
|
|
|
def generate_notes(release_data):
|
|
notes = ""
|
|
|
|
version_version = release_data["version"]
|
|
version_status = release_data["status"]
|
|
version_tag = f"{version_version}-{version_status}"
|
|
|
|
version_bits = version_version.split(".")
|
|
version_flavor = "patch"
|
|
if len(version_bits) == 2 and version_bits[1] == "0":
|
|
version_flavor = "major"
|
|
elif len(version_bits) == 2 and version_bits[1] != "0":
|
|
version_flavor = "minor"
|
|
|
|
# Add the intro line.
|
|
|
|
version_name = version_version
|
|
if version_status != "stable":
|
|
version_name += " "
|
|
if version_status.startswith("rc"):
|
|
version_name += f"RC {version_status.removeprefix('rc')}"
|
|
elif version_status.startswith("beta"):
|
|
version_name += f"beta {version_status.removeprefix('beta')}"
|
|
elif version_status.startswith("alpha"):
|
|
version_name += f"alpha {version_status.removeprefix('alpha')}"
|
|
elif version_status.startswith("dev"):
|
|
version_name += f"dev {version_status.removeprefix('dev')}"
|
|
else:
|
|
version_name += version_status
|
|
|
|
version_description = ""
|
|
|
|
if version_status == "stable":
|
|
if version_flavor == "major":
|
|
version_description = "a major release introducing new features and considerable changes to core systems. **Major version releases contain compatibility breaking changes.**"
|
|
elif version_flavor == "minor":
|
|
version_description = "a feature release improving upon the previous version in many aspects, such as usability and performance. Feature releases also contain new features, but preserve compatibility with previous releases."
|
|
else:
|
|
version_description = "a maintenance release addressing stability and usability issues, and fixing all sorts of bugs. Maintenance releases are compatible with previous releases and are recommended for adoption."
|
|
else:
|
|
flavor_name = "maintenance"
|
|
if version_flavor == "major":
|
|
flavor_name = "major"
|
|
elif version_flavor == "minor":
|
|
flavor_name = "feature"
|
|
|
|
if version_status.startswith("rc"):
|
|
version_description = f"a release candidate for the {version_version} {flavor_name} release. Release candidates focus on finalizing the release and fixing remaining critical bugs."
|
|
elif version_status.startswith("beta"):
|
|
version_description = f"a beta snapshot for the {version_version} {flavor_name} release. Beta snapshots are feature-complete and provided for public beta testing to catch as many bugs as possible ahead of the stable release."
|
|
else: # alphas and devs go here.
|
|
version_description = f"a dev snapshot for the {version_version} {flavor_name} release. Dev snapshots are in-development builds of the engine provided for early testing and feature evaluation while the engine is still being worked on."
|
|
|
|
notes += f"**Godot {version_name}** is {version_description}\n\n"
|
|
|
|
# Link to the bug tracker.
|
|
|
|
notes += "Report bugs on GitHub after checking that they haven't been reported:\n"
|
|
notes += "- https://github.com/godotengine/godot/issues\n"
|
|
notes += "\n"
|
|
|
|
# Add build information.
|
|
|
|
# Only for pre-releases.
|
|
if version_status != "stable":
|
|
commit_hash = release_data["git_reference"]
|
|
notes += f"Built from commit [{commit_hash}](https://github.com/godotengine/godot/commit/{commit_hash}).\n"
|
|
notes += f"To make a custom build which would also be recognized as {version_status}, you should define `GODOT_VERSION_STATUS={version_status}` in your build environment prior to compiling.\n"
|
|
notes += "\n"
|
|
|
|
# Add useful links.
|
|
|
|
notes += "----\n"
|
|
notes += "\n"
|
|
|
|
release_notes_url = ""
|
|
release_notes_version = version_version
|
|
if version_version == "3.2.4":
|
|
release_notes_version = "3.3"
|
|
|
|
for web_version in website_versions:
|
|
if web_version["name"] != release_notes_version:
|
|
continue
|
|
if web_version["flavor"] == version_status:
|
|
release_notes_url = f"https://godotengine.org{web_version['release_notes']}"
|
|
break
|
|
|
|
for web_release in web_version["releases"]:
|
|
if web_release["name"] != version_status:
|
|
continue
|
|
release_notes_url = f"https://godotengine.org{web_release['release_notes']}"
|
|
break
|
|
|
|
notes += f"- [Release notes]({release_notes_url})\n"
|
|
|
|
if version_status == "stable":
|
|
notes += f"- [Complete changelog](https://godotengine.github.io/godot-interactive-changelog/#{version_version})\n"
|
|
notes += f"- [Curated changelog](https://github.com/godotengine/godot/blob/{version_tag}/CHANGELOG.md)\n"
|
|
else:
|
|
notes += f"- [Complete changelog](https://godotengine.github.io/godot-interactive-changelog/#{version_tag})\n"
|
|
|
|
notes += "- Download (GitHub): Expand **Assets** below\n"
|
|
|
|
if version_status == "stable":
|
|
notes += f"- [Download (TuxFamily)](https://downloads.tuxfamily.org/godotengine/{version_version})\n"
|
|
else:
|
|
notes += f"- [Download (TuxFamily)](https://downloads.tuxfamily.org/godotengine/{version_version}/{version_status})\n"
|
|
|
|
notes += "\n"
|
|
notes += "*All files for this release are mirrored under **Assets** below.*\n"
|
|
|
|
return notes
|
|
|
|
|
|
with open("./tmp/versions.yml", "r") as f:
|
|
try:
|
|
website_versions = yaml.safe_load(f)
|
|
except yaml.YAMLError as exc:
|
|
pass
|
|
|
|
releases = []
|
|
|
|
# Read JSON files and generate GitHub release in order.
|
|
|
|
releases_path = "./releases"
|
|
|
|
dir_contents = os.listdir(releases_path)
|
|
for filename in dir_contents:
|
|
filepath = os.path.join(releases_path, filename)
|
|
if not os.path.isfile(filepath):
|
|
continue
|
|
|
|
with open(filepath, 'r') as json_data:
|
|
release_data = json.load(json_data)
|
|
|
|
print(f"Reading release '{release_data['name']}' data.")
|
|
releases.append({
|
|
"file": filepath,
|
|
"data": release_data
|
|
})
|
|
|
|
# Sort by release date so we can create commits in order
|
|
releases.sort(key=lambda x: x['data']['release_date'])
|
|
|
|
# Generate a commit for each release, spoof the commit date to
|
|
# match the release date.
|
|
|
|
# Create the output directory if it doesn't exist.
|
|
if not os.path.exists("./tmp/notes"):
|
|
os.makedirs("./tmp/notes")
|
|
|
|
for release_data in releases:
|
|
release_tag = f"{release_data['data']['version']}-{release_data['data']['status']}"
|
|
release_title = f"{release_data['data']['version']}-{release_data['data']['status']}"
|
|
prerelease_flag = ""
|
|
if release_data['data']['status'] != "stable":
|
|
prerelease_flag = "--prerelease"
|
|
|
|
release_notes = generate_notes(release_data['data'])
|
|
release_notes_file = f"./tmp/notes/release-notes-{release_tag}.txt"
|
|
with open(release_notes_file, 'w') as temp_notes:
|
|
temp_notes.write(release_notes)
|
|
|
|
cmd_create_release = f"gh release create {release_tag} --verify-tag --title \"{release_title}\" --notes-file {release_notes_file} {prerelease_flag}"
|
|
|
|
print(cmd_create_release)
|
|
subprocess.run(cmd_create_release)
|