Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Legacy Fabric #5

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions fabricutil.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,31 @@
from metautil import *
import jsonobject

variants = {
"fabric": {
"name": "Fabric Loader",
"description": "Fabric Loader is a tool to load Fabric-compatible mods in game environments.",
"url": "https://fabricmc.net",
"authors": ["Fabric Developers"],
"meta": "https://meta.fabricmc.net",
"maven": "https://maven.fabricmc.net",
"loader_uid": "net.fabricmc.fabric-loader",
"intermediary_uid": "net.fabricmc.intermediary",
"exclude": [],
},
"legacy-fabric": {
"name": "Fabric Loader 1.8.9",
"description": "Fabric Loader for 1.8.9 and below.",
"url": "https://legacyfabric.net",
"authors": ["Legacy Fabric Developers"],
"meta": "https://meta.legacyfabric.net",
"maven": "https://maven.legacyfabric.net",
"loader_uid": "net.legacyfabric.fabric-loader-189",
"intermediary_uid": "net.legacyfabric.intermediary",
"exclude": ["fabric-loader"],
},
}

# barebones semver-like parser
def isFabricVerStable(ver):
s = ver.split("+")
Expand Down
113 changes: 67 additions & 46 deletions generateFabric.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,21 +15,18 @@ def mkdirs(path):
if not os.path.exists(path):
os.makedirs(path)

mkdirs("multimc/net.fabricmc.fabric-loader")
mkdirs("multimc/net.fabricmc.intermediary")

def loadJarInfo(mavenKey):
with open("upstream/fabric/jars/" + mavenKey.replace(":", ".") + ".json", 'r', encoding='utf-8') as jarInfoFile:
def loadJarInfo(mavenKey, variantName):
with open(f"upstream/{variantName}/jars/" + mavenKey.replace(":", ".") + ".json", 'r', encoding='utf-8') as jarInfoFile:
return FabricJarInfo(json.load(jarInfoFile))

def processLoaderVersion(loaderVersion, it, loaderData):
def processLoaderVersion(loaderVersion, it, loaderData, variantName, variant):
verStable = isFabricVerStable(loaderVersion)
if (len(loaderRecommended) < 1) and verStable:
loaderRecommended.append(loaderVersion)
versionJarInfo = loadJarInfo(it["maven"])
version = MultiMCVersionFile(name="Fabric Loader", uid="net.fabricmc.fabric-loader", version=loaderVersion)
versionJarInfo = loadJarInfo(it["maven"], variantName)
version = MultiMCVersionFile(name=variant["name"], uid=variant["loader_uid"], version=loaderVersion)
version.releaseTime = versionJarInfo.releaseTime
version.requires = [DependencyEntry(uid='net.fabricmc.intermediary')]
version.requires = [DependencyEntry(uid=variant["intermediary_uid"])]
version.order = 10
if verStable:
version.type = "release"
Expand All @@ -42,58 +39,82 @@ def processLoaderVersion(loaderVersion, it, loaderData):
version.libraries = []
version.libraries.extend(loaderData.libraries.common)
version.libraries.extend(loaderData.libraries.client)
loaderLib = MultiMCLibrary(name=GradleSpecifier(it["maven"]), url="https://maven.fabricmc.net")
loaderLib = MultiMCLibrary(name=GradleSpecifier(it["maven"]), url=variant["maven"])
version.libraries.append(loaderLib)
loaderVersions.append(version)

def processIntermediaryVersion(it):
def processIntermediaryVersion(it, variantName, variant):
intermediaryRecommended.append(it["version"])
versionJarInfo = loadJarInfo(it["maven"])
version = MultiMCVersionFile(name="Intermediary Mappings", uid="net.fabricmc.intermediary", version=it["version"])
versionJarInfo = loadJarInfo(it["maven"], variantName)
version = MultiMCVersionFile(name="Intermediary Mappings", uid=variant["intermediary_uid"], version=it["version"])
version.releaseTime = versionJarInfo.releaseTime
version.requires = [DependencyEntry(uid='net.minecraft', equals=it["version"])]
version.order = 11
version.type = "release"
version.libraries = []
version.volatile = True
mappingLib = MultiMCLibrary(name=GradleSpecifier(it["maven"]), url="https://maven.fabricmc.net")
mappingLib = MultiMCLibrary(name=GradleSpecifier(it["maven"]), url=variant["maven"])
version.libraries.append(mappingLib)
intermediaryVersions.append(version)

with open("upstream/fabric/meta-v2/loader.json", 'r', encoding='utf-8') as loaderVersionIndexFile:
loaderVersionIndex = json.load(loaderVersionIndexFile)
for it in loaderVersionIndex:
version = it["version"]
with open("upstream/fabric/loader-installer-json/" + version + ".json", 'r', encoding='utf-8') as loaderVersionFile:
ldata = json.load(loaderVersionFile)
ldata = FabricInstallerDataV1(ldata)
processLoaderVersion(version, it, ldata)
for variantName, variant in variants.items():
print(f"--- {variantName} ---")

loaderRecommended.clear()
loaderVersions.clear()
intermediaryRecommended.clear()
intermediaryVersions.clear()

mkdirs(f"multimc/{variant['loader_uid']}")
mkdirs(f"multimc/{variant['intermediary_uid']}")

print("Processing loader versions...")
with open(f"upstream/{variantName}/meta-v2/loader.json", 'r', encoding='utf-8') as loaderVersionIndexFile:
loaderVersionIndex = json.load(loaderVersionIndexFile)
for it in loaderVersionIndex:
if "name" in it and it["name"] in variant["exclude"]:
continue

version = it["version"]
print(f"Processing {version}...")
with open(f"upstream/{variantName}/loader-installer-json/" + version + ".json", 'r', encoding='utf-8') as loaderVersionFile:
ldata = json.load(loaderVersionFile)
ldata = FabricInstallerDataV1(ldata)
processLoaderVersion(version, it, ldata, variantName, variant)

with open("upstream/fabric/meta-v2/intermediary.json", 'r', encoding='utf-8') as intermediaryVersionIndexFile:
intermediaryVersionIndex = json.load(intermediaryVersionIndexFile)
for it in intermediaryVersionIndex:
processIntermediaryVersion(it)
print("Processing Intermediary versions...")
with open(f"upstream/{variantName}/meta-v2/intermediary.json", 'r', encoding='utf-8') as intermediaryVersionIndexFile:
intermediaryVersionIndex = json.load(intermediaryVersionIndexFile)
for it in intermediaryVersionIndex:
print(f"Processing {it['version']}...")
processIntermediaryVersion(it, variantName, variant)

for version in loaderVersions:
outFilepath = "multimc/net.fabricmc.fabric-loader/%s.json" % version.version
with open(outFilepath, 'w') as outfile:
json.dump(version.to_json(), outfile, sort_keys=True, indent=4)
print("Writing loader versions...")
for version in loaderVersions:
print(f"Writing {version.version}...")
outFilepath = f"multimc/{variant['loader_uid']}/%s.json" % version.version
with open(outFilepath, 'w') as outfile:
json.dump(version.to_json(), outfile, sort_keys=True, indent=4)

sharedData = MultiMCSharedPackageData(uid = 'net.fabricmc.fabric-loader', name = 'Fabric Loader')
sharedData.recommended = loaderRecommended
sharedData.description = "Fabric Loader is a tool to load Fabric-compatible mods in game environments."
sharedData.projectUrl = "https://fabricmc.net"
sharedData.authors = ["Fabric Developers"]
sharedData.write()
print("Writing shared loader data...")
sharedData = MultiMCSharedPackageData(uid = variant["loader_uid"], name = variant["name"])
sharedData.recommended = loaderRecommended
sharedData.description = variant["description"]
sharedData.projectUrl = variant["url"]
sharedData.authors = variant["authors"]
sharedData.write()

for version in intermediaryVersions:
outFilepath = "multimc/net.fabricmc.intermediary/%s.json" % version.version
with open(outFilepath, 'w') as outfile:
json.dump(version.to_json(), outfile, sort_keys=True, indent=4)
print("Writing Intermediary versions...")
for version in intermediaryVersions:
print(f"Writing {version.version}...")
outFilepath = f"multimc/{variant['intermediary_uid']}/%s.json" % version.version
with open(outFilepath, 'w') as outfile:
json.dump(version.to_json(), outfile, sort_keys=True, indent=4)

sharedData = MultiMCSharedPackageData(uid = 'net.fabricmc.intermediary', name = 'Intermediary Mappings')
sharedData.recommended = intermediaryRecommended
sharedData.description = "Intermediary mappings allow using Fabric Loader with mods for Minecraft in a more compatible manner."
sharedData.projectUrl = "https://fabricmc.net"
sharedData.authors = ["Fabric Developers"]
sharedData.write()
print("Writing shared Intermediary data...")
sharedData = MultiMCSharedPackageData(uid = variant["intermediary_uid"], name = 'Intermediary Mappings')
sharedData.recommended = intermediaryRecommended
sharedData.description = "Intermediary mappings allow using Fabric Loader with mods for Minecraft in a more compatible manner."
sharedData.projectUrl = variant["url"]
sharedData.authors = variant["authors"]
sharedData.write()
46 changes: 30 additions & 16 deletions updateFabric.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ def filehash(filename, hashtype, blocksize=65536):

def get_maven_url(mavenKey, server, ext):
mavenParts = mavenKey.split(":", 3)
mavenVerUrl = server + mavenParts[0].replace(".", "/") + "/" + mavenParts[1] + "/" + mavenParts[2] + "/"
mavenVerUrl = server + "/" + mavenParts[0].replace(".", "/") + "/" + mavenParts[1] + "/" + mavenParts[2] + "/"
mavenUrl = mavenVerUrl + mavenParts[1] + "-" + mavenParts[2] + ext
return mavenUrl

Expand Down Expand Up @@ -62,20 +62,34 @@ def compute_jar_file(path, url):
with open(path + ".json", 'w') as outfile:
json.dump(data.to_json(), outfile, sort_keys=True, indent=4)

mkdirs("upstream/fabric/meta-v2")
mkdirs("upstream/fabric/loader-installer-json")
mkdirs("upstream/fabric/jars")
for variantName, variant in variants.items():
mkdirs(f"upstream/{variantName}/meta-v2")
mkdirs(f"upstream/{variantName}/loader-installer-json")
mkdirs(f"upstream/{variantName}/jars")

# get the version list for each component we are interested in
for component in ["intermediary", "loader"]:
index = get_json_file("upstream/fabric/meta-v2/" + component + ".json", "https://meta.fabricmc.net/v2/versions/" + component)
for it in index:
jarMavenUrl = get_maven_url(it["maven"], "https://maven.fabricmc.net/", ".jar")
compute_jar_file("upstream/fabric/jars/" + it["maven"].replace(":", "."), jarMavenUrl)
print(f"--- {variantName} ---")

# for each loader, download installer JSON file from maven
with open("upstream/fabric/meta-v2/loader.json", 'r', encoding='utf-8') as loaderVersionIndexFile:
loaderVersionIndex = json.load(loaderVersionIndexFile)
for it in loaderVersionIndex:
mavenUrl = get_maven_url(it["maven"], "https://maven.fabricmc.net/", ".json")
get_json_file("upstream/fabric/loader-installer-json/" + it["version"] + ".json", mavenUrl)
# get the version list for each component we are interested in
for component in ["intermediary", "loader"]:
print(f"Downloading {component} versions...")
index = get_json_file(f"upstream/{variantName}/meta-v2/" + component + ".json", f"{variant['meta']}/v2/versions/" + component)
for it in index:
if "name" in it and it["name"] in variant["exclude"]:
continue

print(f"Downloading {it['maven']} jar...")
jarMavenUrl = get_maven_url(it["maven"], variant["maven"], ".jar")
compute_jar_file(f"upstream/{variantName}/jars/" + it["maven"].replace(":", "."), jarMavenUrl)

print("Downloading installer metadata...")

# for each loader, download installer JSON file from maven
with open(f"upstream/{variantName}/meta-v2/loader.json", 'r', encoding='utf-8') as loaderVersionIndexFile:
loaderVersionIndex = json.load(loaderVersionIndexFile)
for it in loaderVersionIndex:
if "name" in it and it["name"] in variant["exclude"]:
continue

print(f"Downloading {it['maven']} installer metadata...")
mavenUrl = get_maven_url(it["maven"], variant["maven"], ".json")
get_json_file(f"upstream/{variantName}/loader-installer-json/" + it["version"] + ".json", mavenUrl)