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,7 +52,7 @@
import me.itzg.helpers.files.Manifests;
import me.itzg.helpers.files.ReactiveFileUtils;
import me.itzg.helpers.files.ResultsFileWriter;
import me.itzg.helpers.forge.ForgeInstaller;
import me.itzg.helpers.forge.ForgeLikeInstaller;
import me.itzg.helpers.forge.ForgeInstallerResolver;
import me.itzg.helpers.forge.ForgeUrlArgs;
import me.itzg.helpers.forge.NeoForgeInstallerResolver;
Expand Down Expand Up @@ -1006,7 +1006,7 @@ private void prepareFabric(String minecraftVersion, String loaderVersion) {
}

private void prepareForge(SharedFetch sharedFetch, String minecraftVersion, String loaderVersion) {
new ForgeInstaller(
new ForgeLikeInstaller(
new ForgeInstallerResolver(sharedFetch,
minecraftVersion, loaderVersion,
forgeUrlArgs.getPromotionsUrl(), forgeUrlArgs.getMavenRepoUrl()
Expand All @@ -1016,7 +1016,7 @@ private void prepareForge(SharedFetch sharedFetch, String minecraftVersion, Stri
}

private void prepareNeoForge(SharedFetch sharedFetch, String minecraftVersion, String loaderVersion) {
new ForgeInstaller(
new ForgeLikeInstaller(
new NeoForgeInstallerResolver(sharedFetch,
minecraftVersion, loaderVersion
)
Expand Down
12 changes: 11 additions & 1 deletion src/main/java/me/itzg/helpers/forge/ForgeInstallerResolver.java
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,17 @@ public ForgeInstallerResolver(SharedFetch sharedFetch,
}

@Override
public VersionPair resolve() {
public VersionPair resolve(ForgeManifest prevManifest) {
if (prevManifest != null) {
final String prevMinecraftVersion = prevManifest.getMinecraftVersion();
final String prevForgeVersion = prevManifest.getForgeVersion();
if (prevMinecraftVersion.equals(requestedMinecraftVersion)
&& prevForgeVersion.equals(requestedForgeVersion)) {
log.debug("Resolved Minecraft {} Forge {} from previous manifest", prevMinecraftVersion, prevForgeVersion);
return new VersionPair(requestedMinecraftVersion, requestedForgeVersion);
}
}

final PromotionsSlim promotionsSlim = loadPromotions();
if (promotionsSlim.getPromos().isEmpty()) {
throw new GenericException("No versions were available in Forge promotions");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,15 @@
import org.jetbrains.annotations.Nullable;

@Slf4j
public class ForgeInstaller {
public class ForgeLikeInstaller {

private static final Pattern RESULT_INFO = Pattern.compile(
"Exec:\\s+(?<exec>.+)"
+ "|The server installed successfully, you should now be able to run the file (?<universalJar>.+)");

private final InstallerResolver installerResolver;

public ForgeInstaller(InstallerResolver installerResolver) {
public ForgeLikeInstaller(InstallerResolver installerResolver) {
this.installerResolver = installerResolver;
}

Expand All @@ -51,7 +51,7 @@ public void install(
throw new GenericException("Failed to load existing forge manifest", e);
}

final VersionPair resolved = installerResolver.resolve();
final VersionPair resolved = installerResolver.resolve(prevManifest);
if (resolved == null) {
throw new InvalidParameterException("Unable to find suitable version for " +
installerResolver.getDescription());
Expand Down
3 changes: 2 additions & 1 deletion src/main/java/me/itzg/helpers/forge/InstallForgeCommand.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ public class InstallForgeCommand implements Callable<Integer> {
@Spec
CommandLine.Model.CommandSpec spec;

@SuppressWarnings("unused")
@Option(names = {"--help", "-h"}, usageHelp = true)
boolean help;

Expand Down Expand Up @@ -96,7 +97,7 @@ public void setVersion(String version) {
public Integer call() throws Exception {
try (SharedFetch sharedFetch = Fetch.sharedFetch("install-forge", sharedFetchArgs.options())) {

final ForgeInstaller installer = new ForgeInstaller(
final ForgeLikeInstaller installer = new ForgeLikeInstaller(
versionOrInstaller.installer != null ?
new ProvidedInstallerResolver(versionOrInstaller.installer)
: new ForgeInstallerResolver(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ public class InstallNeoForgeCommand implements Callable<Integer> {
@Spec
CommandLine.Model.CommandSpec spec;

@SuppressWarnings("unused")
@Option(names = {"--help", "-h"}, usageHelp = true)
boolean help;

Expand Down Expand Up @@ -81,7 +82,7 @@ public void setVersion(String version) {
public Integer call() throws Exception {
try (SharedFetch sharedFetch = Fetch.sharedFetch("install-neoforge", sharedFetchArgs.options())) {

new ForgeInstaller(
new ForgeLikeInstaller(
new NeoForgeInstallerResolver(sharedFetch, minecraftVersion, neoForgeVersion)
)
.install(outputDirectory, resultsFile, forceReinstall, "NeoForge");
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/me/itzg/helpers/forge/InstallerResolver.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

public interface InstallerResolver {

VersionPair resolve();
VersionPair resolve(ForgeManifest prevManifest);

Path download(String minecraftVersion, String forgeVersion, Path outputDir);

Expand Down
13 changes: 11 additions & 2 deletions src/main/java/me/itzg/helpers/forge/NeoForgeInstallerResolver.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ public class NeoForgeInstallerResolver implements InstallerResolver {
public static final String ARTIFACT_ID_FORGE_LIKE = "forge";
public static final String ARTIFACT_ID = "neoforge";
public static final String FORGE_LIKE_VERSION = "1.20.1";
public static final String DEFAULT_MVN_URL = "https://maven.neoforged.net/releases";

private final MavenRepoApi mavenRepoApi;
private final String requestedMinecraftVersion;
Expand All @@ -36,7 +37,7 @@ public NeoForgeInstallerResolver(SharedFetch sharedFetch,
@Nullable
String requestedNeoForgeVersion
) {
this(sharedFetch, requestedMinecraftVersion, requestedNeoForgeVersion, "https://maven.neoforged.net/releases");
this(sharedFetch, requestedMinecraftVersion, requestedNeoForgeVersion, DEFAULT_MVN_URL);
}

NeoForgeInstallerResolver(SharedFetch sharedFetch,
Expand All @@ -60,7 +61,7 @@ enum NeoForgeVersionType {
}

@Override
public VersionPair resolve() {
public VersionPair resolve(ForgeManifest prevManifest) {
if (useForgeArtifactId(requestedMinecraftVersion)) {
return resolveForgeLike();
}
Expand All @@ -84,6 +85,14 @@ else if (requestedNeoForgeVersion == null || requestedNeoForgeVersion.equalsIgno
if (neoforgeVersion.length < 3) {
throw new InvalidParameterException("Malformed NeoForge version: " + requestedNeoForgeVersion);
}

if (prevManifest != null) {
if (prevManifest.getMinecraftVersion().equals(requestedMinecraftVersion)
&& prevManifest.getForgeVersion().equals(requestedNeoForgeVersion)) {
return new VersionPair(requestedMinecraftVersion, requestedNeoForgeVersion);
}

}
}

final MavenMetadata metadata = mavenRepoApi.fetchMetadata(GROUP_ID, ARTIFACT_ID)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ public ProvidedInstallerResolver(Path forgeInstaller) {
}

@Override
public VersionPair resolve() {
public VersionPair resolve(ForgeManifest prevManifest) {
final VersionPair versions;
try {
versions = extractVersion(forgeInstaller);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
import me.itzg.helpers.fabric.FabricLauncherInstaller;
import me.itzg.helpers.files.AntPathMatcher;
import me.itzg.helpers.files.IoStreams;
import me.itzg.helpers.forge.ForgeInstaller;
import me.itzg.helpers.forge.ForgeLikeInstaller;
import me.itzg.helpers.forge.ForgeInstallerResolver;
import me.itzg.helpers.forge.ForgeUrlArgs;
import me.itzg.helpers.forge.NeoForgeInstallerResolver;
Expand Down Expand Up @@ -269,7 +269,7 @@ private void prepareFabric(SharedFetch sharedFetch, String minecraftVersion, Str
}

private void prepareForge(SharedFetch sharedFetch, String minecraftVersion, String version) {
new ForgeInstaller(
new ForgeLikeInstaller(
new ForgeInstallerResolver(sharedFetch, minecraftVersion, version,
forgeUrlArgs.getPromotionsUrl(), forgeUrlArgs.getMavenRepoUrl()
)
Expand All @@ -283,7 +283,7 @@ private void prepareForge(SharedFetch sharedFetch, String minecraftVersion, Stri
}

private void prepareNeoForge(SharedFetch sharedFetch, String minecraftVersion, String version) {
new ForgeInstaller(
new ForgeLikeInstaller(
new NeoForgeInstallerResolver(sharedFetch, minecraftVersion, version)
)
.install(
Expand Down
4 changes: 4 additions & 0 deletions src/main/java/me/itzg/helpers/mvn/MavenRepoApi.java
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,10 @@ private Mono<MavenMetadata> retrieveMetadata(String groupId, String artifactId)
)
.toObject(MavenMetadata.class, xmlMapper)
.assemble()
.doOnSubscribe(s ->
log.debug("Fetching maven metadata for {}:{} from {}",
groupId, artifactId, uriBuilder.getBaseUrl())
)
.checkpoint(String.format("fetching metadata for %s:%s", groupId, artifactId));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
import org.junit.jupiter.api.condition.EnabledIfSystemProperty;
import org.junit.jupiter.api.io.TempDir;

class CurseForgeInstallerTest {
class CurseForgeLikeInstallerTest {
@TempDir
Path tempDir;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,14 @@
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.params.provider.Arguments.arguments;

import com.github.tomakehurst.wiremock.client.WireMock;
import com.github.tomakehurst.wiremock.junit5.WireMockRuntimeInfo;
import com.github.tomakehurst.wiremock.junit5.WireMockTest;
import java.util.stream.Stream;
import me.itzg.helpers.http.Fetch;
import me.itzg.helpers.http.SharedFetch;
import me.itzg.helpers.http.SharedFetch.Options;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;
Expand Down Expand Up @@ -57,7 +59,7 @@ void resolve(String minecraftVersion, String neoforgeVersion,
)
);

final VersionPair versionPair = resolver.resolve();
final VersionPair versionPair = resolver.resolve(null);
if (expectedNeoforgeVersion == null) {
assertThat(versionPair).isNull();
}
Expand All @@ -70,4 +72,32 @@ void resolve(String minecraftVersion, String neoforgeVersion,
}
}

@Test
void resolveSkipsLookupWhenExists(WireMockRuntimeInfo wmInfo) {
final String minecraftVersion = "1.21.1";
final String neoforgeVersion = "21.1.215";

try (SharedFetch sharedFetch = Fetch.sharedFetch("install-neoforge", Options.builder().build())) {
final NeoForgeInstallerResolver resolver = new NeoForgeInstallerResolver(
sharedFetch,
minecraftVersion, neoforgeVersion,
wmInfo.getHttpBaseUrl()
);

// purposely no stub of wiremock to verify no network calls are made

final ForgeManifest manifest = ForgeManifest.builder()
.minecraftVersion(minecraftVersion)
.forgeVersion(neoforgeVersion)
.build();

final VersionPair versionPair = resolver.resolve(manifest);

assertThat(versionPair).isNotNull();
assertThat(versionPair.minecraft).isEqualTo(minecraftVersion);
assertThat(versionPair.forge).isEqualTo(neoforgeVersion);

WireMock.verify(0, getRequestedFor(WireMock.anyUrl()));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ void resolvesVersionFromFile() throws URISyntaxException {
final ProvidedInstallerResolver resolver = new ProvidedInstallerResolver(
Paths.get(installerUrl.toURI()));

final VersionPair versions = resolver.resolve();
final VersionPair versions = resolver.resolve(null);

assertThat(versions.minecraft).isEqualTo("1.20.2");
assertThat(versions.forge).isEqualTo("48.1.0");
Expand Down