diff --git a/generateForge.py b/generateForge.py index e4e5bf2..151baf4 100755 --- a/generateForge.py +++ b/generateForge.py @@ -47,7 +47,9 @@ def shouldIgnoreArtifact(libSet, match): def versionFromProfile(profile, version): result = MultiMCVersionFile({"name":"Forge", "version":version.longVersion, "uid":"net.minecraftforge" }) - result.mcVersion = profile.install.minecraft + mcversion = profile.install.minecraft + result.parentUid ='net.minecraft' + result.requires ={'net.minecraft': mcversion} result.mainClass = profile.versionInfo.mainClass args = profile.versionInfo.minecraftArguments tweakers = [] @@ -63,7 +65,7 @@ def versionFromProfile(profile, version): # result.minecraftArguments = args result.releaseTime = profile.versionInfo.time libs = [] - mcFilter = loadMcVersionFilter(result.mcVersion) + mcFilter = loadMcVersionFilter(mcversion) for forgeLib in profile.versionInfo.libraries: if forgeLib.name.isLwjgl(): continue @@ -74,7 +76,7 @@ def versionFromProfile(profile, version): if fixedName.artifact == "minecraftforge": fixedName.artifact = "forge" fixedName.classifier = "universal" - fixedName.version = "%s-%s" % (result.mcVersion, fixedName.version) + fixedName.version = "%s-%s" % (mcversion, fixedName.version) elif fixedName.artifact == "forge": fixedName.classifier = "universal" ourLib = MultiMCLibrary(name=fixedName) @@ -83,6 +85,7 @@ def versionFromProfile(profile, version): ourLib.mmcHint = "forge-pack-xz" libs.append(ourLib) result.libraries = libs + result.order = 5 return result # load the locally cached version list @@ -92,6 +95,8 @@ with open("upstream/forge/index.json", 'r', encoding='utf-8') as f: versions = [] +writeSharedPackageData('net.minecraftforge', 'Forge', 'net.minecraft') + for id, entry in remoteVersionlist.number.items(): if entry.mcversion == None: eprint ("Skipping %d with invalid MC version" % entry.build) diff --git a/generateMojang.py b/generateMojang.py index b21a067..b515b3c 100755 --- a/generateMojang.py +++ b/generateMojang.py @@ -83,6 +83,8 @@ for filename in os.listdir('upstream/mojang/versions'): addLWJGLVersion(lwjglVersions, keyBucket) versionFile.libraries = libs_minecraft versionFile.id = mojangVersionFile.id + versionFile.requires = {'org.lwjgl': '*'} + versionFile.order = -2 filenameOut = "multimc/net.minecraft/%s.json" % versionFile.version if versionFile.version in staticVersionlist.versions: ApplyLegacyOverride (versionFile, staticVersionlist.versions[versionFile.version]) @@ -91,6 +93,29 @@ for filename in os.listdir('upstream/mojang/versions'): for version in lwjglVersions: versionObj = lwjglVersions[version] + versionObj.order = -1 filename = "multimc/org.lwjgl/%s.json" % version - with open(filename, 'w') as outfile: - json.dump(versionObj.to_json(), outfile, sort_keys=True, indent=4) + good = True + for lib in versionObj.libraries: + if not lib.natives: + continue + checkedDict = {'linux', 'windows', 'osx'} + if not checkedDict.issubset(lib.natives.keys()): + print("Missing system classifier!", versionObj.version, lib.name, lib.natives.keys()) + good = False + break + if lib.downloads: + for entry in checkedDict: + bakedEntry = lib.natives[entry] + if not bakedEntry in lib.downloads.classifiers: + print("Missing download for classifier!", versionObj.version, lib.name, bakedEntry, lib.downloads.classifiers.keys()) + good = False + break + if good: + with open(filename, 'w') as outfile: + json.dump(versionObj.to_json(), outfile, sort_keys=True, indent=4) + else: + print("Skipped LWJGL", versionObj.version) + +writeSharedPackageData('org.lwjgl', 'LWJGL', None) +writeSharedPackageData('net.minecraft', 'Minecraft', None) diff --git a/index.py b/index.py index 1d8a65a..3635454 100755 --- a/index.py +++ b/index.py @@ -16,7 +16,7 @@ def HashFile(hash, fname): return hash_instance.hexdigest() # ignore these files when indexing versions -ignore = set(["index.json", ".git"]) +ignore = set(["index.json", "package.json", ".git"]) # initialize output structures - package list level packages = MultiMCPackageIndex() @@ -26,11 +26,15 @@ for package in os.listdir('multimc'): if package in ignore: continue + sharedData = readSharedPackageData(package) + # initialize output structures - version list level versionList = MultiMCVersionIndex() versionList.uid = package + versionList.parentUid = sharedData.parentUid + versionList.name = sharedData.name + latest = {} - name = None # walk through all the versions of the package for filename in os.listdir("multimc/%s" % (package)): @@ -50,9 +54,7 @@ for package in os.listdir('multimc'): versionEntry.type = versionFile.type versionEntry.releaseTime = versionFile.releaseTime versionEntry.sha256 = filehash - if name == None: - name = versionFile.name - + versionEntry.requires = versionFile.requires # update the latest version of particular type (if needed) if versionFile.type: if versionFile.type in latest: @@ -65,9 +67,6 @@ for package in os.listdir('multimc'): # sort the versions in descending order by time of release versionList.versions = sorted(versionList.versions, key=itemgetter('releaseTime'), reverse=True) - # assign some values derived from the version files - versionList.name = name - # if the latest version dict was populated, transform it into output if latest: versionList.latest = {} @@ -83,10 +82,11 @@ for package in os.listdir('multimc'): packageEntry = MultiMCPackageIndexEntry( { "uid" : package, - "name" : name, + "name" : sharedData.name, "sha256": HashFile(hashlib.sha256, outFilePath) } ) + packageEntry.parentUid = sharedData.parentUid packages.packages.append(packageEntry) # write the repository package index diff --git a/metautil.py b/metautil.py index f8fb827..41273d1 100644 --- a/metautil.py +++ b/metautil.py @@ -213,7 +213,8 @@ class MultiMCVersionFile (VersionedJsonObject): version = StringProperty(required=True) uid = StringProperty(required=True) id = StringProperty(exclude_if_none=True, default=None) # DEPRECATED this is the main Minecraft version ID Mojang uses... - mcVersion = StringProperty(exclude_if_none=True, default=None) # DEPRECATED - replace with proper depends + parentUid = StringProperty(exclude_if_none=True, default=None) + requires = DictProperty(StringProperty, exclude_if_none=True, default=None) assetIndex = ObjectProperty(MojangAssets, exclude_if_none=True, default=None) downloads = DictProperty(MojangArtifactBase, exclude_if_none=True, default=None) libraries = ListProperty(MultiMCLibrary, exclude_if_none=True, default=None) @@ -224,6 +225,7 @@ class MultiMCVersionFile (VersionedJsonObject): type = StringProperty(exclude_if_none=True, default=None) addTraits = ListProperty(StringProperty, name="+traits", exclude_if_none=True, default=None) addTweakers = ListProperty(StringProperty, name="+tweakers", exclude_if_none=True, default=None) + order = IntegerProperty() # Convert Mojang version file object to a MultiMC version file object def MojangToMultiMC (file, name, uid, version): @@ -244,15 +246,35 @@ def MojangToMultiMC (file, name, uid, version): mmcFile.type = file.type return mmcFile +class MultiMCSharedPackageData(JsonObject): + name = StringProperty(required=True) + uid = StringProperty(required=True) + parentUid = StringProperty(exclude_if_none=True, default=None) + +def writeSharedPackageData(uid, name, parentUid = None): + desc = MultiMCSharedPackageData({ + 'name': name, + 'uid': uid + }) + desc.parentUid = parentUid + with open("multimc/%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)) + class MultiMCVersionIndexEntry(JsonObject): version = StringProperty() - type = StringProperty() + type = StringProperty(exclude_if_none=True, default=None) releaseTime = ISOTimestampProperty() + requires = DictProperty(StringProperty, exclude_if_none=True, default=None) sha256 = StringProperty() class MultiMCVersionIndex(VersionedJsonObject): name = StringProperty() uid = StringProperty() + parentUid = StringProperty(exclude_if_none=True, default=None) latest = DictProperty(StringProperty, exclude_if_none=True, default=None) recommended = DictProperty(StringProperty, exclude_if_none=True, default=None) versions = ListProperty(MultiMCVersionIndexEntry) @@ -260,6 +282,7 @@ class MultiMCVersionIndex(VersionedJsonObject): class MultiMCPackageIndexEntry(JsonObject): name = StringProperty() uid = StringProperty() + parentUid = StringProperty(exclude_if_none=True, default=None) sha256 = StringProperty() class MultiMCPackageIndex(VersionedJsonObject):