Compare commits

...

2 Commits

Author SHA1 Message Date
Rémi Verschelde
9ff46d037c Add Godot 4.2-dev5 2023-09-19 12:08:03 +02:00
Yuri Sizov
3e49d03fac Add a script to generate GitHub releases 2023-09-12 18:19:29 +02:00
2 changed files with 266 additions and 0 deletions

180
generate-releases.py Normal file
View File

@@ -0,0 +1,180 @@
import json
import os
import subprocess
import yaml
from datetime import datetime
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":
version_bits = version_version.split(".")
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("./temp/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("./temp/notes"):
os.makedirs("./temp/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"./temp/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)

View File

@@ -0,0 +1,86 @@
{
"name": "4.2-dev5",
"version": "4.2",
"status": "dev5",
"release_date": 1695117942,
"git_reference": "e3e2528ba7f6e85ac167d687dd6312b35f558591",
"files": [
{
"filename": "godot-4.2-dev5.tar.xz",
"checksum": "cf15d10a40e56ea1049a8d516b2b45f824bdc16cb457dede21c14f2d6214b45f6099eec4293286c5f5aed612d836351613f6de1614730fdcb39f26c5f80c44e5"
},
{
"filename": "godot-4.2-dev5.tar.xz.sha256",
"checksum": "c01fc7ad1b9b254e8eedbd4db576467399d9113a6fba12f6e5c25f4ef35d8a02104eddbaec7b76ebf5b3f7984300507525e01a370be42bf207a6e7e7fe2d0d10"
},
{
"filename": "godot-lib.4.2.dev5.template_release.aar",
"checksum": "84db60f169a1cfd55d4fe9793841a2c17f06b869b2927f5d0fd62bf1c2b38754b44c7aa363516b63ee3f72abff154ab934218bc0da6c2b47ac4d4e27051e84c4"
},
{
"filename": "Godot_v4.2-dev5_android_editor.aab",
"checksum": "13c343755cee1c375b3022518d92ac9326c52ac759178c5155d2c1f5ff58d6bce682ad084660e365704bd97c568257ed39f133b484415155f58762dbdcee1877"
},
{
"filename": "Godot_v4.2-dev5_android_editor.apk",
"checksum": "fe25bcff8b890e461f76d3687150b661cb08298366c4476b4a6d870c973bbcf516677291872703b031c59acdaf2a55f87fd9985cc7744945ea5dba0ad1d0b40f"
},
{
"filename": "Godot_v4.2-dev5_export_templates.tpz",
"checksum": "bfd0f6546faaed02f64f54aae3c57484d26e4ea02ae26bdbbd34f3f4a9676eedebb315f92609c63c8c89165e6293a15db8ce288429979bf5a70f26c31e5e168e"
},
{
"filename": "Godot_v4.2-dev5_linux.x86_32.zip",
"checksum": "db3e31856493f90794688c0e0431747da2fbe17a9ff312313a427960e7682bddffe1a2e5ef9826bc4296b8e5b3a76495ee2fa2c6d7192776aa39ca6af4e626f7"
},
{
"filename": "Godot_v4.2-dev5_linux.x86_64.zip",
"checksum": "82db8ad7ce9f992a0ad48f271f63a8e89d9a40a082502117ccac05db10b53724e6733075661efed3ef5113ca4def53459b66dd1037ad855396b5cb7b0604b9f8"
},
{
"filename": "Godot_v4.2-dev5_macos.universal.zip",
"checksum": "98f77d928f7448bd15c85a3d3c26ae9c36feeb188ee323ad7dcfb6569aaf731b183ee2fdeb461a3f17e83d5e565c5f3bf59ce69efa5f8039e7e094619a7f327a"
},
{
"filename": "Godot_v4.2-dev5_web_editor.zip",
"checksum": "0b5f7714cf33426854e782408e5947d76d0b69238fc40f2eef050ffb36ea306cecad6abf8d000fcf2112c5b4850017ea3e101fdd150fd085577166bb9e861c1d"
},
{
"filename": "Godot_v4.2-dev5_win32.exe.zip",
"checksum": "3b424b983cffd11aef27a39ed56745a34342748020bf9893f531987d9e5c39eaf297df15414d7a53e2a516b6355d9081998d8b947de798bd4a6779f9b127831b"
},
{
"filename": "Godot_v4.2-dev5_win64.exe.zip",
"checksum": "5a551522f14532fb6b8533f8379ed95e69a7a7aed8855388951d5c580ac37f3ccadae0b9f92f0e2ce3dfc3fc8815c43633ff0a783425cbf2ab315841fe9df23a"
},
{
"filename": "godot-lib.4.2.dev5.mono.template_release.aar",
"checksum": "b258bf9254bc798c32ac9bff9d7fcb1021d1c834e71fbd85bfbb16a9fa71d7ca61c889b3aee37c7ba42075319708a73bad3869832a5a247a0d3c9b62cbd01d34"
},
{
"filename": "Godot_v4.2-dev5_mono_export_templates.tpz",
"checksum": "c3519f4903521656c8fa5dc73f7322d460ecc526f5ea848aff26c2fa3ce69c312854bcbed1c175bdfa34565af87da5c0ac36fe107e1b2487222d16ec4ddb75e9"
},
{
"filename": "Godot_v4.2-dev5_mono_linux_x86_32.zip",
"checksum": "838f1fd4089e0853039f48c4dd3cf1ef138bcc09e385365d8cdf37001a81520b33f3139131c9b59d2c8031630a04c011d8e36113df073a690d877732f6f8d436"
},
{
"filename": "Godot_v4.2-dev5_mono_linux_x86_64.zip",
"checksum": "fc005013c9f7e7572fab93215246da1329c01a254b491c3d371ff0203df0c393055f1df0569032c65073b1e3ebd31b505a0143964d8b66287eca1b312e94dd4a"
},
{
"filename": "Godot_v4.2-dev5_mono_macos.universal.zip",
"checksum": "0c56b8efc71008c601882e031fc038e3f4acc3a2c206d36a4b230b96c2a34780e78480425c16bf13eebb030345a9fe097e6503c3cce638ab700d82f340edb5b5"
},
{
"filename": "Godot_v4.2-dev5_mono_win32.zip",
"checksum": "70261e753bd825d84368af90575aca76a94995745a81727b628ccc3ca4391afcec3fb944adefd978acb26ba75e324d67e7e9839308110cf66cff3e8b9fc812f4"
},
{
"filename": "Godot_v4.2-dev5_mono_win64.zip",
"checksum": "3b26df959c9e7521887f05e4896f7d6d3f45328b29363330d57a9a9f3b1865571a0d14090cfe35b97fbec62b04e02396379cacc1de21eafb79333a361b8351dc"
}
]
}