Merge pull request #2 from txtsd/mmc_to_pmc

Purge all MultiMC references and sundry
This commit is contained in:
swirl 2022-01-29 15:37:16 -05:00 committed by GitHub
commit 4fc08323cc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
22 changed files with 373 additions and 313 deletions

2
.gitignore vendored
View File

@ -1,5 +1,5 @@
http_cache
multimc
polymc
upstream
forgemaven
forge_cache

36
README.md Normal file
View File

@ -0,0 +1,36 @@
# PolyMC Meta
Scripts to generate jsons and jars that PolyMC will access.
## Usage
### Install the dependencies
As root:
```
sudo pip install requirements.txt
```
Or as user:
```
pip install --user requirements.txt
```
### Initial setup
This will clone [meta-polymc](https://github.com/PolyMC/meta-polymc) and [meta-upstream](https://github.com/PolyMC/meta-upstream)
```
./clone.sh
```
### Generate files
This will run the main script and do its magic
```
./update.sh
```
### Check status of meta-polymc and meta-upstream
```
./status.sh
```

View File

@ -12,6 +12,6 @@ if [ ! -d "${UPSTREAM_DIR}" ]; then
git clone ${UPSTREAM_REPO} ${UPSTREAM_DIR}
fi
if [ ! -d "${MMC_DIR}" ]; then
git clone ${MMC_REPO} ${MMC_DIR}
if [ ! -d "${PMC_DIR}" ]; then
git clone ${PMC_REPO} ${PMC_DIR}
fi

View File

@ -1,7 +1,7 @@
export UPSTREAM_DIR=upstream
export UPSTREAM_REPO=git@github.com:PolyMC/meta-upstream.git
export MMC_DIR=multimc
export MMC_REPO=git@github.com:PolyMC/meta-polymc.git
export PMC_DIR=polymc
export PMC_REPO=git@github.com:PolyMC/meta-polymc.git
export BRANCH_master=master
export BRANCH_develop=develop
export DEPLOY_TO_S3=false

View File

@ -1,6 +1,6 @@
export MODE=master
export GIT_AUTHOR_NAME="Petr Mrázek"
export GIT_AUTHOR_EMAIL="peterix@gmail.com"
export GIT_AUTHOR_NAME="Herpington Derpson"
export GIT_AUTHOR_EMAIL="herpderp@derpmail.com"
export GIT_COMMITTER_NAME="$GIT_AUTHOR_NAME"
export GIT_COMMITTER_EMAIL="$GIT_AUTHOR_EMAIL"
export DEPLOY_TO_S3=false

View File

@ -1,20 +1,21 @@
#!/usr/bin/python3
from __future__ import print_function
import sys
import os
import re
from metautil import *
from forgeutil import *
from jsonobject import *
import sys
from distutils.version import LooseVersion
from enum import Enum
import requests
from cachecontrol import CacheControl
from cachecontrol.caches import FileCache
from forgeutil import *
from jsonobject import *
from metautil import *
#with open('multimc/index.json', 'r', encoding='utf-8') as index:
#packages = MultiMCPackageIndex(json.load(index))
PMC_DIR = os.environ["PMC_DIR"]
#with open(PMC_DIR + '/index.json', 'r', encoding='utf-8') as index:
#packages = PolyMCPackageIndex(json.load(index))
#for entry in packages.packages:
#print (entry)
@ -54,17 +55,17 @@ class MojangLibrary (JsonObject):
natives = DictProperty(StringProperty, exclude_if_none=True, default=None)
rules = ListProperty(MojangRule, exclude_if_none=True, default=None)
class MultiMCLibrary (MojangLibrary):
class PolyMCLibrary (MojangLibrary):
url = StringProperty(exclude_if_none=True, default=None)
mmcHint = StringProperty(name="MMC-hint", exclude_if_none=True, default=None)
pmcHint = StringProperty(name="PMC-hint", exclude_if_none=True, default=None)
def GetLibraryDownload (library : MultiMCLibrary):
def GetLibraryDownload (library : PolyMCLibrary):
if library.natives:
raise Exception('Natives are not handled yet')
name = library.name
if library.mmcHint == 'forge-pack-xz':
if library.pmcHint == 'forge-pack-xz':
kind = DownloadType.FORGE_XZ
name.extension = 'jar.pack.xz'
else:
@ -86,16 +87,16 @@ def GetLibraryDownload (library : MultiMCLibrary):
return DownloadEntry(url, kind, name)
with open('multimc/net.minecraftforge/index.json', 'r', encoding='utf-8') as forgeIndex:
forgeVersions = MultiMCVersionIndex(json.load(forgeIndex))
with open(PMC_DIR + '/net.minecraftforge/index.json', 'r', encoding='utf-8') as forgeIndex:
forgeVersions = PolyMCVersionIndex(json.load(forgeIndex))
urlSet = set()
for entry in forgeVersions.versions:
versionString = entry.version
versionPath = "multimc/net.minecraftforge/%s.json" % versionString
versionPath = PMC_DIR + "/net.minecraftforge/%s.json" % versionString
with open(versionPath, 'r') as infile:
forgeVersion = MultiMCVersionFile(json.load(infile))
forgeVersion = PolyMCVersionFile(json.load(infile))
if forgeVersion.libraries:
for entry in forgeVersion.libraries:
urlSet.add(GetLibraryDownload(entry))

View File

@ -1,5 +1,6 @@
from metautil import *
import jsonobject
from metautil import *
class FabricInstallerArguments(JsonObject):
client = ListProperty(StringProperty)
@ -10,9 +11,9 @@ class FabricInstallerLaunchwrapper(JsonObject):
tweakers = ObjectProperty(FabricInstallerArguments, required=True)
class FabricInstallerLibraries(JsonObject):
client = ListProperty(MultiMCLibrary)
common = ListProperty(MultiMCLibrary)
server = ListProperty(MultiMCLibrary)
client = ListProperty(PolyMCLibrary)
common = ListProperty(PolyMCLibrary)
server = ListProperty(PolyMCLibrary)
class FabricInstallerDataV1(JsonObject):
version = IntegerProperty(required=True)

View File

@ -1,6 +1,8 @@
from metautil import *
from collections import namedtuple
from metautil import *
# A post-processed entry constructed from the reconstructed Forge version index
class ForgeVersion:
def __init__(self, entry):
@ -103,7 +105,7 @@ class DerivedForgeIndex(JsonObject):
'''
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 MultiMC servers.
by itself - the locations have changed and some of this has to be rehosted on PolyMC servers.
'''
FMLLib = namedtuple('FMLLib', ('filename', 'checksum', 'ours'))

View File

@ -1,9 +1,13 @@
#!/usr/bin/python3
from fabricutil import *
from jsonobject import *
import copy
import os
from datetime import datetime
from pprint import pprint
import os, copy
from fabricutil import *
from jsonobject import *
PMC_DIR = os.environ["PMC_DIR"]
UPSTREAM_DIR = os.environ["UPSTREAM_DIR"]
# turn loader versions into packages
loaderRecommended = []
@ -15,11 +19,11 @@ def mkdirs(path):
if not os.path.exists(path):
os.makedirs(path)
mkdirs("multimc/net.fabricmc.fabric-loader")
mkdirs("multimc/net.fabricmc.intermediary")
mkdirs(PMC_DIR + "/net.fabricmc.fabric-loader")
mkdirs(PMC_DIR + "/net.fabricmc.intermediary")
def loadJarInfo(mavenKey):
with open("upstream/fabric/jars/" + mavenKey.replace(":", ".") + ".json", 'r', encoding='utf-8') as jarInfoFile:
with open(UPSTREAM_DIR + "/fabric/jars/" + mavenKey.replace(":", ".") + ".json", 'r', encoding='utf-8') as jarInfoFile:
return FabricJarInfo(json.load(jarInfoFile))
def processLoaderVersion(loaderVersion, it, loaderData):
@ -27,7 +31,7 @@ def processLoaderVersion(loaderVersion, it, loaderData):
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)
version = PolyMCVersionFile(name="Fabric Loader", uid="net.fabricmc.fabric-loader", version=loaderVersion)
version.releaseTime = versionJarInfo.releaseTime
version.requires = [DependencyEntry(uid='net.fabricmc.intermediary')]
version.order = 10
@ -39,44 +43,44 @@ 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 = PolyMCLibrary(name=GradleSpecifier(it["maven"]), url="https://maven.fabricmc.net")
version.libraries.append(loaderLib)
loaderVersions.append(version)
def processIntermediaryVersion(it):
intermediaryRecommended.append(it["version"])
versionJarInfo = loadJarInfo(it["maven"])
version = MultiMCVersionFile(name="Intermediary Mappings", uid="net.fabricmc.intermediary", version=it["version"])
version = PolyMCVersionFile(name="Intermediary Mappings", uid="net.fabricmc.intermediary", 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 = PolyMCLibrary(name=GradleSpecifier(it["maven"]), url="https://maven.fabricmc.net")
version.libraries.append(mappingLib)
intermediaryVersions.append(version)
with open("upstream/fabric/meta-v2/loader.json", 'r', encoding='utf-8') as loaderVersionIndexFile:
with open(UPSTREAM_DIR + "/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:
with open(UPSTREAM_DIR + "/fabric/loader-installer-json/" + version + ".json", 'r', encoding='utf-8') as loaderVersionFile:
ldata = json.load(loaderVersionFile)
ldata = FabricInstallerDataV1(ldata)
processLoaderVersion(version, it, ldata)
with open("upstream/fabric/meta-v2/intermediary.json", 'r', encoding='utf-8') as intermediaryVersionIndexFile:
with open(UPSTREAM_DIR + "/fabric/meta-v2/intermediary.json", 'r', encoding='utf-8') as intermediaryVersionIndexFile:
intermediaryVersionIndex = json.load(intermediaryVersionIndexFile)
for it in intermediaryVersionIndex:
processIntermediaryVersion(it)
for version in loaderVersions:
outFilepath = "multimc/net.fabricmc.fabric-loader/%s.json" % version.version
outFilepath = PMC_DIR + "/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)
sharedData = MultiMCSharedPackageData(uid = 'net.fabricmc.fabric-loader', name = 'Fabric Loader')
sharedData = PolyMCSharedPackageData(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"
@ -84,11 +88,11 @@ sharedData.authors = ["Fabric Developers"]
sharedData.write()
for version in intermediaryVersions:
outFilepath = "multimc/net.fabricmc.intermediary/%s.json" % version.version
outFilepath = PMC_DIR + "/net.fabricmc.intermediary/%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 = PolyMCSharedPackageData(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"

View File

@ -1,12 +1,14 @@
#!/usr/bin/python3
from __future__ import print_function
import sys
import os
import re
from metautil import *
import sys
from distutils.version import LooseVersion
from forgeutil import *
from jsonobject import *
from distutils.version import LooseVersion
from metautil import *
PMC_DIR = os.environ["PMC_DIR"]
UPSTREAM_DIR = os.environ["UPSTREAM_DIR"]
def eprint(*args, **kwargs):
print(*args, file=sys.stderr, **kwargs)
@ -17,8 +19,8 @@ def loadMcVersionFilter(version):
if version in mcVersionCache:
return mcVersionCache[version]
libSet = set()
with open("multimc/net.minecraft/%s.json" % version, 'r', encoding='utf-8') as mcFile:
mcVersion = MultiMCVersionFile(json.load(mcFile))
with open(PMC_DIR + "/net.minecraft/%s.json" % version, 'r', encoding='utf-8') as mcFile:
mcVersion = PolyMCVersionFile(json.load(mcFile))
for lib in mcVersion.libraries:
libSet.add(lib.name)
mcVersionCache[version] = libSet
@ -46,7 +48,7 @@ def shouldIgnoreArtifact(libSet, match):
return False
def versionFromProfile(profile, version):
result = MultiMCVersionFile({"name":"Forge", "version":version.rawVersion, "uid":"net.minecraftforge" })
result = PolyMCVersionFile({"name":"Forge", "version":version.rawVersion, "uid":"net.minecraftforge" })
mcversion = profile.install.minecraft
result.requires = [DependencyEntry(uid='net.minecraft', equals=mcversion)]
result.mainClass = profile.versionInfo.mainClass
@ -80,13 +82,13 @@ def versionFromProfile(profile, version):
fixedName.version = "%s-%s" % (mcversion, fixedName.version)
elif fixedName.artifact == "forge":
fixedName.classifier = "universal"
ourLib = MultiMCLibrary(name=fixedName)
ourLib = PolyMCLibrary(name=fixedName)
if forgeLib.url == "http://files.minecraftforge.net/maven/":
ourLib.url = "https://maven.minecraftforge.net/"
else:
ourLib.url = forgeLib.url
#if forgeLib.checksums and len(forgeLib.checksums) == 2:
# ourLib.mmcHint = "forge-pack-xz"
# ourLib.pmcHint = "forge-pack-xz"
libs.append(ourLib)
result.libraries = libs
result.order = 5
@ -94,7 +96,7 @@ def versionFromProfile(profile, version):
def versionFromModernizedInstaller(installerVersion : MojangVersionFile, version: ForgeVersion):
eprint("Generating Modernized Forge %s." % version.longVersion)
result = MultiMCVersionFile({"name":"Forge", "version":version.rawVersion, "uid":"net.minecraftforge" })
result = PolyMCVersionFile({"name":"Forge", "version":version.rawVersion, "uid":"net.minecraftforge" })
mcversion = version.mcversion
result.requires = [DependencyEntry(uid='net.minecraft', equals=mcversion)]
result.mainClass = installerVersion.mainClass
@ -114,40 +116,40 @@ def versionFromModernizedInstaller(installerVersion : MojangVersionFile, version
libs = []
mcFilter = loadMcVersionFilter(mcversion)
for upstreamLib in installerVersion.libraries:
mmcLib = MultiMCLibrary(upstreamLib.to_json())
if mmcLib.name.isLwjgl():
pmcLib = PolyMCLibrary(upstreamLib.to_json())
if pmcLib.name.isLwjgl():
continue
if mmcLib.name.isLog4j():
if pmcLib.name.isLog4j():
continue
if shouldIgnoreArtifact(mcFilter, mmcLib.name):
if shouldIgnoreArtifact(mcFilter, pmcLib.name):
continue
if mmcLib.name.group == "net.minecraftforge":
if mmcLib.name.artifact == "forge":
fixedName = mmcLib.name
if pmcLib.name.group == "net.minecraftforge":
if pmcLib.name.artifact == "forge":
fixedName = pmcLib.name
fixedName.classifier = "universal"
mmcLib.downloads.artifact.path = fixedName.getPath()
mmcLib.downloads.artifact.url = "https://files.minecraftforge.net/maven/%s" % fixedName.getPath()
mmcLib.name = fixedName
libs.append(mmcLib)
pmcLib.downloads.artifact.path = fixedName.getPath()
pmcLib.downloads.artifact.url = "https://files.minecraftforge.net/maven/%s" % fixedName.getPath()
pmcLib.name = fixedName
libs.append(pmcLib)
continue
elif mmcLib.name.artifact == "minecraftforge":
fixedName = mmcLib.name
elif pmcLib.name.artifact == "minecraftforge":
fixedName = pmcLib.name
fixedName.artifact = "forge"
fixedName.classifier = "universal"
fixedName.version = "%s-%s" % (mcversion, fixedName.version)
mmcLib.downloads.artifact.path = fixedName.getPath()
mmcLib.downloads.artifact.url = "https://files.minecraftforge.net/maven/%s" % fixedName.getPath()
mmcLib.name = fixedName
libs.append(mmcLib)
pmcLib.downloads.artifact.path = fixedName.getPath()
pmcLib.downloads.artifact.url = "https://files.minecraftforge.net/maven/%s" % fixedName.getPath()
pmcLib.name = fixedName
libs.append(pmcLib)
continue
libs.append(mmcLib)
libs.append(pmcLib)
result.libraries = libs
result.order = 5
return result
def versionFromLegacy(version, legacyinfo : ForgeLegacyInfo):
result = MultiMCVersionFile({"name":"Forge", "version":version.rawVersion, "uid":"net.minecraftforge" })
result = PolyMCVersionFile({"name":"Forge", "version":version.rawVersion, "uid":"net.minecraftforge" })
mcversion = version.mcversion_sane
result.requires = [DependencyEntry(uid='net.minecraft', equals=mcversion)]
result.releaseTime = legacyinfo.releaseTime
@ -161,7 +163,7 @@ def versionFromLegacy(version, legacyinfo : ForgeLegacyInfo):
else:
classifier = "client"
coord = GradleSpecifier("net.minecraftforge:forge:%s:%s" % (version.longVersion,classifier))
mainmod = MultiMCLibrary(name = coord)
mainmod = PolyMCLibrary(name = coord)
mainmod.downloads = MojangLibraryDownloads()
mainmod.downloads.artifact = MojangArtifact()
mainmod.downloads.artifact.path = None
@ -173,7 +175,7 @@ def versionFromLegacy(version, legacyinfo : ForgeLegacyInfo):
def versionFromBuildSystemInstaller(installerVersion : MojangVersionFile, installerProfile: ForgeInstallerProfileV2, version: ForgeVersion):
eprint("Generating Forge %s." % version.longVersion)
result = MultiMCVersionFile({"name":"Forge", "version":version.rawVersion, "uid":"net.minecraftforge" })
result = PolyMCVersionFile({"name":"Forge", "version":version.rawVersion, "uid":"net.minecraftforge" })
result.requires = [DependencyEntry(uid='net.minecraft', equals=version.mcversion_sane)]
result.mainClass = "io.github.zekerzhayard.forgewrapper.installer.Main"
@ -181,9 +183,9 @@ def versionFromBuildSystemInstaller(installerVersion : MojangVersionFile, instal
mavenLibs = []
# load the locally cached installer file info and use it to add the installer entry in the json
with open("upstream/forge/installer_info/%s.json" % version.longVersion, 'r', encoding='utf-8') as f:
with open(UPSTREAM_DIR + "/forge/installer_info/%s.json" % version.longVersion, 'r', encoding='utf-8') as f:
installerInfo = InstallerInfo(json.load(f))
InstallerLib = MultiMCLibrary(name=GradleSpecifier("net.minecraftforge:forge:%s:installer" % (version.longVersion)))
InstallerLib = PolyMCLibrary(name=GradleSpecifier("net.minecraftforge:forge:%s:installer" % (version.longVersion)))
InstallerLib.downloads = MojangLibraryDownloads()
InstallerLib.downloads.artifact = MojangArtifact()
InstallerLib.downloads.artifact.url = "https://files.minecraftforge.net/maven/%s" % (InstallerLib.name.getPath())
@ -192,77 +194,77 @@ def versionFromBuildSystemInstaller(installerVersion : MojangVersionFile, instal
mavenLibs.append(InstallerLib)
for upstreamLib in installerProfile.libraries:
mmcLib = MultiMCLibrary(upstreamLib.to_json())
if mmcLib.name.group == "net.minecraftforge":
if mmcLib.name.artifact == "forge":
if mmcLib.name.classifier == "universal":
mmcLib.downloads.artifact.url = "https://files.minecraftforge.net/maven/%s" % mmcLib.name.getPath()
mavenLibs.append(mmcLib)
pmcLib = PolyMCLibrary(upstreamLib.to_json())
if pmcLib.name.group == "net.minecraftforge":
if pmcLib.name.artifact == "forge":
if pmcLib.name.classifier == "universal":
pmcLib.downloads.artifact.url = "https://files.minecraftforge.net/maven/%s" % pmcLib.name.getPath()
mavenLibs.append(pmcLib)
continue
if mmcLib.name.isLog4j():
if pmcLib.name.isLog4j():
continue
mavenLibs.append(mmcLib)
mavenLibs.append(pmcLib)
result.mavenFiles = mavenLibs
libraries = []
#wrapperLib = MultiMCLibrary(name=GradleSpecifier("io.github.zekerzhayard:ForgeWrapper:1.4.1"))
#wrapperLib = PolyMCLibrary(name=GradleSpecifier("io.github.zekerzhayard:ForgeWrapper:1.4.1"))
#wrapperLib.downloads = MojangLibraryDownloads()
#wrapperLib.downloads.artifact = MojangArtifact()
#wrapperLib.downloads.artifact.url = "https://files.multimc.org/maven/%s" % (wrapperLib.name.getPath())
#wrapperLib.downloads.artifact.url = "https://meta.polymc.org/maven/%s" % (wrapperLib.name.getPath())
#wrapperLib.downloads.artifact.sha1 = "82f01de97e29ba34be9fc628084b6d10ce2235c5"
#wrapperLib.downloads.artifact.size = 14351
#libraries.append(wrapperLib)
#wrapperLib = MultiMCLibrary(name=GradleSpecifier("io.github.zekerzhayard:ForgeWrapper:1.4.2"))
#wrapperLib = PolyMCLibrary(name=GradleSpecifier("io.github.zekerzhayard:ForgeWrapper:1.4.2"))
#wrapperLib.downloads = MojangLibraryDownloads()
#wrapperLib.downloads.artifact = MojangArtifact()
#wrapperLib.downloads.artifact.url = "https://files.multimc.org/maven/%s" % (wrapperLib.name.getPath())
#wrapperLib.downloads.artifact.url = "https://meta.polymc.org/maven/%s" % (wrapperLib.name.getPath())
#wrapperLib.downloads.artifact.sha1 = "79ff9c1530e8743450c5c3ebc6e07b535437aa6e"
#wrapperLib.downloads.artifact.size = 22346
#libraries.append(wrapperLib)
#wrapperLib = MultiMCLibrary(name=GradleSpecifier("io.github.zekerzhayard:ForgeWrapper:1.5.1"))
#wrapperLib = PolyMCLibrary(name=GradleSpecifier("io.github.zekerzhayard:ForgeWrapper:1.5.1"))
#wrapperLib.downloads = MojangLibraryDownloads()
#wrapperLib.downloads.artifact = MojangArtifact()
#wrapperLib.downloads.artifact.url = "https://files.multimc.org/maven/%s" % (wrapperLib.name.getPath())
#wrapperLib.downloads.artifact.url = "https://meta.polymc.org/maven/%s" % (wrapperLib.name.getPath())
#wrapperLib.downloads.artifact.sha1 = "90104e9aaa8fbedf6c3d1f6d0b90cabce080b5a9"
#wrapperLib.downloads.artifact.size = 29892
#libraries.append(wrapperLib)
#wrapperLib = MultiMCLibrary(name=GradleSpecifier("io.github.zekerzhayard:ForgeWrapper:1.5.3"))
#wrapperLib = PolyMCLibrary(name=GradleSpecifier("io.github.zekerzhayard:ForgeWrapper:1.5.3"))
#wrapperLib.downloads = MojangLibraryDownloads()
#wrapperLib.downloads.artifact = MojangArtifact()
#wrapperLib.downloads.artifact.url = "https://files.multimc.org/maven/%s" % (wrapperLib.name.getPath())
#wrapperLib.downloads.artifact.url = "https://meta.polymc.org/maven/%s" % (wrapperLib.name.getPath())
#wrapperLib.downloads.artifact.sha1 = "2b0e06937349a209dbb90dca6381258daa456ad7"
#wrapperLib.downloads.artifact.size = 30486
#libraries.append(wrapperLib)
#wrapperLib = MultiMCLibrary(name=GradleSpecifier("io.github.zekerzhayard:ForgeWrapper:1.5.4"))
#wrapperLib = PolyMCLibrary(name=GradleSpecifier("io.github.zekerzhayard:ForgeWrapper:1.5.4"))
#wrapperLib.downloads = MojangLibraryDownloads()
#wrapperLib.downloads.artifact = MojangArtifact()
#wrapperLib.downloads.artifact.url = "https://files.multimc.org/maven/%s" % (wrapperLib.name.getPath())
#wrapperLib.downloads.artifact.url = "https://meta.polymc.org/maven/%s" % (wrapperLib.name.getPath())
#wrapperLib.downloads.artifact.sha1 = "e97805af76d4c1cebb753132eadbabd92e67a17b"
#wrapperLib.downloads.artifact.size = 34299
#libraries.append(wrapperLib)
#wrapperLib = MultiMCLibrary(name=GradleSpecifier("io.github.zekerzhayard:ForgeWrapper:mmc1"))
#wrapperLib = PolyMCLibrary(name=GradleSpecifier("io.github.zekerzhayard:ForgeWrapper:pmc1"))
#wrapperLib.downloads = MojangLibraryDownloads()
#wrapperLib.downloads.artifact = MojangArtifact()
#wrapperLib.downloads.artifact.url = "https://files.multimc.org/maven/%s" % (wrapperLib.name.getPath())
#wrapperLib.downloads.artifact.url = "https://meta.polymc.org/maven/%s" % (wrapperLib.name.getPath())
#wrapperLib.downloads.artifact.sha1 = "e8e0fe708742ecf15ab4af55ae8227fa4349362d"
#wrapperLib.downloads.artifact.size = 34628
#libraries.append(wrapperLib)
#wrapperLib = MultiMCLibrary(name=GradleSpecifier("io.github.zekerzhayard:ForgeWrapper:1.5.5"))
#wrapperLib = PolyMCLibrary(name=GradleSpecifier("io.github.zekerzhayard:ForgeWrapper:1.5.5"))
#wrapperLib.downloads = MojangLibraryDownloads()
#wrapperLib.downloads.artifact = MojangArtifact()
#wrapperLib.downloads.artifact.url = "https://files.multimc.org/maven/%s" % (wrapperLib.name.getPath())
#wrapperLib.downloads.artifact.url = "https://meta.polymc.org/maven/%s" % (wrapperLib.name.getPath())
#wrapperLib.downloads.artifact.sha1 = "566dfd60aacffaa02884614835f1151d36f1f985"
#wrapperLib.downloads.artifact.size = 34331
#libraries.append(wrapperLib)
wrapperLib = MultiMCLibrary(name=GradleSpecifier("io.github.zekerzhayard:ForgeWrapper:mmc2"))
wrapperLib = PolyMCLibrary(name=GradleSpecifier("io.github.zekerzhayard:ForgeWrapper:pmc2"))
wrapperLib.downloads = MojangLibraryDownloads()
wrapperLib.downloads.artifact = MojangArtifact()
wrapperLib.downloads.artifact.url = "https://meta.polymc.org/maven/%s" % (wrapperLib.name.getPath())
@ -271,19 +273,19 @@ def versionFromBuildSystemInstaller(installerVersion : MojangVersionFile, instal
libraries.append(wrapperLib)
for upstreamLib in installerVersion.libraries:
mmcLib = MultiMCLibrary(upstreamLib.to_json())
if mmcLib.name.group == "net.minecraftforge":
if mmcLib.name.artifact == "forge":
fixedName = mmcLib.name
pmcLib = PolyMCLibrary(upstreamLib.to_json())
if pmcLib.name.group == "net.minecraftforge":
if pmcLib.name.artifact == "forge":
fixedName = pmcLib.name
fixedName.classifier = "launcher"
mmcLib.downloads.artifact.path = fixedName.getPath()
mmcLib.downloads.artifact.url = "https://files.minecraftforge.net/maven/%s" % fixedName.getPath()
mmcLib.name = fixedName
libraries.append(mmcLib)
pmcLib.downloads.artifact.path = fixedName.getPath()
pmcLib.downloads.artifact.url = "https://files.minecraftforge.net/maven/%s" % fixedName.getPath()
pmcLib.name = fixedName
libraries.append(pmcLib)
continue
if mmcLib.name.isLog4j():
if pmcLib.name.isLog4j():
continue
libraries.append(mmcLib)
libraries.append(pmcLib)
result.libraries = libraries
result.releaseTime = installerVersion.releaseTime
@ -296,7 +298,7 @@ def versionFromBuildSystemInstaller(installerVersion : MojangVersionFile, instal
# load the locally cached version list
with open("upstream/forge/derived_index.json", 'r', encoding='utf-8') as f:
with open(UPSTREAM_DIR + "/forge/derived_index.json", 'r', encoding='utf-8') as f:
main_json = json.load(f)
remoteVersionlist = DerivedForgeIndex(main_json)
@ -374,15 +376,15 @@ for id, entry in remoteVersionlist.versions.items():
recommendedVersions.append(version.rawVersion)
# If we do not have the corresponding Minecraft version, we ignore it
if not os.path.isfile("multimc/net.minecraft/%s.json" % version.mcversion_sane):
if not os.path.isfile(PMC_DIR + "/net.minecraft/%s.json" % version.mcversion_sane):
eprint ("Skipping %s with no corresponding Minecraft version %s" % (id, version.mcversion_sane))
continue
outVersion = None
# Path for new-style build system based installers
installerVersionFilepath = "upstream/forge/version_manifests/%s.json" % version.longVersion
profileFilepath = "upstream/forge/installer_manifests/%s.json" % version.longVersion
installerVersionFilepath = UPSTREAM_DIR + "/forge/version_manifests/%s.json" % version.longVersion
profileFilepath = UPSTREAM_DIR + "/forge/installer_manifests/%s.json" % version.longVersion
eprint(installerVersionFilepath)
if os.path.isfile(installerVersionFilepath):
@ -415,7 +417,7 @@ for id, entry in remoteVersionlist.versions.items():
outVersion = versionFromLegacy(version, legacyinfolist.number[build])
outFilepath = "multimc/net.minecraftforge/%s.json" % outVersion.version
outFilepath = PMC_DIR + "/net.minecraftforge/%s.json" % outVersion.version
with open(outFilepath, 'w') as outfile:
json.dump(outVersion.to_json(), outfile, sort_keys=True, indent=4)
@ -423,7 +425,7 @@ recommendedVersions.sort()
print ('Recommended versions:', recommendedVersions)
sharedData = MultiMCSharedPackageData(uid = 'net.minecraftforge', name = "Forge")
sharedData = PolyMCSharedPackageData(uid = 'net.minecraftforge', name = "Forge")
sharedData.projectUrl = 'https://www.minecraftforge.net/forum/'
sharedData.recommended = recommendedVersions
sharedData.write()

View File

@ -1,13 +1,17 @@
#!/usr/bin/python3
from liteloaderutil import *
from jsonobject import *
import copy
import os
from datetime import datetime
from pprint import pprint
import copy
from jsonobject import *
from liteloaderutil import *
PMC_DIR = os.environ["PMC_DIR"]
UPSTREAM_DIR = os.environ["UPSTREAM_DIR"]
# load the locally cached version list
def loadLiteloaderJson():
with open("upstream/liteloader/versions.json", 'r', encoding='utf-8') as f:
with open(UPSTREAM_DIR + "/liteloader/versions.json", 'r', encoding='utf-8') as f:
return LiteloaderIndex(json.load(f))
remoteVersionlist = loadLiteloaderJson()
@ -21,7 +25,7 @@ def processArtefacts(mcVersion, liteloader, notSnapshots):
if id == 'latest':
latestVersion = artefact.version
continue
version = MultiMCVersionFile(name="LiteLoader", uid="com.mumfrey.liteloader", version=artefact.version)
version = PolyMCVersionFile(name="LiteLoader", uid="com.mumfrey.liteloader", version=artefact.version)
version.requires = [DependencyEntry(uid='net.minecraft', equals=mcVersion)]
version.releaseTime = datetime.utcfromtimestamp(int(artefact.timestamp))
version.addTweakers = [artefact.tweakClass]
@ -39,12 +43,12 @@ def processArtefacts(mcVersion, liteloader, notSnapshots):
lib.url = "https://repo.maven.apache.org/maven2/"
if lib.name == GradleSpecifier("org.ow2.asm:asm-all:5.2"):
lib.url = "http://repo.liteloader.com/"
liteloaderLib = MultiMCLibrary(
liteloaderLib = PolyMCLibrary(
name=GradleSpecifier("com.mumfrey:liteloader:%s" % version.version),
url = "http://dl.liteloader.com/versions/"
)
if not notSnapshots:
liteloaderLib.mmcHint = "always-stale"
liteloaderLib.pmcHint = "always-stale"
libraries.append(liteloaderLib)
version.libraries = libraries
versions.append(version)
@ -76,11 +80,11 @@ recommended.sort()
allVersions.sort(key=lambda x: x.releaseTime, reverse=True)
for version in allVersions:
outFilepath = "multimc/com.mumfrey.liteloader/%s.json" % version.version
outFilepath = PMC_DIR + "/com.mumfrey.liteloader/%s.json" % version.version
with open(outFilepath, 'w') as outfile:
json.dump(version.to_json(), outfile, sort_keys=True, indent=4)
sharedData = MultiMCSharedPackageData(uid = 'com.mumfrey.liteloader', name = 'LiteLoader')
sharedData = PolyMCSharedPackageData(uid = 'com.mumfrey.liteloader', name = 'LiteLoader')
sharedData.recommended = recommended
sharedData.description = remoteVersionlist.meta.description
sharedData.projectUrl = remoteVersionlist.meta.url

View File

@ -1,23 +1,19 @@
#!/usr/bin/python3
import os
import json
import copy
import datetime
import iso8601
import hashlib
import json
import os
from collections import defaultdict, namedtuple
from datetime import datetime
from distutils import version
from operator import itemgetter
from pprint import pprint
import iso8601
from metautil import *
from distutils import version
from collections import defaultdict
from collections import namedtuple
from datetime import datetime
import hashlib
PMC_DIR = os.environ["PMC_DIR"]
UPSTREAM_DIR = os.environ["UPSTREAM_DIR"]
def addOrGetBucket(buckets, rules):
ruleHash = None
@ -28,7 +24,7 @@ def addOrGetBucket(buckets, rules):
if ruleHash in buckets:
bucket = buckets[ruleHash]
else:
bucket = MultiMCVersionFile(
bucket = PolyMCVersionFile(
{
"name": "LWJGL",
"version": "undetermined",
@ -70,10 +66,10 @@ def addLWJGLVersion(versionVariants, lwjglObject):
versionVariants[lwjglVersion].append(LWJGLEntry(version=lwjglObjectCopy, sha1=lwjglObjectHash))
def removePathsFromLib(lib):
if mmcLib.downloads.artifact:
mmcLib.downloads.artifact.path = None
if mmcLib.downloads.classifiers:
for key, value in mmcLib.downloads.classifiers.items():
if pmcLib.downloads.artifact:
pmcLib.downloads.artifact.path = None
if pmcLib.downloads.classifiers:
for key, value in pmcLib.downloads.classifiers.items():
value.path = None
def adaptNewStyleArguments(arguments):
@ -118,24 +114,24 @@ with open("static/minecraft.json", 'r', encoding='utf-8') as legacyIndexFile:
found_any_lwjgl3 = False
for filename in os.listdir('upstream/mojang/versions'):
with open("upstream/mojang/versions/" + filename) as json_file:
for filename in os.listdir(UPSTREAM_DIR + '/mojang/versions'):
with open(UPSTREAM_DIR + "/mojang/versions/" + filename) as json_file:
print("Processing", filename)
mojangVersionFile = MojangVersionFile(json.load(json_file))
versionFile = MojangToMultiMC(mojangVersionFile, "Minecraft", "net.minecraft", mojangVersionFile.id)
versionFile = MojangToPolyMC(mojangVersionFile, "Minecraft", "net.minecraft", mojangVersionFile.id)
libs_minecraft = []
is_lwjgl_3 = False
buckets = {}
for lib in versionFile.libraries:
mmcLib = MultiMCLibrary(lib.to_json())
removePathsFromLib(mmcLib)
specifier = mmcLib.name
pmcLib = PolyMCLibrary(lib.to_json())
removePathsFromLib(pmcLib)
specifier = pmcLib.name
ruleHash = None
if specifier.isLwjgl():
rules = None
if mmcLib.rules:
rules = mmcLib.rules
mmcLib.rules = None
if pmcLib.rules:
rules = pmcLib.rules
pmcLib.rules = None
if isOnlyMacOS(rules, specifier):
print("Candidate library ", specifier, " is only for macOS and is therefore ignored.")
continue
@ -148,44 +144,44 @@ for filename in os.listdir('upstream/mojang/versions'):
bucket.version = specifier.version
if not bucket.libraries:
bucket.libraries = []
bucket.libraries.append(mmcLib)
bucket.libraries.append(pmcLib)
bucket.releaseTime = versionFile.releaseTime
else:
# FIXME: workaround for insane log4j nonsense from December 2021. Probably needs adjustment.
if mmcLib.name.isLog4j():
if pmcLib.name.isLog4j():
log4jVersion = '2.16.0'
if mmcLib.name.version == '2.0-beta9':
if pmcLib.name.version == '2.0-beta9':
log4jVersion = '2.0-beta9-fixed'
replacementLib = MultiMCLibrary(name=GradleSpecifier("org.apache.logging.log4j:%s:%s" % (mmcLib.name.artifact, log4jVersion)))
replacementLib = PolyMCLibrary(name=GradleSpecifier("org.apache.logging.log4j:%s:%s" % (pmcLib.name.artifact, log4jVersion)))
replacementLib.downloads = MojangLibraryDownloads()
replacementLib.downloads.artifact = MojangArtifact()
replacementLib.downloads.artifact.url = "https://meta.polymc.org/maven/%s" % (replacementLib.name.getPath())
if log4jVersion == "2.16.0":
if mmcLib.name.artifact == "log4j-api":
if pmcLib.name.artifact == "log4j-api":
replacementLib.downloads.artifact.sha1 = "f821a18687126c2e2f227038f540e7953ad2cc8c"
replacementLib.downloads.artifact.size = 301892
elif mmcLib.name.artifact == "log4j-core":
elif pmcLib.name.artifact == "log4j-core":
replacementLib.downloads.artifact.sha1 = "539a445388aee52108700f26d9644989e7916e7c"
replacementLib.downloads.artifact.size = 1789565
elif mmcLib.name.artifact == "log4j-slf4j18-impl":
elif pmcLib.name.artifact == "log4j-slf4j18-impl":
replacementLib.downloads.artifact.sha1 = "0c880a059056df5725f5d8d1035276d9749eba6d"
replacementLib.downloads.artifact.size = 21249
else:
raise Exception("ERROR: unhandled log4j artifact %s!" % mmcLib.name.artifact)
raise Exception("ERROR: unhandled log4j artifact %s!" % pmcLib.name.artifact)
elif log4jVersion == "2.0-beta9-fixed":
if mmcLib.name.artifact == "log4j-api":
if pmcLib.name.artifact == "log4j-api":
replacementLib.downloads.artifact.sha1 = "b61eaf2e64d8b0277e188262a8b771bbfa1502b3"
replacementLib.downloads.artifact.size = 107347
elif mmcLib.name.artifact == "log4j-core":
elif pmcLib.name.artifact == "log4j-core":
replacementLib.downloads.artifact.sha1 = "677991ea2d7426f76309a73739cecf609679492c"
replacementLib.downloads.artifact.size = 677588
else:
raise Exception("ERROR: unhandled log4j artifact %s!" % mmcLib.name.artifact)
raise Exception("ERROR: unhandled log4j artifact %s!" % pmcLib.name.artifact)
libs_minecraft.append(replacementLib)
else:
libs_minecraft.append(mmcLib)
libs_minecraft.append(pmcLib)
if len(buckets) == 1:
for key in buckets:
keyBucket = buckets[key]
@ -246,7 +242,7 @@ for filename in os.listdir('upstream/mojang/versions'):
# process 1.13 arguments into previous version
if not mojangVersionFile.minecraftArguments and mojangVersionFile.arguments:
versionFile.minecraftArguments = adaptNewStyleArguments(mojangVersionFile.arguments)
filenameOut = "multimc/net.minecraft/%s.json" % versionFile.version
filenameOut = PMC_DIR + "/net.minecraft/%s.json" % versionFile.version
if versionFile.version in staticVersionlist.versions:
ApplyLegacyOverride (versionFile, staticVersionlist.versions[versionFile.version])
with open(filenameOut, 'w') as outfile:
@ -256,12 +252,12 @@ def processSingleVariant(lwjglVariant):
lwjglVersion = lwjglVariant.version
versionObj = copy.deepcopy(lwjglVariant)
if lwjglVersion[0] == '2':
filename = "multimc/org.lwjgl/%s.json" % lwjglVersion
filename = PMC_DIR + "/org.lwjgl/%s.json" % lwjglVersion
versionObj.name = 'LWJGL 2'
versionObj.uid = 'org.lwjgl'
versionObj.conflicts = [DependencyEntry(uid='org.lwjgl3')]
elif lwjglVersion[0] == '3':
filename = "multimc/org.lwjgl3/%s.json" % lwjglVersion
filename = PMC_DIR + "/org.lwjgl3/%s.json" % lwjglVersion
versionObj.name = 'LWJGL 3'
versionObj.uid = 'org.lwjgl3'
versionObj.conflicts = [DependencyEntry(uid='org.lwjgl')]
@ -353,18 +349,18 @@ for lwjglVersionVariant in lwjglVersionVariants:
else:
raise Exception("No variant decided for version %s out of %d possible ones and %d unknown ones." % (lwjglVersionVariant, passedVariants, unknownVariants))
lwjglSharedData = MultiMCSharedPackageData(uid = 'org.lwjgl', name = 'LWJGL 2')
lwjglSharedData = PolyMCSharedPackageData(uid = 'org.lwjgl', name = 'LWJGL 2')
lwjglSharedData.recommended = ['2.9.4-nightly-20150209']
lwjglSharedData.write()
if found_any_lwjgl3:
lwjglSharedData = MultiMCSharedPackageData(uid = 'org.lwjgl3', name = 'LWJGL 3')
lwjglSharedData = PolyMCSharedPackageData(uid = 'org.lwjgl3', name = 'LWJGL 3')
lwjglSharedData.recommended = ['3.1.2']
lwjglSharedData.write()
with open("upstream/mojang/version_manifest_v2.json", 'r', encoding='utf-8') as localIndexFile:
with open(UPSTREAM_DIR + "/mojang/version_manifest_v2.json", 'r', encoding='utf-8') as localIndexFile:
localVersionlist = MojangIndexWrap(json.load(localIndexFile))
mcSharedData = MultiMCSharedPackageData(uid = 'net.minecraft', name = 'Minecraft')
mcSharedData = PolyMCSharedPackageData(uid = 'net.minecraft', name = 'Minecraft')
mcSharedData.recommended = [localVersionlist.latest['release']]
mcSharedData.write()

View File

@ -1,11 +1,11 @@
#!/usr/bin/python3
import hashlib
import os
import json
import os
from operator import itemgetter
from metautil import *
from operator import itemgetter
PMC_DIR = os.environ["PMC_DIR"]
# take the hash type (like hashlib.md5) and filename, return hex string of hash
def HashFile(hash, fname):
@ -19,10 +19,10 @@ def HashFile(hash, fname):
ignore = set(["index.json", "package.json", ".git"])
# initialize output structures - package list level
packages = MultiMCPackageIndex()
packages = PolyMCPackageIndex()
# walk thorugh all the package folders
for package in sorted(os.listdir('multimc')):
for package in sorted(os.listdir(PMC_DIR)):
if package in ignore:
continue
@ -32,24 +32,24 @@ for package in sorted(os.listdir('multimc')):
recommendedVersions = set(sharedData.recommended)
# initialize output structures - version list level
versionList = MultiMCVersionIndex()
versionList = PolyMCVersionIndex()
versionList.uid = package
versionList.name = sharedData.name
# walk through all the versions of the package
for filename in os.listdir("multimc/%s" % (package)):
for filename in os.listdir(PMC_DIR + "/%s" % (package)):
if filename in ignore:
continue
# parse and hash the version file
filepath = "multimc/%s/%s" % (package, filename)
filepath = PMC_DIR + "/%s/%s" % (package, filename)
filehash = HashFile(hashlib.sha256, filepath)
versionFile = None
with open(filepath) as json_file:
versionFile = MultiMCVersionFile(json.load(json_file))
versionFile = PolyMCVersionFile(json.load(json_file))
# pull information from the version file
versionEntry = MultiMCVersionIndexEntry()
versionEntry = PolyMCVersionIndexEntry()
if versionFile.version in recommendedVersions:
versionEntry.recommended = True
versionEntry.version = versionFile.version
@ -65,12 +65,12 @@ for package in sorted(os.listdir('multimc')):
versionList.versions = sorted(versionList.versions, key=itemgetter('releaseTime'), reverse=True)
# write the version index for the package
outFilePath = "multimc/%s/index.json" % (package)
outFilePath = PMC_DIR + "/%s/index.json" % (package)
with open(outFilePath, 'w') as outfile:
json.dump(versionList.to_json(), outfile, sort_keys=True, indent=4)
# insert entry into the package index
packageEntry = MultiMCPackageIndexEntry(
packageEntry = PolyMCPackageIndexEntry(
{
"uid" : package,
"name" : sharedData.name,
@ -80,5 +80,5 @@ for package in sorted(os.listdir('multimc')):
packages.packages.append(packageEntry)
# write the repository package index
with open("multimc/index.json", 'w') as outfile:
with open(PMC_DIR + "/index.json", 'w') as outfile:
json.dump(packages.to_json(), outfile, sort_keys=True, indent=4)

View File

@ -1,5 +1,6 @@
from metautil import *
'''
"repo":{
"stream":"RELEASE",
@ -37,7 +38,7 @@ class LiteloaderRepo(JsonObject):
'''
class LiteloaderArtefact(JsonObject):
tweakClass = StringProperty(required=True)
libraries = ListProperty(MultiMCLibrary, required=True)
libraries = ListProperty(PolyMCLibrary, required=True)
stream = StringProperty(required=True)
file = StringProperty(required=True)
version = StringProperty(required=True)
@ -59,7 +60,7 @@ class LiteloaderSnapshot(LiteloaderArtefact):
lastSuccessfulBuild = IntegerProperty()
class LiteloaderSnapshots(JsonObject):
libraries = ListProperty(MultiMCLibrary, required=True)
libraries = ListProperty(PolyMCLibrary, required=True)
liteloader = DictProperty(LiteloaderSnapshot, name="com.mumfrey:liteloader", required=True)
'''
@ -100,4 +101,3 @@ class LiteloaderMeta(JsonObject):
class LiteloaderIndex(JsonObject):
meta = ObjectProperty(LiteloaderMeta, required=True)
versions = DictProperty(LiteloaderEntry)

View File

@ -1,8 +1,12 @@
import json
from pprint import pprint
from jsonobject import *
import datetime
import json
import os
from pprint import pprint
import iso8601
from jsonobject import *
PMC_DIR = os.environ["PMC_DIR"]
class ISOTimestampProperty(AbstractDateProperty):
@ -236,24 +240,24 @@ class MojangVersionFile (JsonObject):
complianceLevel = IntegerProperty(exclude_if_none=True, default=None)
javaVersion = ObjectProperty(JavaVersion, exclude_if_none=True, default=None)
CurrentMultiMCFormatVersion = 1
def validateSupportedMultiMCVersion(version):
if version > CurrentMultiMCFormatVersion:
raise UnknownVersionException("Unsupported MultiMC format version: %d. Max supported is: %d" % (version, CurrentMultiMCFormatVersion))
CurrentPolyMCFormatVersion = 1
def validateSupportedPolyMCVersion(version):
if version > CurrentPolyMCFormatVersion:
raise UnknownVersionException("Unsupported PolyMC format version: %d. Max supported is: %d" % (version, CurrentPolyMCFormatVersion))
class MultiMCLibrary (MojangLibrary):
class PolyMCLibrary (MojangLibrary):
url = StringProperty(exclude_if_none=True, default=None)
mmcHint = StringProperty(name="MMC-hint", exclude_if_none=True, default=None)
pmcHint = StringProperty(name="PMC-hint", exclude_if_none=True, default=None)
class VersionedJsonObject(JsonObject):
formatVersion = IntegerProperty(default=CurrentMultiMCFormatVersion, validators=validateSupportedMultiMCVersion)
formatVersion = IntegerProperty(default=CurrentPolyMCFormatVersion, validators=validateSupportedPolyMCVersion)
class DependencyEntry (JsonObject):
uid = StringProperty(required=True)
equals = StringProperty(exclude_if_none=True, default=None)
suggests = StringProperty(exclude_if_none=True, default=None)
class MultiMCVersionFile (VersionedJsonObject):
class PolyMCVersionFile (VersionedJsonObject):
name = StringProperty(required=True)
version = StringProperty(required=True)
uid = StringProperty(required=True)
@ -261,10 +265,10 @@ class MultiMCVersionFile (VersionedJsonObject):
conflicts = ListProperty(DependencyEntry, exclude_if_none=True, default=None)
volatile = BooleanProperty(exclude_if_none=True, default=None)
assetIndex = ObjectProperty(MojangAssets, exclude_if_none=True, default=None)
libraries = ListProperty(MultiMCLibrary, exclude_if_none=True, default=None)
mavenFiles = ListProperty(MultiMCLibrary, exclude_if_none=True, default=None)
mainJar = ObjectProperty(MultiMCLibrary, exclude_if_none=True, default=None)
jarMods = ListProperty(MultiMCLibrary, exclude_if_none=True, default=None)
libraries = ListProperty(PolyMCLibrary, exclude_if_none=True, default=None)
mavenFiles = ListProperty(PolyMCLibrary, exclude_if_none=True, default=None)
mainJar = ObjectProperty(PolyMCLibrary, exclude_if_none=True, default=None)
jarMods = ListProperty(PolyMCLibrary, exclude_if_none=True, default=None)
mainClass = StringProperty(exclude_if_none=True, default=None)
appletClass = StringProperty(exclude_if_none=True, default=None)
minecraftArguments = StringProperty(exclude_if_none=True, default=None)
@ -284,20 +288,20 @@ class UnknownComplianceLevelException(Exception):
self.message = message
# Convert Mojang version file object to a MultiMC version file object
def MojangToMultiMC (file, name, uid, version):
mmcFile = MultiMCVersionFile(
# Convert Mojang version file object to a PolyMC version file object
def MojangToPolyMC (file, name, uid, version):
pmcFile = PolyMCVersionFile(
{
"name": name,
"uid": uid,
"version": version
}
)
mmcFile.assetIndex = file.assetIndex
mmcFile.libraries = file.libraries
mmcFile.mainClass = file.mainClass
pmcFile.assetIndex = file.assetIndex
pmcFile.libraries = file.libraries
pmcFile.mainClass = file.mainClass
if file.id:
mainJar = MultiMCLibrary(
mainJar = PolyMCLibrary(
{
"name": "com.mojang:minecraft:%s:client" % file.id,
}
@ -309,25 +313,25 @@ def MojangToMultiMC (file, name, uid, version):
mainJar.downloads.artifact.url = cldl.url
mainJar.downloads.artifact.sha1 = cldl.sha1
mainJar.downloads.artifact.size = cldl.size
mmcFile.mainJar = mainJar
pmcFile.mainJar = mainJar
mmcFile.minecraftArguments = file.minecraftArguments
mmcFile.releaseTime = file.releaseTime
pmcFile.minecraftArguments = file.minecraftArguments
pmcFile.releaseTime = file.releaseTime
# time should not be set.
mmcFile.type = file.type
pmcFile.type = file.type
maxSupportedLevel = 1
if file.complianceLevel:
if file.complianceLevel == 0:
pass
elif file.complianceLevel == 1:
if not mmcFile.addTraits:
mmcFile.addTraits = []
mmcFile.addTraits.append("XR:Initial")
if not pmcFile.addTraits:
pmcFile.addTraits = []
pmcFile.addTraits.append("XR:Initial")
else:
raise UnknownComplianceLevelException("Unsupported Mojang compliance level: %d. Max supported is: %d" % (file.complianceLevel, maxSupportedLevel))
return mmcFile
return pmcFile
class MultiMCSharedPackageData(VersionedJsonObject):
class PolyMCSharedPackageData(VersionedJsonObject):
name = StringProperty(required=True)
uid = StringProperty(required=True)
recommended = ListProperty(StringProperty, exclude_if_none=True, default=None)
@ -337,24 +341,24 @@ class MultiMCSharedPackageData(VersionedJsonObject):
def write(self):
try:
with open("multimc/%s/package.json" % self.uid, 'w') as file:
with open(PMC_DIR + "/%s/package.json" % self.uid, 'w') as file:
json.dump(self.to_json(), file, sort_keys=True, indent=4)
except EnvironmentError as e:
print("Error while trying to save shared packaged data for %s:" % self.uid, e)
def writeSharedPackageData(uid, name):
desc = MultiMCSharedPackageData({
desc = PolyMCSharedPackageData({
'name': name,
'uid': uid
})
with open("multimc/%s/package.json" % uid, 'w') as file:
with open(PMC_DIR + "/%s/package.json" % uid, 'w') as file:
json.dump(desc.to_json(), file, sort_keys=True, indent=4)
def readSharedPackageData(uid):
with open("multimc/%s/package.json" % uid, 'r') as file:
return MultiMCSharedPackageData(json.load(file))
with open(PMC_DIR + "/%s/package.json" % uid, 'r') as file:
return PolyMCSharedPackageData(json.load(file))
class MultiMCVersionIndexEntry(JsonObject):
class PolyMCVersionIndexEntry(JsonObject):
version = StringProperty()
type = StringProperty(exclude_if_none=True, default=None)
releaseTime = ISOTimestampProperty()
@ -364,21 +368,21 @@ class MultiMCVersionIndexEntry(JsonObject):
volatile = BooleanProperty(exclude_if_none=True, default=None)
sha256 = StringProperty()
class MultiMCVersionIndex(VersionedJsonObject):
class PolyMCVersionIndex(VersionedJsonObject):
name = StringProperty()
uid = StringProperty()
versions = ListProperty(MultiMCVersionIndexEntry)
versions = ListProperty(PolyMCVersionIndexEntry)
class MultiMCPackageIndexEntry(JsonObject):
class PolyMCPackageIndexEntry(JsonObject):
name = StringProperty()
uid = StringProperty()
sha256 = StringProperty()
class MultiMCPackageIndex(VersionedJsonObject):
packages = ListProperty(MultiMCPackageIndexEntry)
class PolyMCPackageIndex(VersionedJsonObject):
packages = ListProperty(PolyMCPackageIndexEntry)
'''
The MultiMC static override file for legacy looks like this:
The PolyMC static override file for legacy looks like this:
{
"versions": [
...
@ -405,19 +409,19 @@ class LegacyOverrideEntry(JsonObject):
class LegacyOverrideIndex(JsonObject):
versions = DictProperty(LegacyOverrideEntry)
def ApplyLegacyOverride (mmcFile, legacyOverride):
def ApplyLegacyOverride (pmcFile, legacyOverride):
# simply hard override classes
mmcFile.mainClass = legacyOverride.mainClass
mmcFile.appletClass = legacyOverride.appletClass
pmcFile.mainClass = legacyOverride.mainClass
pmcFile.appletClass = legacyOverride.appletClass
# if we have an updated release time (more correct than Mojang), use it
if legacyOverride.releaseTime != None:
mmcFile.releaseTime = legacyOverride.releaseTime
pmcFile.releaseTime = legacyOverride.releaseTime
# add traits, if any
if legacyOverride.addTraits:
if not mmcFile.addTraits:
mmcFile.addTraits = []
mmcFile.addTraits = mmcFile.addTraits + legacyOverride.addTraits
if not pmcFile.addTraits:
pmcFile.addTraits = []
pmcFile.addTraits = pmcFile.addTraits + legacyOverride.addTraits
# remove all libraries - they are not needed for legacy
mmcFile.libraries = None
pmcFile.libraries = None
# remove minecraft arguments - we use our own hardcoded ones
mmcFile.minecraftArguments = None
pmcFile.minecraftArguments = None

5
requirements.txt Normal file
View File

@ -0,0 +1,5 @@
cachecontrol = "0.12.10"
iso8601 = "1.0.2"
requests = "2.27.1"
lockfile = "0.12.2"
jsonobject = "0.9.10"

View File

@ -13,8 +13,8 @@ popd
echo
echo "MultiMC:"
pushd "${MMC_DIR}"
echo "PolyMC:"
pushd "${PMC_DIR}"
git status
popd
echo

View File

@ -26,7 +26,7 @@ function fail_in {
}
function fail_out {
cd "${BASEDIR}/${MMC_DIR}"
cd "${BASEDIR}/${PMC_DIR}"
git reset --hard HEAD
exit 1
}
@ -38,10 +38,10 @@ git reset --hard HEAD || exit 1
git checkout ${BRANCH} || exit 1
cd "${BASEDIR}"
./updateMojang.py || fail_in
./updateForge.py || fail_in
./updateFabric.py || fail_in
./updateLiteloader.py || fail_in
python updateMojang.py || fail_in
python updateForge.py || fail_in
python updateFabric.py || fail_in
python updateLiteloader.py || fail_in
if [ "${DEPLOY_TO_GIT}" = true ] ; then
cd "${BASEDIR}/${UPSTREAM_DIR}"
@ -56,19 +56,19 @@ if [ "${DEPLOY_TO_GIT}" = true ] ; then
cd "${BASEDIR}"
fi
cd "${BASEDIR}/${MMC_DIR}"
cd "${BASEDIR}/${PMC_DIR}"
git reset --hard HEAD || exit 1
git checkout ${BRANCH} || exit 1
cd "${BASEDIR}"
./generateMojang.py || fail_out
./generateForge.py || fail_out
./generateFabric.py || fail_in
./generateLiteloader.py || fail_out
./index.py || fail_out
python generateMojang.py || fail_out
python generateForge.py || fail_out
python generateFabric.py || fail_in
python generateLiteloader.py || fail_out
python index.py || fail_out
if [ "${DEPLOY_TO_GIT}" = true ] ; then
cd "${BASEDIR}/${MMC_DIR}"
cd "${BASEDIR}/${PMC_DIR}"
git add index.json org.lwjgl/* net.minecraft/* || fail_out
git add net.minecraftforge/* || fail_out
git add net.fabricmc.fabric-loader/* net.fabricmc.intermediary/* || fail_out
@ -100,10 +100,10 @@ if [ "${DEPLOY_TO_FOLDER}" = true ] ; then
DEPLOY_FOLDER_var="DEPLOY_FOLDER_$MODE"
DEPLOY_FOLDER="${!DEPLOY_FOLDER_var}"
echo "Deploying to ${DEPLOY_FOLDER}"
rsync -rvog --chown=${DEPLOY_FOLDER_USER}:${DEPLOY_FOLDER_GROUP} --exclude=.git ${BASEDIR}/${MMC_DIR}/ ${DEPLOY_FOLDER}
rsync -rvog --chown=${DEPLOY_FOLDER_USER}:${DEPLOY_FOLDER_GROUP} --exclude=.git ${BASEDIR}/${PMC_DIR}/ ${DEPLOY_FOLDER}
fi
if [ "${DEPLOY_TO_S3}" = true ] ; then
s3cmd -c ${BASEDIR}/config/s3cmd.cfg --exclude=".git*" --delete-removed sync ${BASEDIR}/${MMC_DIR}/ ${S3_BUCKET} || exit 2
s3cmd -c ${BASEDIR}/config/s3cmd.cfg --exclude=".git*" --delete-removed sync ${BASEDIR}/${PMC_DIR}/ ${S3_BUCKET} || exit 2
fi
exit 0

View File

@ -1,12 +1,15 @@
#!/usr/bin/python3
import os, requests
from cachecontrol import CacheControl
import datetime
import hashlib, json
import hashlib
import json
import os
import zipfile
import requests
from cachecontrol import CacheControl
from cachecontrol.caches import FileCache
from fabricutil import *
from cachecontrol.caches import FileCache
UPSTREAM_DIR = os.environ["UPSTREAM_DIR"]
forever_cache = FileCache('http_cache', forever=True)
sess = CacheControl(requests.Session(), forever_cache)
@ -62,20 +65,20 @@ 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")
mkdirs(UPSTREAM_DIR + "/fabric/meta-v2")
mkdirs(UPSTREAM_DIR + "/fabric/loader-installer-json")
mkdirs(UPSTREAM_DIR + "/fabric/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)
index = get_json_file(UPSTREAM_DIR + "/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)
compute_jar_file(UPSTREAM_DIR + "/fabric/jars/" + it["maven"].replace(":", "."), jarMavenUrl)
# for each loader, download installer JSON file from maven
with open("upstream/fabric/meta-v2/loader.json", 'r', encoding='utf-8') as loaderVersionIndexFile:
with open(UPSTREAM_DIR + "/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_json_file(UPSTREAM_DIR + "/fabric/loader-installer-json/" + it["version"] + ".json", mavenUrl)

View File

@ -1,26 +1,26 @@
#!/usr/bin/python3
'''
Get the source files necessary for generating Forge versions
'''
from __future__ import print_function
import copy
import datetime
import hashlib
import json
import os
import os.path
import re
import sys
import zipfile
from contextlib import suppress
from pathlib import Path
import requests
from cachecontrol import CacheControl
from cachecontrol.caches import FileCache
import json
import copy
import re
import zipfile
from metautil import *
from jsonobject import *
from forgeutil import *
import os.path
import datetime
import hashlib
from pathlib import Path
from contextlib import suppress
from jsonobject import *
from metautil import *
UPSTREAM_DIR = os.environ["UPSTREAM_DIR"]
def eprint(*args, **kwargs):
print(*args, file=sys.stderr, **kwargs)
@ -80,7 +80,7 @@ for promoKey, shortversion in promotions_json.get('promos').items():
versionExpression = re.compile("^(?P<mc>[0-9a-zA-Z_\\.]+)-(?P<ver>[0-9\\.]+\\.(?P<build>[0-9]+))(-(?P<branch>[a-zA-Z0-9\\.]+))?$")
def getSingleForgeFilesManifest(longversion):
pathThing = "upstream/forge/files_manifests/%s.json" % longversion
pathThing = UPSTREAM_DIR + "/forge/files_manifests/%s.json" % longversion
files_manifest_file = Path(pathThing)
from_file = False
if files_manifest_file.is_file():
@ -144,11 +144,11 @@ def getSingleForgeFilesManifest(longversion):
print("")
print("Making dirs...")
os.makedirs("upstream/forge/jars/", exist_ok=True)
os.makedirs("upstream/forge/installer_info/", exist_ok=True)
os.makedirs("upstream/forge/installer_manifests/", exist_ok=True)
os.makedirs("upstream/forge/version_manifests/", exist_ok=True)
os.makedirs("upstream/forge/files_manifests/", exist_ok=True)
os.makedirs(UPSTREAM_DIR + "/forge/jars/", exist_ok=True)
os.makedirs(UPSTREAM_DIR + "/forge/installer_info/", exist_ok=True)
os.makedirs(UPSTREAM_DIR + "/forge/installer_manifests/", exist_ok=True)
os.makedirs(UPSTREAM_DIR + "/forge/version_manifests/", exist_ok=True)
os.makedirs(UPSTREAM_DIR + "/forge/files_manifests/", exist_ok=True)
print("")
print("Processing versions:")
@ -205,13 +205,13 @@ for mcversion, info in newIndex.by_mcversion.items():
print("")
print("Dumping index files...")
with open("upstream/forge/maven-metadata.json", 'w', encoding='utf-8') as f:
with open(UPSTREAM_DIR + "/forge/maven-metadata.json", 'w', encoding='utf-8') as f:
json.dump(main_json, f, sort_keys=True, indent=4)
with open("upstream/forge/promotions_slim.json", 'w', encoding='utf-8') as f:
with open(UPSTREAM_DIR + "/forge/promotions_slim.json", 'w', encoding='utf-8') as f:
json.dump(promotions_json, f, sort_keys=True, indent=4)
with open("upstream/forge/derived_index.json", 'w', encoding='utf-8') as f:
with open(UPSTREAM_DIR + "/forge/derived_index.json", 'w', encoding='utf-8') as f:
json.dump(newIndex.to_json(), f, sort_keys=True, indent=4)
versions = []
@ -233,12 +233,12 @@ for id, entry in newIndex.versions.items():
eprint ("Skipping %d with no valid files" % version.build)
continue
jarFilepath = "upstream/forge/jars/%s" % version.filename()
jarFilepath = UPSTREAM_DIR + "/forge/jars/%s" % version.filename()
if version.usesInstaller():
installerInfoFilepath = "upstream/forge/installer_info/%s.json" % version.longVersion
profileFilepath = "upstream/forge/installer_manifests/%s.json" % version.longVersion
versionJsonFilepath = "upstream/forge/version_manifests/%s.json" % version.longVersion
installerInfoFilepath = UPSTREAM_DIR + "/forge/installer_info/%s.json" % version.longVersion
profileFilepath = UPSTREAM_DIR + "/forge/installer_manifests/%s.json" % version.longVersion
versionJsonFilepath = UPSTREAM_DIR + "/forge/version_manifests/%s.json" % version.longVersion
installerRefreshRequired = False
if not os.path.isfile(profileFilepath):
installerRefreshRequired = True

View File

@ -1,19 +1,19 @@
#!/usr/bin/python3
'''
Get the source files necessary for generating Forge versions
'''
from __future__ import print_function
import copy
import json
import os
import os.path
import sys
import requests
from cachecontrol import CacheControl
from cachecontrol.caches import FileCache
import json
from jsonobject import *
from liteloaderutil import *
import os.path
import copy
UPSTREAM_DIR = os.environ["UPSTREAM_DIR"]
def eprint(*args, **kwargs):
print(*args, file=sys.stderr, **kwargs)
@ -36,5 +36,5 @@ origStr = json.dumps(main_json, sort_keys=True)
assert newStr == origStr
# save the json it to file
with open("upstream/liteloader/versions.json", 'w', encoding='utf-8') as f:
with open(UPSTREAM_DIR + "/liteloader/versions.json", 'w', encoding='utf-8') as f:
json.dump(main_json, f, sort_keys=True, indent=4)

View File

@ -1,10 +1,12 @@
#!/usr/bin/python3
import json
import os
import requests
from cachecontrol import CacheControl
import json
from cachecontrol.caches import FileCache
from metautil import *
from cachecontrol.caches import FileCache
UPSTREAM_DIR = os.environ["UPSTREAM_DIR"]
forever_cache = FileCache('http_cache', forever=True)
sess = CacheControl(requests.Session(), forever_cache)
@ -29,7 +31,7 @@ def get_file(path, url):
# get the local version list
localVersionlist = None
try:
with open("upstream/mojang/version_manifest_v2.json", 'r', encoding='utf-8') as localIndexFile:
with open(UPSTREAM_DIR + "/mojang/version_manifest_v2.json", 'r', encoding='utf-8') as localIndexFile:
localVersionlist = MojangIndexWrap(json.load(localIndexFile))
except:
localVersionlist = MojangIndexWrap({})
@ -61,12 +63,12 @@ assets = {}
for id in updatedIDs:
version = remoteVersionlist.versions[id]
print("Updating " + version.id + " to timestamp " + version.releaseTime.strftime('%s'))
assetId, assetUrl = get_version_file( "upstream/mojang/versions/" + id + '.json', version.url)
assetId, assetUrl = get_version_file( UPSTREAM_DIR + "/mojang/versions/" + id + '.json', version.url)
assets[assetId] = assetUrl
for assetId, assetUrl in iter(assets.items()):
print("assets", assetId, assetUrl)
get_file( "upstream/mojang/assets/" + assetId + '.json', assetUrl)
get_file( UPSTREAM_DIR + "/mojang/assets/" + assetId + '.json', assetUrl)
with open("upstream/mojang/version_manifest_v2.json", 'w', encoding='utf-8') as f:
with open(UPSTREAM_DIR + "/mojang/version_manifest_v2.json", 'w', encoding='utf-8') as f:
json.dump(main_json, f, sort_keys=True, indent=4)