From 0baa8da3759667eb1247c6dbee33c213b1b75619 Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Wed, 1 Nov 2023 10:43:35 +0100 Subject: [PATCH 1/7] feat: support NeoForge 1.20.2+ Signed-off-by: Sefa Eyeoglu --- meta/model/neoforge.py | 19 +++++++++---- updateNeoForge.py | 64 +++++++++++++++++++++++++++++++++--------- 2 files changed, 65 insertions(+), 18 deletions(-) diff --git a/meta/model/neoforge.py b/meta/model/neoforge.py index a13605c..4a110cf 100644 --- a/meta/model/neoforge.py +++ b/meta/model/neoforge.py @@ -8,20 +8,28 @@ from .mojang import MojangVersion class NeoForgeFile(MetaBase): + artifact: str classifier: str extension: str def filename(self, long_version): - return "%s-%s-%s.%s" % ("forge", long_version, self.classifier, self.extension) + return "%s-%s-%s.%s" % ( + self.artifact, + long_version, + self.classifier, + self.extension, + ) def url(self, long_version): - return "https://maven.neoforged.net/net/neoforged/forge/%s/%s" % ( + return "https://maven.neoforged.net/net/neoforged/%s/%s/%s" % ( + self.artifact, long_version, self.filename(long_version), ) class NeoForgeEntry(MetaBase): + artifact: str long_version: str = Field(alias="longversion") mc_version: str = Field(alias="mcversion") version: str @@ -174,6 +182,9 @@ class NeoForgeVersion: def __init__(self, entry: NeoForgeEntry): self.build = entry.build self.rawVersion = entry.version + if entry.artifact == "neoforge": + self.rawVersion = entry.long_version + self.mc_version = entry.mc_version self.mc_version_sane = self.mc_version.replace("_pre", "-pre", 1) self.branch = entry.branch @@ -182,9 +193,7 @@ class NeoForgeVersion: self.universal_filename = None self.universal_url = None self.changelog_url = None - self.long_version = "%s-%s" % (self.mc_version, self.rawVersion) - if self.branch is not None: - self.long_version += "-%s" % self.branch + self.long_version = entry.long_version # this comment's whole purpose is to say this: cringe for classifier, file in entry.files.items(): diff --git a/updateNeoForge.py b/updateNeoForge.py index 431930c..2ff8be5 100644 --- a/updateNeoForge.py +++ b/updateNeoForge.py @@ -67,7 +67,7 @@ def find_nth(haystack, needle, n): return start -def get_single_forge_files_manifest(longversion): +def get_single_forge_files_manifest(longversion, artifact: str): print(f"Getting NeoForge manifest for {longversion}") path_thing = UPSTREAM_DIR + "/neoforge/files_manifests/%s.json" % longversion files_manifest_file = Path(path_thing) @@ -78,7 +78,7 @@ def get_single_forge_files_manifest(longversion): from_file = True else: file_url = ( - "https://maven.neoforged.net/api/maven/details/releases/net%2Fneoforged%2Fforge%2F" + f"https://maven.neoforged.net/api/maven/details/releases/net%2Fneoforged%2F{artifact}%2F" + urllib.parse.quote(longversion) ) r = sess.get(file_url) @@ -90,14 +90,26 @@ def get_single_forge_files_manifest(longversion): for file in files_json.get("files"): assert type(file) == dict name = file["name"] - file_name, file_ext = os.path.splitext(name) - if file_ext in [".md5", ".sha1", ".sha256", ".sha512"]: + prefix = f"{artifact}-{longversion}" + assert name.startswith( + prefix + ), f"{longversion} classifier {name} doesn't start with {prefix}" + file_name = name[len(prefix) :] + if file_name.startswith("-"): + file_name = file_name[1:] + if file_name.startswith("."): continue - classifier = file["name"][find_nth(name, "-", 3) + 1 : len(file_name)] + print(f"AAAA {file_name}") + classifier, ext = os.path.splitext(file_name) + + if ext in [".md5", ".sha1", ".sha256", ".sha512"]: + continue # assert len(extensionObj.items()) == 1 - file_obj = NeoForgeFile(classifier=classifier, extension=file_ext[1:]) + file_obj = NeoForgeFile( + artifact=artifact, classifier=classifier, extension=ext[1:] + ) ret_dict[classifier] = file_obj if not from_file: @@ -117,32 +129,58 @@ def main(): main_json = r.json()["versions"] assert type(main_json) == list + # get the new remote version list fragments + r = sess.get( + "https://maven.neoforged.net/api/maven/versions/releases/net%2Fneoforged%2Fneoforge" + ) + r.raise_for_status() + new_main_json = r.json()["versions"] + assert type(new_main_json) == list + + main_json += new_main_json + new_index = DerivedNeoForgeIndex() version_expression = re.compile( - "^(?P[0-9a-zA-Z_\\.]+)-(?P[0-9\\.]+\\.(?P[0-9]+))(-(?P[a-zA-Z0-9\\.]+))?$" + r"^(?P[0-9a-zA-Z_\.]+)-(?P[0-9\.]+\.(?P[0-9]+))(-(?P[a-zA-Z0-9\.]+))?$" + ) + neoforge_version_re = re.compile( + r"^(?P\d+).(?P\d+).(?P\d+)(?:-(?P\w+))?$" ) print("") print("Processing versions:") for long_version in main_json: assert type(long_version) == str - mc_version = long_version.split("-")[0] + match = version_expression.match(long_version) + if match: + mc_version = match.group("mc") + build = int(match.group("build")) + version = match.group("ver") + branch = match.group("branch") + artifact = "forge" + + match_nf = neoforge_version_re.match(long_version) + if match_nf: + mc_version = f"1.{match_nf.group('mcminor')}.{match_nf.group('mcpatch')}" + build = int(match_nf.group("number")) + version = match_nf.group("number") + branch = match_nf.group("tag") + match = match_nf + artifact = "neoforge" + assert match, f"{long_version} doesn't match version regex" - assert match.group("mc") == mc_version try: - files = get_single_forge_files_manifest(long_version) + files = get_single_forge_files_manifest(long_version, artifact) except: continue - build = int(match.group("build")) - version = match.group("ver") - branch = match.group("branch") # TODO: what *is* recommended? is_recommended = False entry = NeoForgeEntry( + artifact=artifact, long_version=long_version, mc_version=mc_version, version=version, From 8e47317406d9a104743f7764d2a47b07543ab49f Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Wed, 1 Nov 2023 11:03:31 +0100 Subject: [PATCH 2/7] fix: use new neoforge artifact in library names Signed-off-by: Sefa Eyeoglu --- generateNeoForge.py | 9 ++++++--- meta/model/neoforge.py | 3 ++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/generateNeoForge.py b/generateNeoForge.py index 31df89a..d2f6ceb 100644 --- a/generateNeoForge.py +++ b/generateNeoForge.py @@ -60,7 +60,7 @@ def version_from_build_system_installer( ) installer_lib = Library( name=GradleSpecifier( - "net.neoforged", "forge", version.long_version, "installer" + "net.neoforged", version.artifact, version.long_version, "installer" ) ) installer_lib.downloads = MojangLibraryDownloads() @@ -78,9 +78,12 @@ def version_from_build_system_installer( if ( forge_lib.name.group == "net.neoforged" - and forge_lib.name.artifact == "forge" + and forge_lib.name.artifact == version.artifact and forge_lib.name.classifier == "universal" ): + # WORKAROUND: Early NeoForge 20.2 versions have an invalid version for universal jars. Instead of 1.20.2-20.2.20-beta it should just be 20.2.20-beta + if version.artifact == "neoforge": + forge_lib.name.version = version.long_version forge_lib.downloads.artifact.url = ( "https://maven.neoforged.net/%s" % forge_lib.name.path() ) @@ -96,7 +99,7 @@ def version_from_build_system_installer( continue if forge_lib.name.group == "net.neoforged": - if forge_lib.name.artifact == "forge": + if forge_lib.name.artifact == version.artifact: forge_lib.name.classifier = "launcher" forge_lib.downloads.artifact.path = forge_lib.name.path() forge_lib.downloads.artifact.url = ( diff --git a/meta/model/neoforge.py b/meta/model/neoforge.py index 4a110cf..853e433 100644 --- a/meta/model/neoforge.py +++ b/meta/model/neoforge.py @@ -180,9 +180,10 @@ class InstallerInfo(MetaBase): # A post-processed entry constructed from the reconstructed NeoForge version index class NeoForgeVersion: def __init__(self, entry: NeoForgeEntry): + self.artifact = entry.artifact self.build = entry.build self.rawVersion = entry.version - if entry.artifact == "neoforge": + if self.artifact == "neoforge": self.rawVersion = entry.long_version self.mc_version = entry.mc_version From 5eb3fd5518194749c6effb25e94a8805fe9e5dfa Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Wed, 1 Nov 2023 11:13:06 +0100 Subject: [PATCH 3/7] chore: add comment about broken universal jars Signed-off-by: Sefa Eyeoglu --- generateNeoForge.py | 1 + 1 file changed, 1 insertion(+) diff --git a/generateNeoForge.py b/generateNeoForge.py index d2f6ceb..98c6857 100644 --- a/generateNeoForge.py +++ b/generateNeoForge.py @@ -82,6 +82,7 @@ def version_from_build_system_installer( and forge_lib.name.classifier == "universal" ): # WORKAROUND: Early NeoForge 20.2 versions have an invalid version for universal jars. Instead of 1.20.2-20.2.20-beta it should just be 20.2.20-beta + # See https://github.com/neoforged/NeoForge/issues/228 if version.artifact == "neoforge": forge_lib.name.version = version.long_version forge_lib.downloads.artifact.url = ( From 9f6c9972c6bf270b75ffc5a081384ac73aecc270 Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Wed, 1 Nov 2023 11:53:03 +0100 Subject: [PATCH 4/7] fix: only patch download url for broken universal Signed-off-by: Sefa Eyeoglu --- generateNeoForge.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/generateNeoForge.py b/generateNeoForge.py index 98c6857..b1881d1 100644 --- a/generateNeoForge.py +++ b/generateNeoForge.py @@ -1,3 +1,4 @@ +from copy import deepcopy import os import re import sys @@ -83,10 +84,12 @@ def version_from_build_system_installer( ): # WORKAROUND: Early NeoForge 20.2 versions have an invalid version for universal jars. Instead of 1.20.2-20.2.20-beta it should just be 20.2.20-beta # See https://github.com/neoforged/NeoForge/issues/228 + download_name = forge_lib.name if version.artifact == "neoforge": - forge_lib.name.version = version.long_version + download_name = deepcopy(forge_lib.name) + download_name.version = version.long_version forge_lib.downloads.artifact.url = ( - "https://maven.neoforged.net/%s" % forge_lib.name.path() + "https://maven.neoforged.net/%s" % download_name.path() ) v.maven_files.append(forge_lib) From 86cad8b5d8991f38309663054b4b6b5964f78bdb Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Wed, 1 Nov 2023 12:07:40 +0100 Subject: [PATCH 5/7] chore: bump ForgeWrapper Signed-off-by: Sefa Eyeoglu --- meta/common/forge.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/meta/common/forge.py b/meta/common/forge.py index 4a8afbe..7c735a2 100644 --- a/meta/common/forge.py +++ b/meta/common/forge.py @@ -16,8 +16,8 @@ STATIC_LEGACYINFO_FILE = join(BASE_DIR, "forge-legacyinfo.json") FORGE_COMPONENT = "net.minecraftforge" FORGEWRAPPER_LIBRARY = make_launcher_library( - GradleSpecifier("io.github.zekerzhayard", "ForgeWrapper", "1.5.6-prism"), - "b059aa8c4d2508055c6ed2a2561923a5e670a5eb", - 34860, + GradleSpecifier("io.github.zekerzhayard", "ForgeWrapper", "1.5.7-prism"), + "29139276224c3b8eac414607ade28b90ba9113ba", + 35062, ) BAD_VERSIONS = ["1.12.2-14.23.5.2851"] From 0a4cbb8410ca93b58f7b06ac97d620dd25447e32 Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Wed, 1 Nov 2023 12:11:41 +0100 Subject: [PATCH 6/7] chore: update NeoGradle issue link Signed-off-by: Sefa Eyeoglu --- generateNeoForge.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generateNeoForge.py b/generateNeoForge.py index b1881d1..09a9044 100644 --- a/generateNeoForge.py +++ b/generateNeoForge.py @@ -83,7 +83,7 @@ def version_from_build_system_installer( and forge_lib.name.classifier == "universal" ): # WORKAROUND: Early NeoForge 20.2 versions have an invalid version for universal jars. Instead of 1.20.2-20.2.20-beta it should just be 20.2.20-beta - # See https://github.com/neoforged/NeoForge/issues/228 + # See https://github.com/neoforged/NeoGradle/issues/23 download_name = forge_lib.name if version.artifact == "neoforge": download_name = deepcopy(forge_lib.name) From c0644ac1561e91554afc4f1fbfc10b2b501a889c Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Wed, 1 Nov 2023 12:19:55 +0100 Subject: [PATCH 7/7] fix: remove debug log Signed-off-by: Sefa Eyeoglu --- updateNeoForge.py | 1 - 1 file changed, 1 deletion(-) diff --git a/updateNeoForge.py b/updateNeoForge.py index 2ff8be5..1db5b43 100644 --- a/updateNeoForge.py +++ b/updateNeoForge.py @@ -100,7 +100,6 @@ def get_single_forge_files_manifest(longversion, artifact: str): if file_name.startswith("."): continue - print(f"AAAA {file_name}") classifier, ext = os.path.splitext(file_name) if ext in [".md5", ".sha1", ".sha256", ".sha512"]: