From 60d4dac6ca28dfb163f6c4baebad24f6f33ea422 Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Wed, 11 Jan 2023 10:54:03 +0000 Subject: [PATCH] Support MinimalExternalModuleDependency's as a FileSpec input (#785) --- .../api/mappings/layered/MappingContext.java | 3 ++ .../api/mappings/layered/spec/FileSpec.java | 11 +++- .../mappings/GradleMappingContext.java | 6 +++ ...nimalExternalModuleDependencyFileSpec.java | 54 +++++++++++++++++++ .../LayeredMappingsSpecification.groovy | 8 ++- .../resources/projects/parchment/build.gradle | 8 +-- .../parchment/gradle/libs.versions.toml | 9 ++++ 7 files changed, 94 insertions(+), 5 deletions(-) create mode 100644 src/main/java/net/fabricmc/loom/configuration/providers/mappings/utils/MinimalExternalModuleDependencyFileSpec.java create mode 100644 src/test/resources/projects/parchment/gradle/libs.versions.toml diff --git a/src/main/java/net/fabricmc/loom/api/mappings/layered/MappingContext.java b/src/main/java/net/fabricmc/loom/api/mappings/layered/MappingContext.java index 6c5c0157..ebb1c394 100644 --- a/src/main/java/net/fabricmc/loom/api/mappings/layered/MappingContext.java +++ b/src/main/java/net/fabricmc/loom/api/mappings/layered/MappingContext.java @@ -28,6 +28,7 @@ import java.nio.file.Path; import java.util.function.Supplier; import org.gradle.api.artifacts.Dependency; +import org.gradle.api.artifacts.MinimalExternalModuleDependency; import org.gradle.api.logging.Logger; import org.jetbrains.annotations.ApiStatus; @@ -39,6 +40,8 @@ import net.fabricmc.mappingio.tree.MemoryMappingTree; public interface MappingContext { Path resolveDependency(Dependency dependency); + Path resolveDependency(MinimalExternalModuleDependency dependency); + Path resolveMavenDependency(String mavenNotation); Supplier intermediaryTree(); diff --git a/src/main/java/net/fabricmc/loom/api/mappings/layered/spec/FileSpec.java b/src/main/java/net/fabricmc/loom/api/mappings/layered/spec/FileSpec.java index c8b6157e..bbc5d587 100644 --- a/src/main/java/net/fabricmc/loom/api/mappings/layered/spec/FileSpec.java +++ b/src/main/java/net/fabricmc/loom/api/mappings/layered/spec/FileSpec.java @@ -31,6 +31,7 @@ import java.nio.file.Path; import java.util.Objects; import org.gradle.api.artifacts.Dependency; +import org.gradle.api.artifacts.MinimalExternalModuleDependency; import org.gradle.api.file.FileSystemLocation; import org.gradle.api.file.RegularFileProperty; import org.gradle.api.provider.Provider; @@ -38,9 +39,10 @@ import org.jetbrains.annotations.ApiStatus; import net.fabricmc.loom.api.mappings.layered.MappingContext; import net.fabricmc.loom.configuration.providers.mappings.utils.DependencyFileSpec; -import net.fabricmc.loom.configuration.providers.mappings.utils.URLFileSpec; import net.fabricmc.loom.configuration.providers.mappings.utils.LocalFileSpec; import net.fabricmc.loom.configuration.providers.mappings.utils.MavenFileSpec; +import net.fabricmc.loom.configuration.providers.mappings.utils.MinimalExternalModuleDependencyFileSpec; +import net.fabricmc.loom.configuration.providers.mappings.utils.URLFileSpec; /** * FileSpec should be used in MappingsSpec's that take an input file. The input file can either be a local file or a gradle dep. @@ -56,6 +58,7 @@ public interface FileSpec { *
  • {@link Provider} (including {@link org.gradle.api.provider.Property}) will recursively be resolved as its current value
  • *
  • {@link CharSequence} (including {@link String} and {@link groovy.lang.GString}) will be resolved as Maven dependencies
  • *
  • {@link Dependency} will be resolved as any dependency
  • + *
  • {@link MinimalExternalModuleDependency} will be resolved as any dependency
  • *
  • {@code FileSpec} will just return the spec itself
  • * * @@ -75,6 +78,8 @@ public interface FileSpec { } return createFromMavenDependency(s.toString()); + } else if (o instanceof MinimalExternalModuleDependency d) { + return createFromMinimalExternalModuleDependency(d); } else if (o instanceof Dependency d) { return createFromDependency(d); } else if (o instanceof Provider p) { @@ -123,5 +128,9 @@ public interface FileSpec { return createFromFile(regularFileProperty.get()); } + static FileSpec createFromMinimalExternalModuleDependency(MinimalExternalModuleDependency externalModuleDependency) { + return new MinimalExternalModuleDependencyFileSpec(externalModuleDependency); + } + Path get(MappingContext context); } diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/mappings/GradleMappingContext.java b/src/main/java/net/fabricmc/loom/configuration/providers/mappings/GradleMappingContext.java index 88ede35c..4fd53a3a 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/mappings/GradleMappingContext.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/mappings/GradleMappingContext.java @@ -31,6 +31,7 @@ import java.util.function.Supplier; import org.gradle.api.Project; import org.gradle.api.artifacts.Configuration; import org.gradle.api.artifacts.Dependency; +import org.gradle.api.artifacts.MinimalExternalModuleDependency; import org.gradle.api.artifacts.ResolutionStrategy; import org.gradle.api.logging.Logger; @@ -65,6 +66,11 @@ public class GradleMappingContext implements MappingContext { return resolveDependency(project.getDependencies().create(mavenNotation)); } + @Override + public Path resolveDependency(MinimalExternalModuleDependency dependency) { + return resolveDependency(project.getDependencies().create(dependency)); + } + @Override public Supplier intermediaryTree() { return () -> { diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/mappings/utils/MinimalExternalModuleDependencyFileSpec.java b/src/main/java/net/fabricmc/loom/configuration/providers/mappings/utils/MinimalExternalModuleDependencyFileSpec.java new file mode 100644 index 00000000..8e772a06 --- /dev/null +++ b/src/main/java/net/fabricmc/loom/configuration/providers/mappings/utils/MinimalExternalModuleDependencyFileSpec.java @@ -0,0 +1,54 @@ +/* + * This file is part of fabric-loom, licensed under the MIT License (MIT). + * + * Copyright (c) 2022 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.utils; + +import java.nio.file.Path; +import java.util.Objects; + +import org.gradle.api.artifacts.MinimalExternalModuleDependency; + +import net.fabricmc.loom.api.mappings.layered.MappingContext; +import net.fabricmc.loom.api.mappings.layered.spec.FileSpec; + +public record MinimalExternalModuleDependencyFileSpec(MinimalExternalModuleDependency dependency) implements FileSpec { + @Override + public Path get(MappingContext context) { + return context.resolveDependency(dependency); + } + + @Override + public int hashCode() { + return Objects.hash(dependency.getModule().getGroup(), dependency.getModule().getName(), dependency.getVersionConstraint()); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof MinimalExternalModuleDependencyFileSpec other) { + return other.dependency().equals(this.dependency()); + } + + return false; + } +} diff --git a/src/test/groovy/net/fabricmc/loom/test/unit/layeredmappings/LayeredMappingsSpecification.groovy b/src/test/groovy/net/fabricmc/loom/test/unit/layeredmappings/LayeredMappingsSpecification.groovy index da3d5b56..b5069bf0 100644 --- a/src/test/groovy/net/fabricmc/loom/test/unit/layeredmappings/LayeredMappingsSpecification.groovy +++ b/src/test/groovy/net/fabricmc/loom/test/unit/layeredmappings/LayeredMappingsSpecification.groovy @@ -41,6 +41,7 @@ import net.fabricmc.mappingio.adapter.MappingSourceNsSwitch import net.fabricmc.mappingio.format.Tiny2Writer import net.fabricmc.mappingio.tree.MemoryMappingTree import org.gradle.api.artifacts.Dependency +import org.gradle.api.artifacts.MinimalExternalModuleDependency import org.gradle.api.logging.Logger import spock.lang.Specification @@ -123,7 +124,12 @@ abstract class LayeredMappingsSpecification extends Specification implements Lay throw new UnsupportedOperationException("TODO") } - @Override + @Override + Path resolveDependency(MinimalExternalModuleDependency dependency) { + throw new UnsupportedOperationException("TODO") + } + + @Override Path resolveMavenDependency(String mavenNotation) { assert mavenFiles.containsKey(mavenNotation) return mavenFiles.get(mavenNotation).toPath() diff --git a/src/test/resources/projects/parchment/build.gradle b/src/test/resources/projects/parchment/build.gradle index 21432d4e..5fee81c5 100644 --- a/src/test/resources/projects/parchment/build.gradle +++ b/src/test/resources/projects/parchment/build.gradle @@ -10,11 +10,13 @@ repositories { } dependencies { - minecraft "com.mojang:minecraft:1.16.5" + minecraft libs.minecraft mappings loom.layered() { officialMojangMappings() - parchment("org.parchmentmc.data:parchment-1.16.5:2021.10.10@zip") + parchment variantOf(libs.parchment) { + artifactType("zip") + } } - modImplementation "net.fabricmc:fabric-loader:0.11.3" + modImplementation libs.fabricLoader } diff --git a/src/test/resources/projects/parchment/gradle/libs.versions.toml b/src/test/resources/projects/parchment/gradle/libs.versions.toml new file mode 100644 index 00000000..40c22f78 --- /dev/null +++ b/src/test/resources/projects/parchment/gradle/libs.versions.toml @@ -0,0 +1,9 @@ +[versions] +minecraft = "1.16.5" +fabricLoader = "0.11.3" +parchment = "2021.10.10" + +[libraries] +minecraft = { module = "com.mojang:minecraft", version.ref = "minecraft" } +fabricLoader = { module = "net.fabricmc:fabric-loader", version.ref = "fabricLoader" } +parchment = { module = "org.parchmentmc.data:parchment-1.16.5", version.ref = "parchment" } \ No newline at end of file