mirror of
https://github.com/architectury/architectury-loom.git
synced 2026-04-02 05:27:43 -05:00
Download intermediary using Gradle (#1042)
* Download intermediary using Gradle * address review * Remove ApiWrapper * Use detached configuration
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user