Version fetching refactoring (#373)

* Put modloader version data in struct for legibility

* Create modloader map from list

This is a minor change, but it prevents any errors with the keys not being equal to the modloader's Name field

* Less anonymous functions in modloader version retrieval

With previous code, almost everything was lazy and returned a function. Changed this to only have anonymous function in the modloader definitions, and the rest of the functions all just execute their results immediately instead or returning a function. Makes for a bit more legible code.

* Simplify FetchMavenVersionFiltered

* Rewrite version retrieval

* Use Errorf in versionutil

* Remove httpclient parameter

turned out not to be needed

* Add testing for version retrieval

* Explain fetchMavenWithFilterMap
This commit is contained in:
TheEpicBlock
2026-02-18 23:01:04 +01:00
committed by GitHub
parent 52b123018f
commit 945f852259
12 changed files with 1123 additions and 179 deletions

View File

@@ -40,12 +40,18 @@ var loaderCommand = &cobra.Command{
fmt.Printf("Error getting Minecraft version: %s\n", err)
os.Exit(1)
}
if args[0] == "latest" {
fmt.Println("Updating to latest loader version")
if args[0] == "latest" || args[0] == "recommended" {
fmt.Printf("Updating to %s loader version\n", args[0])
queryType := core.Latest
if args[0] == "recommended" {
queryType = core.Recommended
}
// We'll be updating to the latest loader version
for _, loader := range currentLoaders {
_, latest, gottenLoader := getVersionsForLoader(loader, mcVersion)
if !updatePackToVersion(latest, modpack, gottenLoader) {
versionData, gottenLoader := getVersionsForLoader(loader, mcVersion, queryType)
if !updatePackToVersion(versionData.Latest, modpack, gottenLoader) {
continue
}
// Write the pack to disk
@@ -55,36 +61,14 @@ var loaderCommand = &cobra.Command{
continue
}
}
} else if args[0] == "recommended" {
// TODO: Figure out a way to get the recommended version, this is Forge only
// Ensure we're on Forge
if !slices.Contains(currentLoaders, "forge") {
fmt.Println("The recommended loader version is only available on Forge!")
os.Exit(1)
}
// We'll be updating to the recommended loader version
recommendedVer := core.GetForgeRecommended(mcVersion)
if recommendedVer == "" {
fmt.Println("Error getting recommended Forge version!")
os.Exit(1)
}
if ok := updatePackToVersion(recommendedVer, modpack, core.ModLoaders["forge"]); !ok {
os.Exit(1)
}
// Write the pack to disk
err = modpack.Write()
if err != nil {
fmt.Printf("Error writing pack.toml: %s", err)
os.Exit(1)
}
} else {
fmt.Println("Updating to explicit loader version")
// This one is easy :D
versions, _, loader := getVersionsForLoader(currentLoaders[0], mcVersion)
versionData, loader := getVersionsForLoader(currentLoaders[0], mcVersion, core.Latest)
// Check if the loader happens to be Forge/NeoForge, since there's two version formats
if loader.Name == "forge" || loader.Name == "neoforge" {
wantedVersion := cmdshared.GetRawForgeVersion(args[0])
validateVersion(versions, wantedVersion, loader)
validateVersion(versionData.Versions, wantedVersion, loader)
_ = updatePackToVersion(wantedVersion, modpack, loader)
} else if loader.Name == "liteloader" {
// These are weird and just have a MC version
@@ -92,7 +76,7 @@ var loaderCommand = &cobra.Command{
os.Exit(0)
} else {
// We're on Fabric or quilt
validateVersion(versions, args[0], loader)
validateVersion(versionData.Versions, args[0], loader)
if ok := updatePackToVersion(args[0], modpack, loader); !ok {
os.Exit(1)
}
@@ -111,18 +95,18 @@ func init() {
migrateCmd.AddCommand(loaderCommand)
}
func getVersionsForLoader(loader, mcVersion string) ([]string, string, core.ModLoaderComponent) {
func getVersionsForLoader(loader, mcVersion string, queryType core.QueryType) (*core.ModLoaderVersions, core.ModLoaderComponent) {
gottenLoader, ok := core.ModLoaders[loader]
if !ok {
fmt.Printf("Unknown loader %s\n", loader)
os.Exit(1)
}
versions, latestVersion, err := gottenLoader.VersionListGetter(mcVersion)
versionData, err := core.DoQuery(core.MakeQuery(gottenLoader, mcVersion).WithQueryType(queryType))
if err != nil {
fmt.Printf("Error getting version list for %s: %s\n", gottenLoader.FriendlyName, err)
os.Exit(1)
}
return versions, latestVersion, gottenLoader
return versionData, gottenLoader
}
func validateVersion(versions []string, version string, gottenLoader core.ModLoaderComponent) {