Skip to content
Merged
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
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@
import me.itzg.helpers.files.ResultsFileWriter;
import me.itzg.helpers.forge.ForgeInstaller;
import me.itzg.helpers.forge.ForgeInstallerResolver;
import me.itzg.helpers.forge.ForgeUrlArgs;
import me.itzg.helpers.forge.NeoForgeInstallerResolver;
import me.itzg.helpers.http.FailedRequestException;
import me.itzg.helpers.http.Fetch;
Expand Down Expand Up @@ -129,6 +130,9 @@ public class CurseForgeInstaller {
@Getter @Setter
private CacheArgs cacheArgs;

@Getter @Setter
private ForgeUrlArgs forgeUrlArgs;

/**
*/
public void installFromModpackZip(Path modpackZip, String slug) {
Expand Down Expand Up @@ -971,7 +975,8 @@ private void prepareFabric(String minecraftVersion, String loaderVersion) {
private void prepareForge(SharedFetch sharedFetch, String minecraftVersion, String loaderVersion) {
new ForgeInstaller(
new ForgeInstallerResolver(sharedFetch,
minecraftVersion, loaderVersion
minecraftVersion, loaderVersion,
forgeUrlArgs.getPromotionsUrl(), forgeUrlArgs.getMavenRepoUrl()
)
)
.install(outputDir, resultsFile, forceReinstallModloader, "Forge");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import me.itzg.helpers.curseforge.ModpacksPageUrlParser.Parsed;
import me.itzg.helpers.files.ResultsFileWriter;
import me.itzg.helpers.files.TabularOutput;
import me.itzg.helpers.forge.ForgeUrlArgs;
import me.itzg.helpers.http.PathOrUri;
import me.itzg.helpers.http.PathOrUriConverter;
import me.itzg.helpers.http.SharedFetchArgs;
Expand Down Expand Up @@ -167,6 +168,9 @@ static class Listed {
@ArgGroup(exclusive = false)
CacheArgs cacheArgs;

@ArgGroup(exclusive = false)
ForgeUrlArgs forgeUrlArgs = new ForgeUrlArgs();

@Override
public Integer call() throws Exception {
// https://www.curseforge.com/minecraft/modpacks/all-the-mods-8/files
Expand Down Expand Up @@ -203,7 +207,8 @@ public Integer call() throws Exception {
.setApiKey(apiKey)
.setDownloadsRepo(downloadsRepo)
.setDisableApiCaching(disableApiCaching)
.setCacheArgs(cacheArgs);
.setCacheArgs(cacheArgs)
.setForgeUrlArgs(forgeUrlArgs);

if (apiBaseUrl != null) {
installer.setApiBaseUrl(apiBaseUrl);
Expand Down
73 changes: 37 additions & 36 deletions src/main/java/me/itzg/helpers/forge/ForgeInstallerResolver.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,24 +15,31 @@
import me.itzg.helpers.http.FailedRequestException;
import me.itzg.helpers.http.SharedFetch;
import me.itzg.helpers.http.Uris;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

@Slf4j
public class ForgeInstallerResolver implements InstallerResolver {
public static final String LATEST = "latest";
public static final String RECOMMENDED = "recommended";
public static final String DEFAULT_PROMOTIONS_URL = "https://files.minecraftforge.net/net/minecraftforge/forge/promotions_slim.json";
public static final String DEFAULT_MAVEN_REPO_URL = "https://maven.minecraftforge.net";

private final static String promotionsUrl = "https://files.minecraftforge.net/net/minecraftforge/forge/promotions_slim.json";
private final static String mavenRepoUrl = "https://maven.minecraftforge.net";
private final String promotionsUrl;
private final String mavenRepoUrl;
private final SharedFetch sharedFetch;
private final String requestedMinecraftVersion;
private final String requestedForgeVersion;

public ForgeInstallerResolver(SharedFetch sharedFetch,
String requestedMinecraftVersion, String requestedForgeVersion
String requestedMinecraftVersion, String requestedForgeVersion,
String promotionsUrl, String mavenRepoUrl
) {
this.sharedFetch = sharedFetch;
this.requestedMinecraftVersion = requestedMinecraftVersion;
this.requestedForgeVersion = requestedForgeVersion;
this.promotionsUrl = promotionsUrl;
this.mavenRepoUrl = mavenRepoUrl;
}

@Override
Expand Down Expand Up @@ -62,41 +69,35 @@ public Path download(String minecraftVersion, String forgeVersion, Path outputDi
minecraftVersion, forgeVersion
) +".jar");

boolean success = false;
// every few major versions Forge would chane their version qualifier scheme :(
for (final String installerUrlVersion : new String[]{
String.join("-", minecraftVersion, forgeVersion),
String.join("-", minecraftVersion, forgeVersion, minecraftVersion),
String.join("-", minecraftVersion, forgeVersion, "mc172")
}) {
try {
sharedFetch.fetch(Uris.populateToUri(
mavenRepoUrl
+ "/net/minecraftforge/forge/{version}/forge-{version}-installer.jar",
installerUrlVersion, installerUrlVersion
))
.userAgentCommand("forge")
.toFile(installerJar)
.skipExisting(true)
.acceptContentTypes(Collections.singletonList("application/java-archive"))
.execute();
success = true;
break;
} catch (FailedRequestException e){
if (e.getStatusCode() != 404) {
throw new RuntimeException("Trying to download forge installer", e);
}
}
catch (IOException e) {
throw new RuntimeException("Trying to download forge installer", e);
}
}

if (!success) {
final Path result = Flux.just(
// every few major versions Forge changes their version qualifier scheme
String.join("-", minecraftVersion, forgeVersion),
String.join("-", minecraftVersion, forgeVersion, minecraftVersion),
String.join("-", minecraftVersion, forgeVersion, "mc172")
)
// concatMap ensures each is tried (to be found) before the next
.concatMap(versionToTry ->
sharedFetch.fetch(Uris.populateToUri(
mavenRepoUrl
+ "/net/minecraftforge/forge/{version}/forge-{version}-installer.jar",
versionToTry, versionToTry
))
.toFile(installerJar)
.skipExisting(true)
.acceptContentTypes(Collections.singletonList("application/java-archive"))
.assemble()
.checkpoint("downloading installer jar for " + versionToTry)
// just skip this one if not found
.onErrorResume(FailedRequestException::isNotFound, throwable -> Mono.empty())
)
.blockFirst();

if (result == null) {
throw new GenericException("Failed to locate forge installer");
}

return installerJar;
else {
return result;
}
}

@Override
Expand Down
30 changes: 30 additions & 0 deletions src/main/java/me/itzg/helpers/forge/ForgeUrlArgs.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package me.itzg.helpers.forge;

import picocli.CommandLine.Option;

public class ForgeUrlArgs {

@Option(names = "--forge-promotions-url", paramLabel = "URL",
defaultValue = "${FORGE_PROMOTIONS_URL:-" + ForgeInstallerResolver.DEFAULT_PROMOTIONS_URL + "}",
description = "URL for Forge promotions JSON.%n"
+ "Can also be set via env var FORGE_PROMOTIONS_URL%n"
+ "Default is ${DEFAULT-VALUE}"
)
String promotionsUrl;

public String getPromotionsUrl() {
return promotionsUrl != null ? promotionsUrl : ForgeInstallerResolver.DEFAULT_PROMOTIONS_URL;
}

@Option(names = "--forge-maven-repo-url", paramLabel = "URL",
defaultValue = "${FORGE_MAVEN_REPO_URL:-" + ForgeInstallerResolver.DEFAULT_MAVEN_REPO_URL + "}",
description = "URL for Forge Maven repository where installer is downloaded.%n"
+ "Can also be set via env var FORGE_MAVEN_REPO_URL%n"
+ "Default is ${DEFAULT-VALUE}"
)
String mavenRepoUrl;

public String getMavenRepoUrl() {
return mavenRepoUrl != null ? mavenRepoUrl : ForgeInstallerResolver.DEFAULT_MAVEN_REPO_URL;
}
}
10 changes: 8 additions & 2 deletions src/main/java/me/itzg/helpers/forge/InstallForgeCommand.java
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ public void setVersion(String version) {
this.version = version.toLowerCase();
}

@Option(names = "--forge-installer", description = "Use a local forge installer")
@Option(names = "--forge-installer", description = "Use a local forge installer", paramLabel = "FILE")
Path installer;
}

Expand All @@ -89,14 +89,20 @@ public void setVersion(String version) {
@ArgGroup(exclusive = false)
SharedFetchArgs sharedFetchArgs = new SharedFetchArgs();

@ArgGroup(exclusive = false)
ForgeUrlArgs forgeUrlArgs = new ForgeUrlArgs();

@Override
public Integer call() throws Exception {
try (SharedFetch sharedFetch = Fetch.sharedFetch("install-forge", sharedFetchArgs.options())) {

final ForgeInstaller installer = new ForgeInstaller(
versionOrInstaller.installer != null ?
new ProvidedInstallerResolver(versionOrInstaller.installer)
: new ForgeInstallerResolver(sharedFetch, minecraftVersion, versionOrInstaller.version)
: new ForgeInstallerResolver(
sharedFetch, minecraftVersion, versionOrInstaller.version,
forgeUrlArgs.getPromotionsUrl(), forgeUrlArgs.getMavenRepoUrl()
)

);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import me.itzg.helpers.errors.InvalidParameterException;
import me.itzg.helpers.files.Manifests;
import me.itzg.helpers.files.ResultsFileWriter;
import me.itzg.helpers.forge.ForgeUrlArgs;
import me.itzg.helpers.http.Fetch;
import me.itzg.helpers.http.PathOrUri;
import me.itzg.helpers.http.PathOrUriConverter;
Expand All @@ -21,6 +22,7 @@
import me.itzg.helpers.modrinth.model.VersionType;
import org.jetbrains.annotations.VisibleForTesting;
import picocli.CommandLine;
import picocli.CommandLine.ArgGroup;
import picocli.CommandLine.ExitCode;
import picocli.CommandLine.Option;
import reactor.core.publisher.Mono;
Expand Down Expand Up @@ -116,6 +118,9 @@ public class InstallModrinthModpackCommand implements Callable<Integer> {
@CommandLine.ArgGroup(exclusive = false)
SharedFetchArgs sharedFetchArgs = new SharedFetchArgs();

@ArgGroup(exclusive = false)
ForgeUrlArgs forgeUrlArgs = new ForgeUrlArgs();

@Override
public Integer call() throws IOException {

Expand Down Expand Up @@ -221,7 +226,8 @@ ModrinthPackInstaller create(ModrinthApiClient apiClient, Path mrPackFile,
mrPackFile, this.outputDirectory, this.resultsFile,
this.forceModloaderReinstall,
fileInclusionCalculator
);
)
.setForgeUrlArgs(forgeUrlArgs);

private Mono<Installation> processResultsFile(FetchedPack fetchedPack, Installation installation) {
return Mono.fromCallable(() -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import java.util.stream.Collectors;
import java.util.stream.Stream;
import java.util.zip.ZipFile;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import me.itzg.helpers.errors.GenericException;
import me.itzg.helpers.errors.InvalidParameterException;
Expand All @@ -21,6 +22,7 @@
import me.itzg.helpers.files.IoStreams;
import me.itzg.helpers.forge.ForgeInstaller;
import me.itzg.helpers.forge.ForgeInstallerResolver;
import me.itzg.helpers.forge.ForgeUrlArgs;
import me.itzg.helpers.forge.NeoForgeInstallerResolver;
import me.itzg.helpers.http.SharedFetch;
import me.itzg.helpers.http.SharedFetch.Options;
Expand All @@ -44,6 +46,8 @@ public class ModrinthPackInstaller {
private final boolean forceModloaderReinstall;
private final FileInclusionCalculator fileInclusionCalculator;
private final Options sharedFetchOpts;
@Setter
private ForgeUrlArgs forgeUrlArgs = new ForgeUrlArgs();

private AntPathMatcher overridesExclusions;

Expand Down Expand Up @@ -262,7 +266,9 @@ private void prepareFabric(SharedFetch sharedFetch, String minecraftVersion, Str

private void prepareForge(SharedFetch sharedFetch, String minecraftVersion, String version) {
new ForgeInstaller(
new ForgeInstallerResolver(sharedFetch, minecraftVersion, version)
new ForgeInstallerResolver(sharedFetch, minecraftVersion, version,
forgeUrlArgs.getPromotionsUrl(), forgeUrlArgs.getMavenRepoUrl()
)
)
.install(
this.outputDirectory,
Expand Down