Skip to content

Commit 6565bd1

Browse files
committed
Fetch Loom and Ploceus versions from their respective maven repos
Signed-off-by: Lilly Rose Berner <lilly@lostluma.net>
1 parent 3f7bea0 commit 6565bd1

2 files changed

Lines changed: 91 additions & 18 deletions

File tree

public/develop.js

Lines changed: 52 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import {
66
getLatestRavenBuilds,
77
getLatestSparrowBuilds,
88
getLatestNestsBuilds,
9+
getLoomVersions,
10+
getPloceusVersions,
911
getVersionDetails,
1012
isSharedVersioning
1113
} from "./meta_maven_utils.js";
@@ -15,7 +17,6 @@ import { normalizeMinecraftVersion } from "./minecraft_semver.js";
1517
(async () => {
1618
const FABRIC_LOOM = "net.fabricmc.fabric-loom-remap"
1719
const QUILT_LOOM = "org.quiltmc.loom.remap"
18-
const LOOM_VERSION = "1.15-SNAPSHOT"
1920
const PLOCEUS = "ploceus"
2021

2122
const FABRIC_LOADER = "net.fabricmc:fabric-loader"
@@ -57,6 +58,36 @@ import { normalizeMinecraftVersion } from "./minecraft_semver.js";
5758
return Object.entries(dependencyManagementSelectorRadios).find(([_, button]) => button.checked)[0];
5859
}
5960

61+
function isStable(version) {
62+
return !version.includes("-");
63+
}
64+
65+
function significantPrefix(version) {
66+
return version.split(".").splice(0, 2).join(".");
67+
}
68+
69+
function highestCompatibleVersions(loomVersions, ploceusVersions) {
70+
// Map of major.minor -> latest patch of the same major.minor
71+
const ploceusLookup = new Map(ploceusVersions.reverse().filter(isStable).map(version => {
72+
return [significantPrefix(version), version];
73+
}));
74+
75+
for (const loomVersion of loomVersions) {
76+
if (!isStable(loomVersion)) {
77+
continue;
78+
}
79+
80+
const prefix = significantPrefix(loomVersion);
81+
const ploceusVersion = ploceusLookup.get(prefix);
82+
83+
if (ploceusVersion) {
84+
return [loomVersion, ploceusVersion];
85+
}
86+
}
87+
88+
throw new Error("Unable to compute recommended Loom and Ploceus versions");
89+
}
90+
6091
async function updateDisplayedElements() {
6192
const minecraftVersion = selectedMinecraftVersion();
6293
const intermediaryGen = selectedCalamusGeneration();
@@ -66,9 +97,11 @@ import { normalizeMinecraftVersion } from "./minecraft_semver.js";
6697
if (minecraftVersions.includes(minecraftVersion)) {
6798
const versionDetails = await getVersionDetails(intermediaryGen, minecraftVersion);
6899

69-
const [loaderVersion, featherBuilds, ravenBuilds, sparrowBuilds, nestsBuilds, oslVersion] = await Promise.all(
100+
const [loaderVersion, loomVersions, ploceusVersions, featherBuilds, ravenBuilds, sparrowBuilds, nestsBuilds, oslVersion] = await Promise.all(
70101
[
71102
getLatestLoaderVersion(modLoader),
103+
getLoomVersions(modLoader),
104+
getPloceusVersions(),
72105
getLatestFeatherBuilds(intermediaryGen, versionDetails),
73106
getLatestRavenBuilds(versionDetails),
74107
getLatestSparrowBuilds(versionDetails),
@@ -78,6 +111,7 @@ import { normalizeMinecraftVersion } from "./minecraft_semver.js";
78111
);
79112

80113
const sharedVersioning = isSharedVersioning(versionDetails);
114+
const [loomVersion, ploceusVersion] = highestCompatibleVersions(loomVersions, ploceusVersions);
81115

82116
// wait for requests to finish to avoid flicker
83117
hideElements();
@@ -91,7 +125,7 @@ import { normalizeMinecraftVersion } from "./minecraft_semver.js";
91125
break;
92126
case "versionCatalog":
93127
showElement("version-catalog");
94-
await displayVersionCatalog(versionDetails, intermediaryGen, modLoader, loaderVersion, featherBuilds, ravenBuilds, sparrowBuilds, nestsBuilds, oslVersion);
128+
await displayVersionCatalog(versionDetails, intermediaryGen, modLoader, loaderVersion, loomVersion, ploceusVersion, featherBuilds, ravenBuilds, sparrowBuilds, nestsBuilds, oslVersion);
95129
break;
96130
default:
97131
throw new Error(`Unknown dependency management type ${dependencyManagement}`);
@@ -100,13 +134,13 @@ import { normalizeMinecraftVersion } from "./minecraft_semver.js";
100134
const singleProject = (intermediaryGen != "gen1" || !sharedVersioning || versionDetails.sharedMappings || !versionDetails.client || !versionDetails.server);
101135

102136
if (singleProject) {
103-
await displayBuildScript(versionDetails, intermediaryGen, modLoader, loaderVersion, featherBuilds, ravenBuilds, sparrowBuilds, nestsBuilds, oslVersion, dependencyManagement);
137+
await displayBuildScript(versionDetails, intermediaryGen, modLoader, loaderVersion, loomVersion, ploceusVersion, featherBuilds, ravenBuilds, sparrowBuilds, nestsBuilds, oslVersion, dependencyManagement);
104138

105139
if (dependencyManagement === "propertiesFile") {
106140
await displayProjectProperties(versionDetails, intermediaryGen, modLoader, loaderVersion, featherBuilds, ravenBuilds, sparrowBuilds, nestsBuilds, oslVersion);
107141
}
108142
} else {
109-
await displayBuildScriptForGen1Split("root", versionDetails, intermediaryGen, modLoader, loaderVersion, featherBuilds, ravenBuilds, sparrowBuilds, nestsBuilds, oslVersion, dependencyManagement);
143+
await displayBuildScriptForGen1Split("root", versionDetails, intermediaryGen, modLoader, loaderVersion, loomVersion, ploceusVersion, featherBuilds, ravenBuilds, sparrowBuilds, nestsBuilds, oslVersion, dependencyManagement);
110144

111145
if (dependencyManagement === "propertiesFile") {
112146
await displayProjectPropertiesForGen1Split("root", versionDetails, intermediaryGen, modLoader, loaderVersion, featherBuilds, ravenBuilds, sparrowBuilds, nestsBuilds, oslVersion, dependencyManagement);
@@ -116,14 +150,14 @@ import { normalizeMinecraftVersion } from "./minecraft_semver.js";
116150
showElement("client.build.gradle");
117151
showElement("client.gradle.properties");
118152

119-
await displayBuildScriptForGen1Split("client", versionDetails, intermediaryGen, modLoader, loaderVersion, featherBuilds, ravenBuilds, sparrowBuilds, nestsBuilds, oslVersion, dependencyManagement);
153+
await displayBuildScriptForGen1Split("client", versionDetails, intermediaryGen, modLoader, loaderVersion, loomVersion, ploceusVersion, featherBuilds, ravenBuilds, sparrowBuilds, nestsBuilds, oslVersion, dependencyManagement);
120154
await displayProjectPropertiesForGen1Split("client", versionDetails, intermediaryGen, modLoader, loaderVersion, featherBuilds, ravenBuilds, sparrowBuilds, nestsBuilds, oslVersion, dependencyManagement);
121155
}
122156
if (versionDetails.server) {
123157
showElement("server.build.gradle");
124158
showElement("server.gradle.properties");
125159

126-
await displayBuildScriptForGen1Split("server", versionDetails, intermediaryGen, modLoader, loaderVersion, featherBuilds, ravenBuilds, sparrowBuilds, nestsBuilds, oslVersion, dependencyManagement);
160+
await displayBuildScriptForGen1Split("server", versionDetails, intermediaryGen, modLoader, loaderVersion, loomVersion, ploceusVersion, featherBuilds, ravenBuilds, sparrowBuilds, nestsBuilds, oslVersion, dependencyManagement);
127161
await displayProjectPropertiesForGen1Split("server", versionDetails, intermediaryGen, modLoader, loaderVersion, featherBuilds, ravenBuilds, sparrowBuilds, nestsBuilds, oslVersion, dependencyManagement);
128162
}
129163
}
@@ -192,7 +226,7 @@ import { normalizeMinecraftVersion } from "./minecraft_semver.js";
192226
}
193227
}
194228

195-
async function displayBuildScript(minecraftVersion, intermediaryGen, modLoader, loaderVersion, featherBuilds, ravenBuilds, sparrowBuilds, nestsBuilds, oslVersion, dependencyManagement) {
229+
async function displayBuildScript(minecraftVersion, intermediaryGen, modLoader, loaderVersion, loomVersion, ploceusVersion, featherBuilds, ravenBuilds, sparrowBuilds, nestsBuilds, oslVersion, dependencyManagement) {
196230
const sharedVersioning = isSharedVersioning(minecraftVersion);
197231
const elementId = "build.gradle.content";
198232

@@ -202,16 +236,16 @@ import { normalizeMinecraftVersion } from "./minecraft_semver.js";
202236

203237
switch (modLoader) {
204238
case "fabric":
205-
plugins.push(`\t${generatePluginDefinition(FABRIC_LOOM, "loom", LOOM_VERSION, dependencyManagement)}`);
239+
plugins.push(`\t${generatePluginDefinition(FABRIC_LOOM, "loom", loomVersion, dependencyManagement)}`);
206240
break;
207241
case "quilt":
208-
plugins.push(`\t${generatePluginDefinition(QUILT_LOOM, "loom", LOOM_VERSION, dependencyManagement)}`);
242+
plugins.push(`\t${generatePluginDefinition(QUILT_LOOM, "loom", loomVersion, dependencyManagement)}`);
209243
break;
210244
default:
211245
throw new Error("unknown mod loader " + modLoader);
212246
}
213247

214-
plugins.push(`\t${generatePluginDefinition(PLOCEUS, "ploceus", LOOM_VERSION, dependencyManagement)}`);
248+
plugins.push(`\t${generatePluginDefinition(PLOCEUS, "ploceus", ploceusVersion, dependencyManagement)}`);
215249

216250
if (plugins) {
217251
plugins.unshift("plugins {");
@@ -332,7 +366,7 @@ import { normalizeMinecraftVersion } from "./minecraft_semver.js";
332366
}
333367
}
334368

335-
async function displayBuildScriptForGen1Split(project, minecraftVersion, intermediaryGen, modLoader, loaderVersion, featherBuilds, ravenBuilds, sparrowBuilds, nestsBuilds, oslVersion, dependencyManagement) {
369+
async function displayBuildScriptForGen1Split(project, minecraftVersion, intermediaryGen, modLoader, loaderVersion, loomVersion, ploceusVersion, featherBuilds, ravenBuilds, sparrowBuilds, nestsBuilds, oslVersion, dependencyManagement) {
336370
if (project == "root") {
337371
const elementId = "build.gradle.content";
338372

@@ -342,16 +376,16 @@ import { normalizeMinecraftVersion } from "./minecraft_semver.js";
342376

343377
switch (modLoader) {
344378
case "fabric":
345-
plugins.push(`\t${generatePluginDefinition(FABRIC_LOOM, "loom", LOOM_VERSION, dependencyManagement, false)}`);
379+
plugins.push(`\t${generatePluginDefinition(FABRIC_LOOM, "loom", loomVersion, dependencyManagement, false)}`);
346380
break;
347381
case "quilt":
348-
plugins.push(`\t${generatePluginDefinition(QUILT_LOOM, "loom", LOOM_VERSION, dependencyManagement, false)}`);
382+
plugins.push(`\t${generatePluginDefinition(QUILT_LOOM, "loom", loomVersion, dependencyManagement, false)}`);
349383
break;
350384
default:
351385
throw new Error("unknown mod loader " + modLoader);
352386
}
353387

354-
plugins.push(`\t${generatePluginDefinition(PLOCEUS, "ploceus", LOOM_VERSION, dependencyManagement, false)}`);
388+
plugins.push(`\t${generatePluginDefinition(PLOCEUS, "ploceus", ploceusVersion, dependencyManagement, false)}`);
355389

356390
if (plugins) {
357391
plugins.unshift("plugins {");
@@ -568,7 +602,7 @@ import { normalizeMinecraftVersion } from "./minecraft_semver.js";
568602
}
569603
}
570604

571-
async function displayVersionCatalog(minecraftVersion, intermediaryGen, modLoader, loaderVersion, featherBuilds, ravenBuilds, sparrowBuilds, nestsBuilds, oslVersion) {
605+
async function displayVersionCatalog(minecraftVersion, intermediaryGen, modLoader, loaderVersion, loomVersion, ploceusVersion, featherBuilds, ravenBuilds, sparrowBuilds, nestsBuilds, oslVersion) {
572606
const elementId = "version-catalog.content";
573607
const lines = [];
574608

@@ -621,8 +655,8 @@ import { normalizeMinecraftVersion } from "./minecraft_semver.js";
621655
}
622656

623657
lines.push(``);
624-
lines.push(`loom = "${LOOM_VERSION}"`);
625-
lines.push(`ploceus = "${LOOM_VERSION}"`);
658+
lines.push(`loom = "${loomVersion}"`);
659+
lines.push(`ploceus = "${ploceusVersion}"`);
626660

627661
lines.push(``);
628662
lines.push(`[libraries]`);

public/meta_maven_utils.js

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,3 +212,42 @@ export function isSharedVersioning(minecraftVersion) {
212212
const fc = minecraftVersion.id.charAt(0);
213213
return !(fc == 'r' || fc == 'p' || fc == 'c' || fc == 'i' || fc == 'a' || fc == 's');
214214
}
215+
216+
async function getVersionsFromMavenMetadata(url) {
217+
const response = await fetch(url);
218+
const data = await response.text();
219+
220+
const parser = new DOMParser();
221+
const document = parser.parseFromString(data, "text/xml");
222+
const versions = document.getElementsByTagName("version");
223+
224+
const results = [];
225+
226+
for (const version of versions) {
227+
results.push(version.textContent);
228+
}
229+
230+
return results.sort((left, right) => compareVersion(left, right));
231+
}
232+
233+
export async function getLoomVersions(modLoader) {
234+
let base;
235+
236+
switch (modLoader) {
237+
case "fabric":
238+
base = "https://maven.fabricmc.net/net/fabricmc/fabric-loom-remap/net.fabricmc.fabric-loom-remap.gradle.plugin";
239+
break;
240+
case "quilt":
241+
base = "https://maven.quiltmc.org/repository/release/org/quiltmc/loom/remap/org.quiltmc.loom.remap.gradle.plugin";
242+
break;
243+
default:
244+
throw new Error("unknown mod loader " + modLoader);
245+
}
246+
247+
return await getVersionsFromMavenMetadata(`${base}/maven-metadata.xml`);
248+
}
249+
250+
export async function getPloceusVersions() {
251+
const url = `https://${MAVEN}/releases/net/ornithemc/ploceus/maven-metadata.xml`;
252+
return await getVersionsFromMavenMetadata(url);
253+
}

0 commit comments

Comments
 (0)