Download intermediary using Gradle (#1042)

* Download intermediary using Gradle

* address review

* Remove ApiWrapper

* Use detached configuration
This commit is contained in:
Jason Penilla
2024-02-08 15:20:10 -07:00
committed by GitHub
parent 2a385b3e2b
commit 910963a81c
5 changed files with 101 additions and 14 deletions

View File

@@ -27,25 +27,42 @@ package net.fabricmc.loom.configuration.providers.mappings;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;
import javax.inject.Inject;
import com.google.common.net.UrlEscapers;
import org.gradle.api.Action;
import org.gradle.api.Project;
import org.gradle.api.artifacts.Configuration;
import org.gradle.api.artifacts.DependencyArtifact;
import org.gradle.api.artifacts.ModuleDependency;
import org.gradle.api.artifacts.dsl.DependencyFactory;
import org.gradle.api.provider.Property;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import net.fabricmc.loom.api.mappings.intermediate.IntermediateMappingsProvider;
import net.fabricmc.loom.extension.LoomGradleExtensionApiImpl;
public abstract class IntermediaryMappingsProvider extends IntermediateMappingsProvider {
@ApiStatus.Internal
public abstract class IntermediaryMappingsProvider extends IntermediateMappingsProviderInternal {
public static final String NAME = "intermediary-v2";
private static final String FABRIC_INTERMEDIARY_GROUP_NAME = "net.fabricmc:intermediary";
private static final Logger LOGGER = LoggerFactory.getLogger(IntermediateMappingsProvider.class);
public abstract Property<String> getIntermediaryUrl();
public abstract Property<Boolean> getRefreshDeps();
@Inject
public abstract DependencyFactory getDependencyFactory();
@Override
public void provide(Path tinyMappings) throws IOException {
public void provide(Path tinyMappings, @Nullable Project project) throws IOException {
if (Files.exists(tinyMappings) && !getRefreshDeps().get()) {
return;
}
@@ -53,16 +70,37 @@ public abstract class IntermediaryMappingsProvider extends IntermediateMappingsP
// Download and extract intermediary
final Path intermediaryJarPath = Files.createTempFile(getName(), ".jar");
final String encodedMcVersion = UrlEscapers.urlFragmentEscaper().escape(getMinecraftVersion().get());
final String url = getIntermediaryUrl().get().formatted(encodedMcVersion);
final String urlRaw = getIntermediaryUrl().get();
LOGGER.info("Downloading intermediary from {}", url);
if (project != null && urlRaw.equals(LoomGradleExtensionApiImpl.DEFAULT_INTERMEDIARY_URL)) {
final ModuleDependency intermediaryDep = getDependencyFactory()
.create(FABRIC_INTERMEDIARY_GROUP_NAME + ':' + encodedMcVersion);
intermediaryDep.artifact(new Action<DependencyArtifact>() {
@Override
public void execute(final DependencyArtifact dependencyArtifact) {
dependencyArtifact.setClassifier("v2");
}
});
final Configuration config = project.getConfigurations().detachedConfiguration(intermediaryDep);
Files.deleteIfExists(tinyMappings);
Files.deleteIfExists(intermediaryJarPath);
Files.copy(
config.getSingleFile().toPath(),
intermediaryJarPath,
StandardCopyOption.REPLACE_EXISTING
);
Files.deleteIfExists(tinyMappings);
} else {
final String url = urlRaw.formatted(encodedMcVersion);
getDownloader().get().apply(url)
.defaultCache()
.downloadPath(intermediaryJarPath);
LOGGER.info("Downloading intermediary from {}", url);
Files.deleteIfExists(tinyMappings);
Files.deleteIfExists(intermediaryJarPath);
getDownloader().get().apply(url)
.defaultCache()
.downloadPath(intermediaryJarPath);
}
MappingConfiguration.extractMappings(intermediaryJarPath, tinyMappings);
}

View File

@@ -0,0 +1,44 @@
/*
* This file is part of fabric-loom, licensed under the MIT License (MIT).
*
* Copyright (c) 2024 FabricMC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package net.fabricmc.loom.configuration.providers.mappings;
import java.io.IOException;
import java.nio.file.Path;
import org.gradle.api.Project;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.Nullable;
import net.fabricmc.loom.api.mappings.intermediate.IntermediateMappingsProvider;
@ApiStatus.Internal
public abstract class IntermediateMappingsProviderInternal extends IntermediateMappingsProvider {
public abstract void provide(Path tinyMappings, @Nullable Project project) throws IOException;
@Override
public void provide(Path tinyMappings) throws IOException {
this.provide(tinyMappings, null);
}
}

View File

@@ -61,15 +61,19 @@ public final class IntermediateMappingsService implements SharedService {
final IntermediateMappingsProvider intermediateProvider = extension.getIntermediateMappingsProvider();
final String id = "IntermediateMappingsService:%s:%s".formatted(intermediateProvider.getName(), intermediateProvider.getMinecraftVersion().get());
return sharedServiceManager.getOrCreateService(id, () -> create(intermediateProvider, minecraftProvider));
return sharedServiceManager.getOrCreateService(id, () -> create(intermediateProvider, minecraftProvider, project));
}
@VisibleForTesting
public static IntermediateMappingsService create(IntermediateMappingsProvider intermediateMappingsProvider, MinecraftProvider minecraftProvider) {
public static IntermediateMappingsService create(IntermediateMappingsProvider intermediateMappingsProvider, MinecraftProvider minecraftProvider, Project project) {
final Path intermediaryTiny = minecraftProvider.file(intermediateMappingsProvider.getName() + ".tiny").toPath();
try {
intermediateMappingsProvider.provide(intermediaryTiny);
if (intermediateMappingsProvider instanceof IntermediateMappingsProviderInternal internal) {
internal.provide(intermediaryTiny, project);
} else {
intermediateMappingsProvider.provide(intermediaryTiny);
}
} catch (IOException e) {
try {
Files.deleteIfExists(intermediaryTiny);

View File

@@ -102,6 +102,7 @@ public abstract class LoomGradleExtensionApiImpl implements LoomGradleExtensionA
// A common mistake with layered mappings is to call the wrong `officialMojangMappings` method, use this to keep track of when we are building a layered mapping spec.
protected final ThreadLocal<Boolean> layeredSpecBuilderScope = ThreadLocal.withInitial(() -> false);
public static final String DEFAULT_INTERMEDIARY_URL = "https://maven.fabricmc.net/net/fabricmc/intermediary/%1$s/intermediary-%1$s-v2.jar";
protected boolean hasEvaluatedLayeredMappings = false;
protected final Map<LayeredMappingSpec, LayeredMappingsFactory> layeredMappingsDependencyMap = new HashMap<>();
@@ -125,7 +126,7 @@ public abstract class LoomGradleExtensionApiImpl implements LoomGradleExtensionA
.convention(true);
this.modProvidedJavadoc.finalizeValueOnRead();
this.intermediary = project.getObjects().property(String.class)
.convention("https://maven.fabricmc.net/net/fabricmc/intermediary/%1$s/intermediary-%1$s-v2.jar");
.convention(DEFAULT_INTERMEDIARY_URL);
this.intermediateMappingsProvider = project.getObjects().property(IntermediateMappingsProvider.class);
this.intermediateMappingsProvider.finalizeValueOnRead();

View File

@@ -141,7 +141,7 @@ abstract class LayeredMappingsSpecification extends Specification implements Lay
@Override
Supplier<MemoryMappingTree> intermediaryTree() {
return {
IntermediateMappingsService.create(LoomMocks.intermediaryMappingsProviderMock("test", intermediaryUrl), minecraftProvider()).memoryMappingTree
IntermediateMappingsService.create(LoomMocks.intermediaryMappingsProviderMock("test", intermediaryUrl), minecraftProvider(), null).memoryMappingTree
}
}