diff --git a/build.gradle b/build.gradle index 8e779c5f..7e465dba 100644 --- a/build.gradle +++ b/build.gradle @@ -73,6 +73,12 @@ configurations.configureEach { } } +// Arch: Prevent compiling against Guava. +// The dependency is still leaked from DFU, but it shouldn't be used to keep up with upstream standards. +configurations.named('compileClasspath') { + exclude group: 'com.google.guava' +} + sourceSets { commonDecompiler { java { diff --git a/src/main/java/dev/architectury/loom/forge/minecraft/MinecraftPatchedProvider.java b/src/main/java/dev/architectury/loom/forge/minecraft/MinecraftPatchedProvider.java index 93fe52db..5346cc79 100644 --- a/src/main/java/dev/architectury/loom/forge/minecraft/MinecraftPatchedProvider.java +++ b/src/main/java/dev/architectury/loom/forge/minecraft/MinecraftPatchedProvider.java @@ -49,7 +49,6 @@ import java.util.jar.Manifest; import java.util.regex.Pattern; import java.util.stream.Stream; -import com.google.common.base.Preconditions; import de.oceanlabs.mcp.mcinjector.adaptors.ParameterAnnotationFixer; import dev.architectury.loom.accesstransformer.AccessTransformerService; import dev.architectury.loom.forge.CoreModClassRemapper; @@ -84,6 +83,7 @@ import net.fabricmc.loom.LoomGradleExtension; import net.fabricmc.loom.build.IntermediaryNamespaces; import net.fabricmc.loom.configuration.providers.mappings.TinyMappingsService; import net.fabricmc.loom.configuration.providers.minecraft.MinecraftProvider; +import net.fabricmc.loom.util.Check; import net.fabricmc.loom.util.Constants; import net.fabricmc.loom.util.FileSystemUtil; import net.fabricmc.loom.util.TinyRemapperHelper; @@ -614,7 +614,7 @@ public class MinecraftPatchedProvider { try (FileSystemUtil.Delegate delegate = FileSystemUtil.getJarFileSystem(target, false)) { Path manifestPath = delegate.get().getPath("META-INF/MANIFEST.MF"); - Preconditions.checkArgument(Files.exists(manifestPath), "META-INF/MANIFEST.MF does not exist in patched srg jar!"); + Check.require(Files.exists(manifestPath), "META-INF/MANIFEST.MF does not exist in patched srg jar!"); Manifest manifest = new Manifest(); if (Files.exists(manifestPath)) { diff --git a/src/main/java/dev/architectury/loom/mappings/ForgeMappingsMerger.java b/src/main/java/dev/architectury/loom/mappings/ForgeMappingsMerger.java index 24fcac3b..45c2272f 100644 --- a/src/main/java/dev/architectury/loom/mappings/ForgeMappingsMerger.java +++ b/src/main/java/dev/architectury/loom/mappings/ForgeMappingsMerger.java @@ -35,7 +35,6 @@ import java.util.Map; import java.util.Set; import java.util.function.Consumer; -import com.google.common.base.Preconditions; import dev.architectury.loom.forge.dependency.SrgProvider; import dev.architectury.loom.util.collection.CollectionUtil; import dev.architectury.loom.util.collection.Multimap; @@ -43,6 +42,7 @@ import org.jetbrains.annotations.Nullable; import net.fabricmc.loom.api.mappings.layered.MappingContext; import net.fabricmc.loom.api.mappings.layered.MappingsNamespace; +import net.fabricmc.loom.util.Check; import net.fabricmc.mappingio.FlatMappingVisitor; import net.fabricmc.mappingio.MappingReader; import net.fabricmc.mappingio.MappingVisitor; @@ -58,8 +58,6 @@ import net.fabricmc.mappingio.tree.MemoryMappingTree; /** * Merges a Tiny file with a new namespace. - * - * @author Juuz */ public final class ForgeMappingsMerger { private static final List INPUT_NAMESPACES = List.of("official", "intermediary", "named"); @@ -74,7 +72,7 @@ public final class ForgeMappingsMerger { private ForgeMappingsMerger(MemoryMappingTree newNs, MemoryMappingTree src, @Nullable ExtraMappings extraMappings, boolean lenient) throws IOException { this.newNs = newNs; - Preconditions.checkArgument(this.newNs.getDstNamespaces().size() == 1, "New namespace must have exactly one destination namespace"); + Check.require(this.newNs.getDstNamespaces().size() == 1, "New namespace must have exactly one destination namespace"); this.src = src; this.output = new MemoryMappingTree(); this.flatOutput = new RegularAsFlatMappingVisitor(output); diff --git a/src/main/java/dev/architectury/loom/mcpconfig/McpExecutorBuilder.java b/src/main/java/dev/architectury/loom/mcpconfig/McpExecutorBuilder.java index f33f4020..ba691e9b 100644 --- a/src/main/java/dev/architectury/loom/mcpconfig/McpExecutorBuilder.java +++ b/src/main/java/dev/architectury/loom/mcpconfig/McpExecutorBuilder.java @@ -39,7 +39,6 @@ import java.util.NoSuchElementException; import java.util.Set; import java.util.SortedSet; -import com.google.common.base.Suppliers; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import dev.architectury.loom.forge.dependency.ForgeProvider; @@ -65,6 +64,7 @@ import net.fabricmc.loom.LoomGradleExtension; import net.fabricmc.loom.configuration.providers.minecraft.MinecraftProvider; import net.fabricmc.loom.util.Checksum; import net.fabricmc.loom.util.Constants; +import net.fabricmc.loom.util.Lazy; import net.fabricmc.loom.util.gradle.GradleUtils; import net.fabricmc.loom.util.service.Service; @@ -289,7 +289,7 @@ public final class McpExecutorBuilder { @Override public Provider getMinecraftLibraries() { - return project().provider(Suppliers.memoize(() -> { + return project().provider(Lazy.of(() -> { project.getLogger().lifecycle(":downloading minecraft libraries, this may take a while..."); // (1.2) minecraftRuntimeLibraries contains the compile-time libraries as well. final Set files = project.getConfigurations().getByName(Constants.Configurations.MINECRAFT_RUNTIME_LIBRARIES).resolve(); diff --git a/src/main/java/dev/architectury/loom/mcpconfig/steplogic/FunctionLogic.java b/src/main/java/dev/architectury/loom/mcpconfig/steplogic/FunctionLogic.java index 9fba67b0..156f0753 100644 --- a/src/main/java/dev/architectury/loom/mcpconfig/steplogic/FunctionLogic.java +++ b/src/main/java/dev/architectury/loom/mcpconfig/steplogic/FunctionLogic.java @@ -30,7 +30,6 @@ import java.io.UncheckedIOException; import java.util.jar.Attributes; import java.util.jar.JarFile; -import com.google.common.base.Suppliers; import dev.architectury.loom.mcpconfig.McpConfigFunction; import org.gradle.api.file.RegularFileProperty; import org.gradle.api.provider.Property; @@ -38,6 +37,7 @@ import org.gradle.api.provider.Provider; import org.gradle.api.tasks.Input; import org.gradle.api.tasks.InputFile; +import net.fabricmc.loom.util.Lazy; import net.fabricmc.loom.util.service.Service; import net.fabricmc.loom.util.service.ServiceFactory; import net.fabricmc.loom.util.service.ServiceType; @@ -59,7 +59,7 @@ public final class FunctionLogic extends StepLogic { public static Provider createOptions(SetupContext context, McpConfigFunction function) { return TYPE.create(context.project(), options -> { options.getFunction().set(function); - final Provider jar = context.project().provider(Suppliers.memoize(() -> { + final Provider jar = context.project().provider(Lazy.of(() -> { try { return function.download(context).toFile(); } catch (IOException e) { diff --git a/src/main/java/dev/architectury/loom/util/Version.java b/src/main/java/dev/architectury/loom/util/Version.java index db90d8f6..10ddab9e 100644 --- a/src/main/java/dev/architectury/loom/util/Version.java +++ b/src/main/java/dev/architectury/loom/util/Version.java @@ -25,11 +25,10 @@ package dev.architectury.loom.util; import java.util.Locale; +import java.util.Objects; import java.util.regex.Matcher; import java.util.regex.Pattern; -import com.google.common.base.Strings; -import com.google.common.collect.Ordering; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -58,14 +57,18 @@ public record Version(int major, int minor, int micro, int patch, @Nullable Stri } int major = Integer.parseInt(matcher.group(1)); - int minor = !Strings.isNullOrEmpty(matcher.group(2)) ? Integer.parseInt(matcher.group(2)) : 0; - int micro = !Strings.isNullOrEmpty(matcher.group(3)) ? Integer.parseInt(matcher.group(3)) : 0; - int patch = !Strings.isNullOrEmpty(matcher.group(4)) ? Integer.parseInt(matcher.group(4)) : 0; + int minor = !isNullOrEmpty(matcher.group(2)) ? Integer.parseInt(matcher.group(2)) : 0; + int micro = !isNullOrEmpty(matcher.group(3)) ? Integer.parseInt(matcher.group(3)) : 0; + int patch = !isNullOrEmpty(matcher.group(4)) ? Integer.parseInt(matcher.group(4)) : 0; String qualifier = matcher.group(5); return new Version(major, minor, micro, patch, qualifier == null ? null : qualifier.toLowerCase(Locale.ROOT)); } + private static boolean isNullOrEmpty(@Nullable String s) { + return s == null || s.isEmpty(); + } + public Version asBaseVersion() { return new Version(this.major, this.minor, this.micro, this.patch, null); } @@ -80,9 +83,16 @@ public record Version(int major, int minor, int micro, int patch, @Nullable Stri return this.micro - other.micro; } else if (this.patch != other.patch) { return this.patch - other.patch; + } else if (!Objects.equals(this.qualifier, other.qualifier)) { + if (this.qualifier == null) { + return 1; + } else if (other.qualifier == null) { + return -1; + } + + return this.qualifier.compareTo(other.qualifier); } else { - return Ordering.natural().nullsLast() - .compare(this.qualifier, other.qualifier); + return 0; } } } diff --git a/src/main/java/net/fabricmc/loom/extension/LoomGradleExtensionApiImpl.java b/src/main/java/net/fabricmc/loom/extension/LoomGradleExtensionApiImpl.java index 4eb8db1d..43688f60 100644 --- a/src/main/java/net/fabricmc/loom/extension/LoomGradleExtensionApiImpl.java +++ b/src/main/java/net/fabricmc/loom/extension/LoomGradleExtensionApiImpl.java @@ -36,7 +36,6 @@ import java.util.Objects; import java.util.Set; import java.util.function.Consumer; -import com.google.common.base.Suppliers; import org.gradle.api.Action; import org.gradle.api.NamedDomainObjectContainer; import org.gradle.api.NamedDomainObjectList; @@ -82,6 +81,7 @@ import net.fabricmc.loom.configuration.providers.minecraft.MinecraftMetadataProv import net.fabricmc.loom.configuration.providers.minecraft.MinecraftSourceSets; import net.fabricmc.loom.task.GenerateSourcesTask; import net.fabricmc.loom.util.DeprecationHelper; +import net.fabricmc.loom.util.Lazy; import net.fabricmc.loom.util.MirrorUtil; import net.fabricmc.loom.util.ModPlatform; import net.fabricmc.loom.util.fmj.FabricModJson; @@ -217,7 +217,7 @@ public abstract class LoomGradleExtensionApiImpl implements LoomGradleExtensionA interfaceInjection(interfaceInjection -> { interfaceInjection.getEnableDependencyInterfaceInjection().convention(true).finalizeValueOnRead(); }); - this.platform = project.provider(Suppliers.memoize(() -> { + this.platform = project.provider(Lazy.of(() -> { Object platformProperty = GradleUtils.getProperty(project, PLATFORM_PROPERTY); if (platformProperty != null) { diff --git a/src/main/java/net/fabricmc/loom/extension/LoomGradleExtensionImpl.java b/src/main/java/net/fabricmc/loom/extension/LoomGradleExtensionImpl.java index 9d77a1c8..4a6c796e 100644 --- a/src/main/java/net/fabricmc/loom/extension/LoomGradleExtensionImpl.java +++ b/src/main/java/net/fabricmc/loom/extension/LoomGradleExtensionImpl.java @@ -35,7 +35,6 @@ import java.util.function.Supplier; import javax.inject.Inject; -import com.google.common.base.Suppliers; import dev.architectury.loom.forge.dependency.DependencyProviders; import dev.architectury.loom.forge.dependency.ForgeRunsProvider; import org.gradle.api.Project; @@ -63,6 +62,7 @@ import net.fabricmc.loom.configuration.providers.minecraft.mapped.IntermediaryMi import net.fabricmc.loom.configuration.providers.minecraft.mapped.MojangMappedMinecraftProvider; import net.fabricmc.loom.configuration.providers.minecraft.mapped.NamedMinecraftProvider; import net.fabricmc.loom.configuration.providers.minecraft.mapped.SrgMinecraftProvider; +import net.fabricmc.loom.util.Lazy; import net.fabricmc.loom.util.ModPlatform; import net.fabricmc.loom.util.download.Download; import net.fabricmc.loom.util.download.DownloadBuilder; @@ -109,8 +109,8 @@ public abstract class LoomGradleExtensionImpl extends LoomGradleExtensionApiImpl this.mixinApExtension = project.getObjects().newInstance(MixinExtensionImpl.class, project); this.loomFiles = files; this.unmappedMods = project.files(); - this.forgeExtension = Suppliers.memoize(() -> isForge() ? project.getObjects().newInstance(ForgeExtensionImpl.class, project, this) : null); - this.neoForgeExtension = Suppliers.memoize(() -> isNeoForge() ? project.getObjects().newInstance(NeoForgeExtensionImpl.class, project) : null); + this.forgeExtension = Lazy.of(() -> isForge() ? project.getObjects().newInstance(ForgeExtensionImpl.class, project, this) : null); + this.neoForgeExtension = Lazy.of(() -> isNeoForge() ? project.getObjects().newInstance(NeoForgeExtensionImpl.class, project) : null); // Setup the default intermediate mappings provider. setIntermediateMappingsProvider(IntermediaryMappingsProvider.class, provider -> {