diff options
| author | Sefa Eyeoglu <contact@scrumplex.net> | 2022-04-05 14:29:44 +0200 |
|---|---|---|
| committer | Sefa Eyeoglu <contact@scrumplex.net> | 2022-04-05 14:39:03 +0200 |
| commit | eda318131d1e938ee331cc2149a0518e25b7aa76 (patch) | |
| tree | f49dcfd9cb3d6fe6a0ce3b883cb0441cc1945a99 /meta | |
| parent | 7ab37c8658c4c8614a85e5ff729aa4ef3592801f (diff) | |
| download | Project-Tick-eda318131d1e938ee331cc2149a0518e25b7aa76.tar.gz Project-Tick-eda318131d1e938ee331cc2149a0518e25b7aa76.zip | |
refactor: move forge to pydantic models
Diffstat (limited to 'meta')
| -rw-r--r-- | meta/common/forge.py | 17 | ||||
| -rw-r--r-- | meta/forgeutil.py | 323 | ||||
| -rw-r--r-- | meta/model/forge.py | 306 |
3 files changed, 323 insertions, 323 deletions
diff --git a/meta/common/forge.py b/meta/common/forge.py new file mode 100644 index 0000000000..d39249cc0c --- /dev/null +++ b/meta/common/forge.py @@ -0,0 +1,17 @@ +from os.path import join + +BASE_DIR = "forge" + +JARS_DIR = join(BASE_DIR, "jars") +INSTALLER_INFO_DIR = join(BASE_DIR, "installer_info") +INSTALLER_MANIFEST_DIR = join(BASE_DIR, "installer_manifests") +VERSION_MANIFEST_DIR = join(BASE_DIR, "version_manifests") +FILE_MANIFEST_DIR = join(BASE_DIR, "files_manifests") +DERIVED_INDEX_FILE = join(BASE_DIR, "derived_index.json") + +STATIC_LEGACYINFO_FILE = join(BASE_DIR, "forge-legacyinfo.json") + +FORGE_COMPONENT = "net.minecraftforge" + +FORGEWRAPPER_MAVEN = "https://polymc.github.io/files/maven/%s" +BAD_VERSIONS = ["1.12.2-14.23.5.2851"] diff --git a/meta/forgeutil.py b/meta/forgeutil.py deleted file mode 100644 index 4c2615cb8d..0000000000 --- a/meta/forgeutil.py +++ /dev/null @@ -1,323 +0,0 @@ -from collections import namedtuple - -from .metautil import * - - -# A post-processed entry constructed from the reconstructed Forge version index -class ForgeVersion: - def __init__(self, entry): - self.build = entry.build - self.rawVersion = entry.version - self.mcversion = entry.mcversion - self.mcversion_sane = self.mcversion.replace("_pre", "-pre", 1) - self.branch = entry.branch - self.installer_filename = None - self.installer_url = None - self.universal_filename = None - self.universal_url = None - self.changelog_url = None - self.longVersion = "%s-%s" % (self.mcversion, self.rawVersion) - if self.branch != None: - self.longVersion = self.longVersion + "-%s" % (self.branch) - for classifier, fileentry in entry.files.items(): - extension = fileentry.extension - checksum = fileentry.hash - filename = fileentry.filename(self.longVersion) - url = fileentry.url(self.longVersion) - if (classifier == "installer") and (extension == "jar"): - self.installer_filename = filename - self.installer_url = url - if (classifier == "universal" or classifier == "client") and (extension == "jar" or extension == "zip"): - self.universal_filename = filename - self.universal_url = url - if (classifier == "changelog") and (extension == "txt"): - self.changelog_url = url - - def name(self): - return "Forge %d" % (self.build) - - def usesInstaller(self): - if self.installer_url == None: - return False - if self.mcversion == "1.5.2": - return False - return True - - def filename(self): - if self.usesInstaller(): - return self.installer_filename - else: - return self.universal_filename - - def url(self): - if self.usesInstaller(): - return self.installer_url - else: - return self.universal_url - - def isSupported(self): - if self.url() == None: - return False - - versionElements = self.rawVersion.split('.') - if len(versionElements) < 1: - return False - - majorVersionStr = versionElements[0] - if not majorVersionStr.isnumeric(): - return False - - # majorVersion = int(majorVersionStr) - # if majorVersion >= 37: - # return False - - return True - - -class ForgeFile(JsonObject): - classifier = StringProperty(required=True) - hash = StringProperty(required=True) - extension = StringProperty(required=True) - - def filename(self, longversion): - return "%s-%s-%s.%s" % ("forge", longversion, self.classifier, self.extension) - - def url(self, longversion): - return "https://files.minecraftforge.net/maven/net/minecraftforge/forge/%s/%s" % ( - longversion, self.filename(longversion)) - - -class ForgeEntry(JsonObject): - longversion = StringProperty(required=True) - mcversion = StringProperty(required=True) - version = StringProperty(required=True) - build = IntegerProperty(required=True) - branch = StringProperty() - latest = BooleanProperty() - recommended = BooleanProperty() - files = DictProperty(ForgeFile) - - -class ForgeMcVersionInfo(JsonObject): - latest = StringProperty() - recommended = StringProperty() - versions = ListProperty(StringProperty()) - - -class DerivedForgeIndex(JsonObject): - versions = DictProperty(ForgeEntry) - by_mcversion = DictProperty(ForgeMcVersionInfo) - - -''' -FML library mappings - these are added to legacy Forge versions because Forge no longer can download these -by itself - the locations have changed and some of this has to be rehosted on PolyMC servers. -''' - -FMLLib = namedtuple('FMLLib', ('filename', 'checksum', 'ours')) - -fmlLibsMapping = {} - -fmlLibsMapping["1.3.2"] = [ - FMLLib("argo-2.25.jar", "bb672829fde76cb163004752b86b0484bd0a7f4b", False), - FMLLib("guava-12.0.1.jar", "b8e78b9af7bf45900e14c6f958486b6ca682195f", False), - FMLLib("asm-all-4.0.jar", "98308890597acb64047f7e896638e0d98753ae82", False) -] - -fml14 = [ - FMLLib("argo-2.25.jar", "bb672829fde76cb163004752b86b0484bd0a7f4b", False), - FMLLib("guava-12.0.1.jar", "b8e78b9af7bf45900e14c6f958486b6ca682195f", False), - FMLLib("asm-all-4.0.jar", "98308890597acb64047f7e896638e0d98753ae82", False), - FMLLib("bcprov-jdk15on-147.jar", "b6f5d9926b0afbde9f4dbe3db88c5247be7794bb", False) -] -fmlLibsMapping["1.4"] = fml14; -fmlLibsMapping["1.4.1"] = fml14; -fmlLibsMapping["1.4.2"] = fml14; -fmlLibsMapping["1.4.3"] = fml14; -fmlLibsMapping["1.4.4"] = fml14; -fmlLibsMapping["1.4.5"] = fml14; -fmlLibsMapping["1.4.6"] = fml14; -fmlLibsMapping["1.4.7"] = fml14; - -fmlLibsMapping["1.5"] = [ - FMLLib("argo-small-3.2.jar", "58912ea2858d168c50781f956fa5b59f0f7c6b51", False), - FMLLib("guava-14.0-rc3.jar", "931ae21fa8014c3ce686aaa621eae565fefb1a6a", False), - FMLLib("asm-all-4.1.jar", "054986e962b88d8660ae4566475658469595ef58", False), - FMLLib("bcprov-jdk15on-148.jar", "960dea7c9181ba0b17e8bab0c06a43f0a5f04e65", True), - FMLLib("deobfuscation_data_1.5.zip", "5f7c142d53776f16304c0bbe10542014abad6af8", False), - FMLLib("scala-library.jar", "458d046151ad179c85429ed7420ffb1eaf6ddf85", True) -] - -fmlLibsMapping["1.5.1"] = [ - FMLLib("argo-small-3.2.jar", "58912ea2858d168c50781f956fa5b59f0f7c6b51", False), - FMLLib("guava-14.0-rc3.jar", "931ae21fa8014c3ce686aaa621eae565fefb1a6a", False), - FMLLib("asm-all-4.1.jar", "054986e962b88d8660ae4566475658469595ef58", False), - FMLLib("bcprov-jdk15on-148.jar", "960dea7c9181ba0b17e8bab0c06a43f0a5f04e65", True), - FMLLib("deobfuscation_data_1.5.1.zip", "22e221a0d89516c1f721d6cab056a7e37471d0a6", False), - FMLLib("scala-library.jar", "458d046151ad179c85429ed7420ffb1eaf6ddf85", True) -] - -fmlLibsMapping["1.5.2"] = [ - FMLLib("argo-small-3.2.jar", "58912ea2858d168c50781f956fa5b59f0f7c6b51", False), - FMLLib("guava-14.0-rc3.jar", "931ae21fa8014c3ce686aaa621eae565fefb1a6a", False), - FMLLib("asm-all-4.1.jar", "054986e962b88d8660ae4566475658469595ef58", False), - FMLLib("bcprov-jdk15on-148.jar", "960dea7c9181ba0b17e8bab0c06a43f0a5f04e65", True), - FMLLib("deobfuscation_data_1.5.2.zip", "446e55cd986582c70fcf12cb27bc00114c5adfd9", False), - FMLLib("scala-library.jar", "458d046151ad179c85429ed7420ffb1eaf6ddf85", True) -] - -''' -"install": { - "profileName": "Forge", - "target":"Forge8.9.0.753", - "path":"net.minecraftforge:minecraftforge:8.9.0.753", - "version":"Forge 8.9.0.753", - "filePath":"minecraftforge-universal-1.6.1-8.9.0.753.jar", - "welcome":"Welcome to the simple Forge installer.", - "minecraft":"1.6.1", - "logo":"/big_logo.png", - "mirrorList": "http://files.minecraftforge.net/mirror-brand.list" -}, -"install": { - "profileName": "forge", - "target":"1.11-forge1.11-13.19.0.2141", - "path":"net.minecraftforge:forge:1.11-13.19.0.2141", - "version":"forge 1.11-13.19.0.2141", - "filePath":"forge-1.11-13.19.0.2141-universal.jar", - "welcome":"Welcome to the simple forge installer.", - "minecraft":"1.11", - "mirrorList" : "http://files.minecraftforge.net/mirror-brand.list", - "logo":"/big_logo.png", - "modList":"none" -}, -''' - - -class ForgeInstallerProfileInstallSection(JsonObject): - profileName = StringProperty(required=True) - target = StringProperty(required=True) - path = GradleSpecifierProperty(required=True) - version = StringProperty(required=True) - filePath = StringProperty(required=True) - welcome = StringProperty(required=True) - minecraft = StringProperty(required=True) - logo = StringProperty(required=True) - mirrorList = StringProperty(required=True) - modList = StringProperty(exclude_if_none=True, default=None) - - -class ForgeLibrary(MojangLibrary): - url = StringProperty(exclude_if_none=True) - serverreq = BooleanProperty(exclude_if_none=True, default=None) - clientreq = BooleanProperty(exclude_if_none=True, default=None) - checksums = ListProperty(StringProperty) - comment = StringProperty() - - -class ForgeVersionFile(MojangVersionFile): - libraries = ListProperty(ForgeLibrary, exclude_if_none=True, default=None) # overrides Mojang libraries - inheritsFrom = StringProperty() - jar = StringProperty() - - -''' -"optionals": [ - { - "name": "Mercurius", - "client": true, - "server": true, - "default": true, - "inject": true, - "desc": "A mod that collects statistics about Minecraft and your system.<br>Useful for Forge to understand how Minecraft/Forge are used.", - "url": "http://www.minecraftforge.net/forum/index.php?topic=43278.0", - "artifact": "net.minecraftforge:MercuriusUpdater:1.11.2", - "maven": "http://files.minecraftforge.net/maven/" - } -] -''' - - -class ForgeOptional(JsonObject): - name = StringProperty() - client = BooleanProperty() - server = BooleanProperty() - default = BooleanProperty() - inject = BooleanProperty() - desc = StringProperty() - url = StringProperty() - artifact = GradleSpecifierProperty() - maven = StringProperty() - - -class ForgeInstallerProfile(JsonObject): - install = ObjectProperty(ForgeInstallerProfileInstallSection, required=True) - versionInfo = ObjectProperty(ForgeVersionFile, required=True) - optionals = ListProperty(ForgeOptional) - - -class ForgeLegacyInfo(JsonObject): - releaseTime = ISOTimestampProperty() - size = IntegerProperty() - sha256 = StringProperty() - sha1 = StringProperty() - - -class ForgeLegacyInfoList(JsonObject): - number = DictProperty(ForgeLegacyInfo) - - -class DataSpec(JsonObject): - client = StringProperty() - server = StringProperty() - - -class ProcessorSpec(JsonObject): - jar = StringProperty() - classpath = ListProperty(StringProperty) - args = ListProperty(StringProperty) - outputs = DictProperty(StringProperty) - sides = ListProperty(StringProperty, exclude_if_none=True, default=None) - - -# Note: This is only used in one version (1.12.2-14.23.5.2851) and we don't even use the installer profile in it. -# It's here just so it parses and we can continue... -class ForgeInstallerProfileV1_5(JsonObject): - _comment = ListProperty(StringProperty) - spec = IntegerProperty() - profile = StringProperty() - version = StringProperty() - icon = StringProperty() - json = StringProperty() - path = GradleSpecifierProperty() - logo = StringProperty() - minecraft = StringProperty() - welcome = StringProperty() - # We don't know what 'data' actually is in this one. It's an empty array - data = ListProperty(StringProperty) - processors = ListProperty(ProcessorSpec) - libraries = ListProperty(MojangLibrary) - mirrorList = StringProperty(exclude_if_none=True, default=None) - - -class ForgeInstallerProfileV2(JsonObject): - _comment = ListProperty(StringProperty) - spec = IntegerProperty() - profile = StringProperty() - version = StringProperty() - icon = StringProperty() - json = StringProperty() - path = GradleSpecifierProperty() - logo = StringProperty() - minecraft = StringProperty() - welcome = StringProperty() - data = DictProperty(DataSpec) - processors = ListProperty(ProcessorSpec) - libraries = ListProperty(MojangLibrary) - mirrorList = StringProperty(exclude_if_none=True, default=None) - serverJarPath = StringProperty(exclude_if_none=True, default=None) - - -class InstallerInfo(JsonObject): - sha1hash = StringProperty() - sha256hash = StringProperty() - size = IntegerProperty() diff --git a/meta/model/forge.py b/meta/model/forge.py new file mode 100644 index 0000000000..6290cc8dff --- /dev/null +++ b/meta/model/forge.py @@ -0,0 +1,306 @@ +from datetime import datetime +from typing import Optional, List, Dict + +from pydantic import Field + +from . import MetaBase, GradleSpecifier, MojangLibrary +from .mojang import MojangVersion + + +class ForgeFile(MetaBase): + classifier: str + hash: str + extension: str + + def filename(self, longversion): + return "%s-%s-%s.%s" % ("forge", longversion, self.classifier, self.extension) + + def url(self, longversion): + return "https://files.minecraftforge.net/maven/net/minecraftforge/forge/%s/%s" % ( + longversion, self.filename(longversion)) + + +class ForgeEntry(MetaBase): + longversion: str + mcversion: str + version: str + build: int + branch: Optional[str] + latest: Optional[bool] + recommended: Optional[bool] + files: Optional[Dict[str, ForgeFile]] + + +class ForgeMCVersionInfo(MetaBase): + latest: Optional[str] + recommended: Optional[str] + versions: List[str] = Field([]) + + +class DerivedForgeIndex(MetaBase): + versions: Dict[str, ForgeEntry] = Field({}) + by_mcversion: Dict[str, ForgeMCVersionInfo] = Field({}) + + +class FMLLib(MetaBase): # old ugly stuff. Maybe merge this with Library or MojangLibrary later + filename: str + checksum: str + ours: bool + + +class ForgeInstallerProfileInstallSection(MetaBase): + """ + "install": { + "profileName": "Forge", + "target":"Forge8.9.0.753", + "path":"net.minecraftforge:minecraftforge:8.9.0.753", + "version":"Forge 8.9.0.753", + "filePath":"minecraftforge-universal-1.6.1-8.9.0.753.jar", + "welcome":"Welcome to the simple Forge installer.", + "minecraft":"1.6.1", + "logo":"/big_logo.png", + "mirrorList": "http://files.minecraftforge.net/mirror-brand.list" + }, + "install": { + "profileName": "forge", + "target":"1.11-forge1.11-13.19.0.2141", + "path":"net.minecraftforge:forge:1.11-13.19.0.2141", + "version":"forge 1.11-13.19.0.2141", + "filePath":"forge-1.11-13.19.0.2141-universal.jar", + "welcome":"Welcome to the simple forge installer.", + "minecraft":"1.11", + "mirrorList" : "http://files.minecraftforge.net/mirror-brand.list", + "logo":"/big_logo.png", + "modList":"none" + }, + """ + profileName: str + target: str + path: GradleSpecifier + version: str + filePath: str + welcome: str + minecraft: str + logo: str + mirrorList: str + modList: Optional[str] + + +class ForgeLibrary(MojangLibrary): + url: Optional[str] + serverreq: Optional[bool] + clientreq: Optional[bool] + checksums: Optional[List[str]] + comment: Optional[str] + + +class ForgeVersionFile(MojangVersion): + libraries: Optional[List[ForgeLibrary]] # overrides Mojang libraries + inheritsFrom: Optional[str] + jar: Optional[str] + + +class ForgeOptional(MetaBase): + """ + "optionals": [ + { + "name": "Mercurius", + "client": true, + "server": true, + "default": true, + "inject": true, + "desc": "A mod that collects statistics about Minecraft and your system.<br>Useful for Forge to understand how Minecraft/Forge are used.", + "url": "http://www.minecraftforge.net/forum/index.php?topic=43278.0", + "artifact": "net.minecraftforge:MercuriusUpdater:1.11.2", + "maven": "http://files.minecraftforge.net/maven/" + } + ] + """ + name: Optional[str] + client: Optional[bool] + server: Optional[bool] + default: Optional[bool] + inject: Optional[bool] + desc: Optional[str] + url: Optional[str] + artifact: Optional[GradleSpecifier] + maven: Optional[str] + + +class ForgeInstallerProfile(MetaBase): + install: ForgeInstallerProfileInstallSection + versionInfo: ForgeVersionFile + optionals: Optional[List[ForgeOptional]] + + +class ForgeLegacyInfo(MetaBase): + releaseTime: Optional[datetime] + size: Optional[int] + sha256: Optional[str] + sha1: Optional[str] + + +class ForgeLegacyInfoList(MetaBase): + number: Dict[str, ForgeLegacyInfo] = Field({}) + + +class DataSpec(MetaBase): + client: Optional[str] + server: Optional[str] + + +class ProcessorSpec(MetaBase): + jar: Optional[str] + classpath: Optional[List[str]] + args: Optional[List[str]] + outputs: Optional[Dict[str, str]] + sides: Optional[List[str]] + + +class ForgeInstallerProfileV2(MetaBase): + _comment: Optional[List[str]] + spec: Optional[int] + profile: Optional[str] + version: Optional[str] + icon: Optional[str] + json_data: Optional[str] = Field(alias="json") + path: Optional[GradleSpecifier] + logo: Optional[str] + minecraft: Optional[str] + welcome: Optional[str] + data: Optional[Dict[str, DataSpec]] + processors: Optional[List[ProcessorSpec]] + libraries: Optional[List[MojangLibrary]] + mirrorList: Optional[str] + serverJarPath: Optional[str] + + +class InstallerInfo(MetaBase): + sha1hash: Optional[str] + sha256hash: Optional[str] + size: Optional[int] + + +def fml_libs_for_version(mc_version: str) -> List[FMLLib]: + argo_2_25 = FMLLib(filename="argo-2.25.jar", + checksum="bb672829fde76cb163004752b86b0484bd0a7f4b", + ours=False) + argo_small_3_2 = FMLLib(filename="argo-small-3.2.jar", + checksum="58912ea2858d168c50781f956fa5b59f0f7c6b51", + ours=False) + guava_12_0_1 = FMLLib(filename="guava-12.0.1.jar", + checksum="b8e78b9af7bf45900e14c6f958486b6ca682195f", + ours=False) + guava_14_0_rc3 = FMLLib(filename="guava-14.0-rc3.jar", + checksum="931ae21fa8014c3ce686aaa621eae565fefb1a6a", + ours=False) + asm_all_4_0 = FMLLib(filename="asm-all-4.0.jar", + checksum="98308890597acb64047f7e896638e0d98753ae82", + ours=False) + asm_all_4_1 = FMLLib(filename="asm-all-4.1.jar", + checksum="054986e962b88d8660ae4566475658469595ef58", + ours=False) + bcprov_jdk15on_147 = FMLLib(filename="bcprov-jdk15on-147.jar", + checksum="b6f5d9926b0afbde9f4dbe3db88c5247be7794bb", + ours=False) + bcprov_jdk15on_148 = FMLLib(filename="bcprov-jdk15on-148.jar", + checksum="960dea7c9181ba0b17e8bab0c06a43f0a5f04e65", + ours=True) + scala_library = FMLLib(filename="scala-library.jar", + checksum="458d046151ad179c85429ed7420ffb1eaf6ddf85", + ours=True) + + deobfuscation_data_1_5 = FMLLib(filename="deobfuscation_data_1.5.zip", + checksum="5f7c142d53776f16304c0bbe10542014abad6af8", + ours=False) + + deobfuscation_data_1_5_1 = FMLLib(filename="deobfuscation_data_1.5.1.zip", + checksum="22e221a0d89516c1f721d6cab056a7e37471d0a6", + ours=False) + deobfuscation_data_1_5_2 = FMLLib(filename="deobfuscation_data_1.5.2.zip", + checksum="446e55cd986582c70fcf12cb27bc00114c5adfd9", + ours=False) + if mc_version == "1.3.2": + return [argo_2_25, guava_12_0_1, asm_all_4_0] + elif mc_version in ["1.4", "1.4.1", "1.4.2", "1.4.3", "1.4.4", "1.4.5", "1.4.6", "1.4.7"]: + return [argo_2_25, guava_12_0_1, asm_all_4_0, bcprov_jdk15on_147] + elif mc_version == "1.5": + return [argo_small_3_2, guava_14_0_rc3, asm_all_4_1, bcprov_jdk15on_148, deobfuscation_data_1_5, + scala_library] + elif mc_version == "1.5.1": + return [argo_small_3_2, guava_14_0_rc3, asm_all_4_1, bcprov_jdk15on_148, deobfuscation_data_1_5_1, + scala_library] + elif mc_version == "1.5.2": + return [argo_small_3_2, guava_14_0_rc3, asm_all_4_1, bcprov_jdk15on_148, deobfuscation_data_1_5_2, + scala_library] + return [] + + +# A post-processed entry constructed from the reconstructed Forge version index +class ForgeVersion: + def __init__(self, entry: ForgeEntry): + self.build = entry.build + self.rawVersion = entry.version + self.mcversion = entry.mcversion + self.mcversion_sane = self.mcversion.replace("_pre", "-pre", 1) + self.branch = entry.branch + self.installer_filename = None + self.installer_url = None + self.universal_filename = None + self.universal_url = None + self.changelog_url = None + self.longVersion = "%s-%s" % (self.mcversion, self.rawVersion) + if self.branch is not None: + self.longVersion = self.longVersion + "-%s" % self.branch + + # this comment's whole purpose is to say this: cringe + for classifier, file in entry.files.items(): + extension = file.extension + filename = file.filename(self.longVersion) + url = file.url(self.longVersion) + if (classifier == "installer") and (extension == "jar"): + self.installer_filename = filename + self.installer_url = url + if (classifier == "universal" or classifier == "client") and (extension == "jar" or extension == "zip"): + self.universal_filename = filename + self.universal_url = url + if (classifier == "changelog") and (extension == "txt"): + self.changelog_url = url + + def name(self): + return "Forge %d" % self.build + + def uses_installer(self): + if self.installer_url is None: + return False + if self.mcversion == "1.5.2": + return False + return True + + def filename(self): + if self.uses_installer(): + return self.installer_filename + return self.universal_filename + + def url(self): + if self.uses_installer(): + return self.installer_url + return self.universal_url + + def is_supported(self): + if self.url() is None: + return False + + foo = self.rawVersion.split('.') + if len(foo) < 1: + return False + + major_version = foo[0] + if not major_version.isnumeric(): + return False + + # majorVersion = int(majorVersionStr) + # if majorVersion >= 37: + # return False + + return True |
