mirror of
https://github.com/godotengine/godot-builds.git
synced 2026-01-01 01:48:13 +03:00
Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
30426404b5 | ||
|
|
3a2388aa4b | ||
|
|
e0fbe2af47 | ||
|
|
40158a6a25 | ||
|
|
a68806e782 | ||
|
|
7499c6c2e8 |
2
.gitignore
vendored
2
.gitignore
vendored
@@ -1,2 +1,2 @@
|
||||
# Project folders.
|
||||
temp/
|
||||
tmp/
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"name": "4.1.2-rc1",
|
||||
"version": "4.1.2",
|
||||
"status": "rc1",
|
||||
"release_date": 1695381769,
|
||||
"release_date": 1695380117,
|
||||
"git_reference": "58f0cae4af47adcac121cc220749ddbf778f4a81",
|
||||
|
||||
"files": [
|
||||
|
||||
82
releases/godot-4.1.2-stable.json
Normal file
82
releases/godot-4.1.2-stable.json
Normal file
@@ -0,0 +1,82 @@
|
||||
{
|
||||
"name": "4.1.2",
|
||||
"version": "4.1.2",
|
||||
"status": "stable",
|
||||
"release_date": 1696412730,
|
||||
"git_reference": "4.1.2-stable",
|
||||
|
||||
"files": [
|
||||
{
|
||||
"filename": "godot-4.1.2-stable.tar.xz",
|
||||
"checksum": "d9e3c948aeece3586632ed2a8c94ca2107a6b5b4bb1ae8dc264e350fbfcb4cc1f4cd4cf7fdcd61a5b0351511c12e34d83275a79d5e0361e2eee67c8447b5f831"
|
||||
},
|
||||
{
|
||||
"filename": "godot-4.1.2-stable.tar.xz.sha256",
|
||||
"checksum": "058ab5cb784432e38e913f40269136372c1804ff1c1c961b2460e72c4ed8d8e3663df6a482fb118b978eeeb61068562074f0cd9ec5f4ff957c4c882588e99d24"
|
||||
},
|
||||
{
|
||||
"filename": "godot-lib.4.1.2.stable.template_release.aar",
|
||||
"checksum": "afdd65208842cc1f52a9911e9bbcf8295cbdcd9fc6c49e6e425e7a3f2416eeb5a602983b44cc4e6b884404184c4176a526149f6018b72c19fdfc9cc0ebbcfa10"
|
||||
},
|
||||
{
|
||||
"filename": "Godot_v4.1.2-stable_android_editor.aab",
|
||||
"checksum": "7ed49960c2914715f1e62074adf5e05a670c5717fab79caca36f37cc40f404d35d47fb21dc48d12009e35d94b6e5377e340bfac7d1b14663aef392220ed178a9"
|
||||
},
|
||||
{
|
||||
"filename": "Godot_v4.1.2-stable_android_editor.apk",
|
||||
"checksum": "5ffb29f2706056c8cd96e40501eb8876c22838b2195e1a427f6b604ba7c0e086acc354a9651548ac415d0ef3522543fdabd81d2edbd5a3fb74268fcdcf2649b5"
|
||||
},
|
||||
{
|
||||
"filename": "Godot_v4.1.2-stable_export_templates.tpz",
|
||||
"checksum": "e776af634590a47ab5f32c8735165a9ac42baf2e79baac0a78c3584c5d03b6e1ccd377905612418e98c408766d745246d562a67a9a2927d36e69ac56f5eb0daa"
|
||||
},
|
||||
{
|
||||
"filename": "Godot_v4.1.2-stable_linux.x86_32.zip",
|
||||
"checksum": "e78908b41b3465cf6483d86f07d3b3062c28999b07fb40d2a196379bb24d5ea3a1fe0ea98b6b90cee08116c0004ff2280ac0b03cf000f34eeb350497a564f29e"
|
||||
},
|
||||
{
|
||||
"filename": "Godot_v4.1.2-stable_linux.x86_64.zip",
|
||||
"checksum": "b5fc01677105e3fad81514fb4c039115694a7869ecb0dfaa0677975df6c71c813f860fb1baefd86fe884323258a4a07e4c7af20d95e47dbbe40013a50cd783e1"
|
||||
},
|
||||
{
|
||||
"filename": "Godot_v4.1.2-stable_macos.universal.zip",
|
||||
"checksum": "2349b9333a7c82c1207db90fc52a3aef887af42eeac94bb61e71a9e59836cb5797c4d471bc01886b550fda6be5434a6218f246126cfda100df4800a6fb435f09"
|
||||
},
|
||||
{
|
||||
"filename": "Godot_v4.1.2-stable_web_editor.zip",
|
||||
"checksum": "be1b57d1c3d66b9ac646c775c31f604270c1a4de1c6325de1e7f4171f544b0addad058501e7a7bede4f756c305c845f4ab4e5547ff25de4d1307d123d85ab647"
|
||||
},
|
||||
{
|
||||
"filename": "Godot_v4.1.2-stable_win32.exe.zip",
|
||||
"checksum": "a93bc40ba468c3474012fc0e3fe0381fa3d60f47fb232671390f63eafb6566b837eb6c5224dc68d28ac3a2946e3b20e680096c505e6f17dc80ae95306a83e446"
|
||||
},
|
||||
{
|
||||
"filename": "Godot_v4.1.2-stable_win64.exe.zip",
|
||||
"checksum": "6ce21ff5474a2093e7ad61f106b156673d9e4e4c7a74c685c18a01ac422dbcecfeaa6b7144daea2fd9a994c608d2601dc39131b5e7a62af908868f623d3be217"
|
||||
},
|
||||
{
|
||||
"filename": "Godot_v4.1.2-stable_mono_export_templates.tpz",
|
||||
"checksum": "d082a9af1d7d36707819ab66d17f7bc0ca2e3f0afd4a66acd8196294393a8080f04c5cf4e24f7a5710fb9b2cc4da3861f0b65244b533fe73322af10877c35d95"
|
||||
},
|
||||
{
|
||||
"filename": "Godot_v4.1.2-stable_mono_linux_x86_32.zip",
|
||||
"checksum": "58c615b19fdfe0bff05acd2b9a434b5b91e56e0ddd4b249989af310d52094f5c025b2640d59a862eb22220116cbc714539469bc8a3ecb4e9f4c8df49fa0373a3"
|
||||
},
|
||||
{
|
||||
"filename": "Godot_v4.1.2-stable_mono_linux_x86_64.zip",
|
||||
"checksum": "ab50f0b0425c9b56f32962a0542a597f3e900a11333fcec41735119b4effc07693c564b46564cf453a85d0f83e4c7e13a284a3c7be78d50b46825b7028becaec"
|
||||
},
|
||||
{
|
||||
"filename": "Godot_v4.1.2-stable_mono_macos.universal.zip",
|
||||
"checksum": "c73bd7b39a3a3ecaa67fb6026f2d4e6173fb64d1651d649e69a061f3cdc3402efc23a72283f7306e2e88c435590e7ca9a97eb50312b497fda3314cda29d9d71c"
|
||||
},
|
||||
{
|
||||
"filename": "Godot_v4.1.2-stable_mono_win32.zip",
|
||||
"checksum": "95ad329ed92e3a6347a35ea71ecf5c35e2ce4685c7586156673f36a8c86ffc0b34c68b3b9bf93539072f76b514323d9d18d5a74a32ee39a40327bd3e97e8c871"
|
||||
},
|
||||
{
|
||||
"filename": "Godot_v4.1.2-stable_mono_win64.zip",
|
||||
"checksum": "26a823c1a5f0818d27db4e94f3b96985f2813619473696c4feb9e6080634668fc1090fbb39dfc7e49e38cbbdebe78f75677cf436e7c648ef778e8121c9e35410"
|
||||
}
|
||||
]
|
||||
}
|
||||
86
releases/godot-4.2-beta1.json
Normal file
86
releases/godot-4.2-beta1.json
Normal file
@@ -0,0 +1,86 @@
|
||||
{
|
||||
"name": "4.2-beta1",
|
||||
"version": "4.2",
|
||||
"status": "beta1",
|
||||
"release_date": 1697095477,
|
||||
"git_reference": "b1371806ad3907c009458ea939bd4b810f9deb21",
|
||||
|
||||
"files": [
|
||||
{
|
||||
"filename": "godot-4.2-beta1.tar.xz",
|
||||
"checksum": "cedd39add1596ff2d5858a904f9b04683be1ae59390fa4340b326e1a9cda5480b6ed71964bfd3c4f832d7b849cf2a2b46717509e0f9d2e129f7f53b9166e6482"
|
||||
},
|
||||
{
|
||||
"filename": "godot-4.2-beta1.tar.xz.sha256",
|
||||
"checksum": "7463fc82f9d633553157f7ea9a760fcb6ea89b2e94f3d1e350cf48c8d079bb12647c7788260f6b77fed3337c8e9e45bbb2a6e18c5dcecb08319bb06120807690"
|
||||
},
|
||||
{
|
||||
"filename": "godot-lib.4.2.beta1.template_release.aar",
|
||||
"checksum": "307acb80ffb11f1136e64c2c2d17c67868805e0c72072405ad46574c6ceb9872d22f7ea1c685f6fc5bed59dcd2f57fdc114183276f8750351acee3043be9a30e"
|
||||
},
|
||||
{
|
||||
"filename": "Godot_v4.2-beta1_android_editor.aab",
|
||||
"checksum": "302574253eaca2381f5be8a74415c752dad478b5c56fd437c2cb47c873dc2552a2157395b8445a78b14b8c3a6ee9b59142c21d3df5dedcc4543058f518909b5c"
|
||||
},
|
||||
{
|
||||
"filename": "Godot_v4.2-beta1_android_editor.apk",
|
||||
"checksum": "9d0028909e40af2bc97a5f8923987c2a2df66eb8fba7ac10902534d41970b8f979f71ec1ce3a4c1dc8e82c027e264b7b4daabafa0e546a0ea38293c8762f66f2"
|
||||
},
|
||||
{
|
||||
"filename": "Godot_v4.2-beta1_export_templates.tpz",
|
||||
"checksum": "be19d1613fad8fc0c1fea2ff44491e1502d04bbffa6faeb6854f56bb2f85e94fee65f512c428073b5064977fb768e5d3da8300e29b596d8c46d14ad05c3a4acb"
|
||||
},
|
||||
{
|
||||
"filename": "Godot_v4.2-beta1_linux.x86_32.zip",
|
||||
"checksum": "bc243d0528eee7385a70883c5db39357f5949e3f74c5d29c4adfcb1a91cac33671dc0bdde0e6322716c244a6346d8f31b28807e6711c3fbaacacc3428999be5e"
|
||||
},
|
||||
{
|
||||
"filename": "Godot_v4.2-beta1_linux.x86_64.zip",
|
||||
"checksum": "2ba328723d9365cc3034c06c2b0992c3b31398d553e7cc17b461d4e3ad0ca8a72d25ab7d1f1cbea62c204ae7eb719ab0168b0b8153b5afeeb43a157103bb281e"
|
||||
},
|
||||
{
|
||||
"filename": "Godot_v4.2-beta1_macos.universal.zip",
|
||||
"checksum": "049a7d31383f5ece3e99df144611ce4ad9d8e36f69144419115a21bf175a4189e5b4a785ff3b96d6a5b00f75e113b415e36336e885d2eb47510bd94b5a7acdc0"
|
||||
},
|
||||
{
|
||||
"filename": "Godot_v4.2-beta1_web_editor.zip",
|
||||
"checksum": "4d69dc8586cc98c8717df922209ce84985c87755d7519dbde34aab7d645313eba79af11897e50fa9de4350553d235b62c71bc6f9dc9f670d6d8b95db27d3c40f"
|
||||
},
|
||||
{
|
||||
"filename": "Godot_v4.2-beta1_win32.exe.zip",
|
||||
"checksum": "bfa272aaaad3f243002315d51a1a56aa149ad6fab512e32bba55e532f50853a9a707a05f51c138a7737548aba7f449a44b213914f60c15ec52c7f6b7ae9bfa43"
|
||||
},
|
||||
{
|
||||
"filename": "Godot_v4.2-beta1_win64.exe.zip",
|
||||
"checksum": "bff452173bc2d3361b5960e2bdca7d9323e239c1af5ccad88bedc8f465bade284e16f013606834dc707d8378daf1663e59bfb3473c29d58dd56085a068f76f02"
|
||||
},
|
||||
{
|
||||
"filename": "godot-lib.4.2.beta1.mono.template_release.aar",
|
||||
"checksum": "8c8505646f593d498a430ec50caf353e3794afdf98ed568ffa767a4a4466e99184df791b569eddb5e57282ba164127c0ae3336606b67e8971d6710ab86b6c41d"
|
||||
},
|
||||
{
|
||||
"filename": "Godot_v4.2-beta1_mono_export_templates.tpz",
|
||||
"checksum": "97d5a32965db87fd2a31f494670403adcdb14ea4e3c04640a93244ba6520222eaa4a24964cbb556a80444193cc29f9b61e31fbe99c6182d0434249c047a9e140"
|
||||
},
|
||||
{
|
||||
"filename": "Godot_v4.2-beta1_mono_linux_x86_32.zip",
|
||||
"checksum": "bb8db0c6580c9c8de7089546baf4e42de589d54722c745f0db36f673492e9f61609899d4ad72271a7ddb10d7a71a92cbcd789808e48651cf07af6de76b72fd20"
|
||||
},
|
||||
{
|
||||
"filename": "Godot_v4.2-beta1_mono_linux_x86_64.zip",
|
||||
"checksum": "07499691ff05d3077a912f8b104eaf9ed085db162c38763e37ee057c4fb36324686539211f57ab98db2a0d5fba274bb7ccf4383306d213f579782a51bdd831cc"
|
||||
},
|
||||
{
|
||||
"filename": "Godot_v4.2-beta1_mono_macos.universal.zip",
|
||||
"checksum": "deaf4afe2f51588613a7727365486b05897ead1507dab87029fc6a0d84b10056b43954cb2f5aef075f47a4b6163777c263b0390583b5aa7b80e9c06355ee0958"
|
||||
},
|
||||
{
|
||||
"filename": "Godot_v4.2-beta1_mono_win32.zip",
|
||||
"checksum": "c4a5089c540daeeab0067927e0b787fbad91a5d47d41e5b5fe9fea54d9d5ca2cdec39f83b41ddadb3d168837f8f4654bf04d2b874ca9d8e646557feb02f13d27"
|
||||
},
|
||||
{
|
||||
"filename": "Godot_v4.2-beta1_mono_win64.zip",
|
||||
"checksum": "85b7a372c7101d11493a60c693d4c841270ead936388480ac25679cf744f0bd8d498c702c6d228fa01575a8900c4a17d384885d0cb84a5f6dee5e21718dc0e22"
|
||||
}
|
||||
]
|
||||
}
|
||||
15
generate-history.py → tools/bootstrap/generate-history.py
Normal file → Executable file
15
generate-history.py → tools/bootstrap/generate-history.py
Normal file → Executable file
@@ -1,3 +1,18 @@
|
||||
### This script has been used to generate initial data for this repository
|
||||
### and is preserved as a reference. DO NOT USE IT.
|
||||
|
||||
### Generate commit history adding each official release in order.
|
||||
###
|
||||
### Make sure JSON metadata files are put into the releases folder.
|
||||
### Using these files this script recreates the commit history,
|
||||
### placing each release at their approximate time and date of
|
||||
### publication. Each commit is tagged with the release identity.
|
||||
###
|
||||
### Make sure you do not rebase or otherwise change the history
|
||||
### afterwards, as that destroys git tags (they remain assigned
|
||||
### to old commits).
|
||||
|
||||
|
||||
import json
|
||||
import os
|
||||
import subprocess
|
||||
19
extract-hashes.py → tools/bootstrap/generate-metadata.py
Normal file → Executable file
19
extract-hashes.py → tools/bootstrap/generate-metadata.py
Normal file → Executable file
@@ -1,3 +1,14 @@
|
||||
### This script has been used to generate initial data for this repository
|
||||
### and is preserved as a reference. DO NOT USE IT.
|
||||
|
||||
### Generate JSON metadata files for each official release of Godot.
|
||||
###
|
||||
### Files are put into a temporary folder tmp/releases. To generate
|
||||
### the data we extract dates and commit hashes from releases published
|
||||
### on TuxFamily. We also extract SHA512 checksums for release files
|
||||
### where possible.
|
||||
|
||||
|
||||
import os
|
||||
import urllib.request
|
||||
import urllib.error
|
||||
@@ -96,9 +107,9 @@ def generate_file(version_name, release_name, release_status, release_url):
|
||||
|
||||
# Open the file for writing.
|
||||
|
||||
output_path = f"./temp/releases/godot-{release_name}.json"
|
||||
output_path = f"./tmp/releases/godot-{release_name}.json"
|
||||
if release_status == "stable":
|
||||
output_path = f"./temp/releases/godot-{release_name}-stable.json"
|
||||
output_path = f"./tmp/releases/godot-{release_name}-stable.json"
|
||||
|
||||
with open(output_path, 'w') as f:
|
||||
# Get the commit hash / git reference.
|
||||
@@ -179,8 +190,8 @@ for match in matches:
|
||||
version_names.append(subfolder_name[:-1])
|
||||
|
||||
# Create the output directory if it doesn't exist.
|
||||
if not os.path.exists("./temp/releases"):
|
||||
os.makedirs("./temp/releases")
|
||||
if not os.path.exists("./tmp/releases"):
|
||||
os.makedirs("./tmp/releases")
|
||||
|
||||
for version_name in version_names:
|
||||
version_url = url + version_name
|
||||
23
generate-releases.py → tools/bootstrap/generate-releases.py
Normal file → Executable file
23
generate-releases.py → tools/bootstrap/generate-releases.py
Normal file → Executable file
@@ -1,8 +1,20 @@
|
||||
### 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
|
||||
from datetime import datetime
|
||||
|
||||
|
||||
website_versions = []
|
||||
@@ -43,7 +55,6 @@ def generate_notes(release_data):
|
||||
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":
|
||||
@@ -125,7 +136,7 @@ def generate_notes(release_data):
|
||||
return notes
|
||||
|
||||
|
||||
with open("./temp/versions.yml", "r") as f:
|
||||
with open("./tmp/versions.yml", "r") as f:
|
||||
try:
|
||||
website_versions = yaml.safe_load(f)
|
||||
except yaml.YAMLError as exc:
|
||||
@@ -159,8 +170,8 @@ releases.sort(key=lambda x: x['data']['release_date'])
|
||||
# match the release date.
|
||||
|
||||
# Create the output directory if it doesn't exist.
|
||||
if not os.path.exists("./temp/notes"):
|
||||
os.makedirs("./temp/notes")
|
||||
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']}"
|
||||
@@ -170,7 +181,7 @@ for release_data in releases:
|
||||
prerelease_flag = "--prerelease"
|
||||
|
||||
release_notes = generate_notes(release_data['data'])
|
||||
release_notes_file = f"./temp/notes/release-notes-{release_tag}.txt"
|
||||
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)
|
||||
|
||||
106
tools/create-release-metadata.py
Executable file
106
tools/create-release-metadata.py
Executable file
@@ -0,0 +1,106 @@
|
||||
#!/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()
|
||||
175
tools/create-release-notes.py
Executable file
175
tools/create-release-notes.py
Executable file
@@ -0,0 +1,175 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import argparse
|
||||
import os
|
||||
|
||||
|
||||
def get_version_name(version_version: str, version_status: str) -> str:
|
||||
version_name = version_version
|
||||
|
||||
if version_status == "stable":
|
||||
return version_name
|
||||
|
||||
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
|
||||
|
||||
return version_name
|
||||
|
||||
|
||||
def get_version_description(version_version: str, version_status: str, version_flavor: str) -> str:
|
||||
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."
|
||||
|
||||
return version_description
|
||||
|
||||
|
||||
def get_release_notes_url(version_version: str, version_status: str, version_flavor: str) -> str:
|
||||
release_notes_slug = ""
|
||||
version_sluggified = version_version.replace(".", "-")
|
||||
|
||||
if version_status == "stable":
|
||||
if version_flavor == "major":
|
||||
release_notes_slug = f"major-release-godot-{version_sluggified}"
|
||||
elif version_flavor == "minor":
|
||||
release_notes_slug = f"feature-release-godot-{version_sluggified}"
|
||||
else:
|
||||
release_notes_slug = f"maintenance-release-godot-{version_sluggified}"
|
||||
else:
|
||||
if version_status.startswith("rc"):
|
||||
status_sluggified = version_status.removeprefix("rc").replace(".", "-")
|
||||
release_notes_slug = f"release-candidate-godot-{version_sluggified}-rc-{status_sluggified}"
|
||||
elif version_status.startswith("beta"):
|
||||
status_sluggified = version_status.removeprefix("beta").replace(".", "-")
|
||||
release_notes_slug = f"dev-snapshot-godot-{version_sluggified}-beta-{status_sluggified}"
|
||||
elif version_status.startswith("alpha"):
|
||||
status_sluggified = version_status.removeprefix("alpha").replace(".", "-")
|
||||
release_notes_slug = f"dev-snapshot-godot-{version_sluggified}-alpha-{status_sluggified}"
|
||||
elif version_status.startswith("dev"):
|
||||
status_sluggified = version_status.removeprefix("dev").replace(".", "-")
|
||||
release_notes_slug = f"dev-snapshot-godot-{version_sluggified}-dev-{status_sluggified}"
|
||||
else:
|
||||
status_sluggified = version_status.replace(".", "-")
|
||||
release_notes_slug = f"dev-snapshot-godot-{version_sluggified}-{status_sluggified}"
|
||||
|
||||
return f"https://godotengine.org/article/{release_notes_slug}/"
|
||||
|
||||
|
||||
def generate_notes(version_version: str, version_status: str, git_reference: str) -> None:
|
||||
notes = ""
|
||||
|
||||
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 = get_version_name(version_version, version_status)
|
||||
version_description = get_version_description(version_version, version_status, version_flavor)
|
||||
|
||||
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 = 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 = get_release_notes_url(version_version, version_status, version_flavor)
|
||||
|
||||
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
|
||||
|
||||
|
||||
def main() -> None:
|
||||
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 notes: 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"
|
||||
release_tag = f"{release_version}-{release_flavor}"
|
||||
|
||||
release_notes = generate_notes(release_version, release_flavor, args.git)
|
||||
release_notes_file = f"./tmp/release-notes-{release_tag}.txt"
|
||||
with open(release_notes_file, 'w') as temp_notes:
|
||||
temp_notes.write(release_notes)
|
||||
|
||||
print(f"Written release notes to '{release_notes_file}'.")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
141
tools/upload-github.sh
Executable file
141
tools/upload-github.sh
Executable file
@@ -0,0 +1,141 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
# Generate GitHub release for a Godot version and upload artifacts.
|
||||
#
|
||||
# Usage: ./upload-github.sh -v 3.6
|
||||
# Usage: ./upload-github.sh -v 3.6 -f beta3
|
||||
# Usage: ./upload-github.sh -v 3.6 -f beta3 -r owner/repository
|
||||
#
|
||||
# Run this script from the root of the godot-build-scripts folder
|
||||
# after building Godot.
|
||||
|
||||
# Folder this script is called from, a.k.a its working directory.
|
||||
export basedir=$(pwd)
|
||||
|
||||
# Folder where this scripts resides in.
|
||||
scriptpath=$(readlink -f "$0")
|
||||
scriptdir=$(dirname "$scriptpath")
|
||||
# Root folder of this project, hopefully.
|
||||
export buildsdir=$(dirname "$scriptdir")
|
||||
|
||||
if [ ! -d "${basedir}/releases" ] || [ ! -d "${basedir}/tmp" ]; then
|
||||
echo "Cannot find one of the required folders: releases, tmp."
|
||||
echo " Make sure you're running this script from the root of your godot-build-scripts clone, and that Godot has been built with it."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Setup.
|
||||
|
||||
godot_version=""
|
||||
godot_flavor="stable"
|
||||
godot_repository="godotengine/godot-builds"
|
||||
|
||||
while getopts "v:f:r:" opt; do
|
||||
case "$opt" in
|
||||
v)
|
||||
godot_version=$OPTARG
|
||||
;;
|
||||
f)
|
||||
godot_flavor=$OPTARG
|
||||
;;
|
||||
r)
|
||||
godot_repository=$OPTARG
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
release_tag="$godot_version-$godot_flavor"
|
||||
|
||||
echo "Preparing release $release_tag..."
|
||||
|
||||
version_path="$basedir/releases/$release_tag"
|
||||
if [ ! -d "${version_path}" ]; then
|
||||
echo "Cannot find the release folder at $version_path."
|
||||
echo " Make sure you're running this script from the root of godot-build-scripts, and that Godot has been built."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
cd git
|
||||
git_reference=$(git rev-parse HEAD)
|
||||
cd ..
|
||||
|
||||
# Generate release metadata and commit it to Git.
|
||||
|
||||
echo "Creating and committing release metadata for $release_tag..."
|
||||
|
||||
if ! $buildsdir/tools/create-release-metadata.py -v $godot_version -f $godot_flavor -g $git_reference; then
|
||||
echo "Failed to create release metadata for $release_tag."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
cd $buildsdir
|
||||
git add ./releases/godot-$release_tag.json
|
||||
git commit -m "Add Godot $release_tag"
|
||||
git tag $release_tag
|
||||
if ! git push --atomic origin main $release_tag; then
|
||||
echo "Failed to push release metadata for $release_tag to GitHub."
|
||||
exit 1
|
||||
fi
|
||||
cd $basedir
|
||||
|
||||
# Exactly one time it failed to create release immediately after pushing the tag,
|
||||
# so we use this for protection...
|
||||
sleep 2
|
||||
|
||||
# Generate GitHub release.
|
||||
|
||||
echo "Creating and publishing GitHub release for $release_tag..."
|
||||
|
||||
if ! $buildsdir/tools/create-release-notes.py -v $godot_version -f $godot_flavor -g $git_reference; then
|
||||
echo "Failed to create release notes for $release_tag."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
release_notes="$basedir/tmp/release-notes-$release_tag.txt"
|
||||
release_flag=""
|
||||
if [ $godot_flavor != "stable" ]; then
|
||||
release_flag="--prerelease"
|
||||
fi
|
||||
|
||||
if ! gh release create $release_tag --verify-tag --title "$release_tag" --notes-file $release_notes $release_flag -R $godot_repository; then
|
||||
echo "Cannot create a GitHub release for $release_tag."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Upload release files to GitHub.
|
||||
|
||||
echo "Uploading release files from $version_path..."
|
||||
|
||||
# We are picking up all relevant files lazily, using a substring.
|
||||
# The first letter can be in either case, so we're skipping it.
|
||||
for f in $version_path/*odot*; do
|
||||
echo "Uploading $f..."
|
||||
gh release upload $release_tag $f -R $godot_repository
|
||||
done
|
||||
|
||||
# Do the same for .NET builds.
|
||||
for f in $version_path/mono/*odot*; do
|
||||
echo "Uploading $f..."
|
||||
gh release upload $release_tag $f -R $godot_repository
|
||||
done
|
||||
|
||||
# README.txt is only generated for pre-releases.
|
||||
readme_path="$version_path/README.txt"
|
||||
if [ $godot_flavor != "stable" ] && [ -f "${readme_path}" ]; then
|
||||
echo "Uploading $readme_path..."
|
||||
gh release upload $release_tag $readme_path -R $godot_repository
|
||||
fi
|
||||
|
||||
# SHA512-SUMS.txt is split into two: classic and mono, and we need to upload them as one.
|
||||
checksums_path="$basedir/tmp/SHA512-SUMS.txt"
|
||||
cp $basedir/releases/$release_tag/SHA512-SUMS.txt $checksums_path
|
||||
if [ -d "${basedir}/releases/${release_tag}/mono" ]; then
|
||||
cat $basedir/releases/$release_tag/mono/SHA512-SUMS.txt >> $checksums_path
|
||||
fi
|
||||
|
||||
echo "Uploading $checksums_path..."
|
||||
gh release upload $release_tag $checksums_path -R $godot_repository
|
||||
|
||||
echo "Done."
|
||||
Reference in New Issue
Block a user