Expose layered mappings as an API (#490)
* Expose layered mappings as an API * Add FileSpec * Cleanup and support DependencyFileSpec
This commit is contained in:
		
							parent
							
								
									4f2ead9f16
								
							
						
					
					
						commit
						08e548b6c6
					
				
					 36 changed files with 552 additions and 131 deletions
				
			
		|  | @ -38,9 +38,9 @@ import org.gradle.api.publish.maven.MavenPublication; | |||
| import org.jetbrains.annotations.ApiStatus; | ||||
| 
 | ||||
| import net.fabricmc.loom.api.decompilers.LoomDecompiler; | ||||
| import net.fabricmc.loom.api.mappings.layered.spec.LayeredMappingSpecBuilder; | ||||
| import net.fabricmc.loom.configuration.ide.RunConfigSettings; | ||||
| import net.fabricmc.loom.configuration.processors.JarProcessor; | ||||
| import net.fabricmc.loom.configuration.providers.mappings.LayeredMappingSpecBuilder; | ||||
| import net.fabricmc.loom.util.DeprecationHelper; | ||||
| 
 | ||||
| /** | ||||
|  |  | |||
|  | @ -22,16 +22,22 @@ | |||
|  * SOFTWARE. | ||||
|  */ | ||||
| 
 | ||||
| package net.fabricmc.loom.configuration.providers.mappings; | ||||
| package net.fabricmc.loom.api.mappings.layered; | ||||
| 
 | ||||
| import java.io.File; | ||||
| import java.nio.file.Path; | ||||
| 
 | ||||
| import org.gradle.api.artifacts.Dependency; | ||||
| import org.gradle.api.logging.Logger; | ||||
| import org.jetbrains.annotations.ApiStatus; | ||||
| 
 | ||||
| import net.fabricmc.loom.configuration.providers.MinecraftProvider; | ||||
| import net.fabricmc.loom.configuration.providers.mappings.MappingsProvider; | ||||
| 
 | ||||
| @ApiStatus.Experimental /* Very Experimental and not cleanly separated from the impl atm */ | ||||
| public interface MappingContext { | ||||
| 	File mavenFile(String mavenNotation); | ||||
| 	Path resolveDependency(Dependency dependency); | ||||
| 
 | ||||
| 	Path resolveMavenDependency(String mavenNotation); | ||||
| 
 | ||||
| 	MappingsProvider mappingsProvider(); | ||||
| 
 | ||||
|  | @ -44,7 +50,7 @@ public interface MappingContext { | |||
| 	/** | ||||
| 	 * Creates a temporary working dir to be used to store working files. | ||||
| 	 */ | ||||
| 	File workingDirectory(String name); | ||||
| 	Path workingDirectory(String name); | ||||
| 
 | ||||
| 	Logger getLogger(); | ||||
| } | ||||
|  | @ -22,21 +22,28 @@ | |||
|  * SOFTWARE. | ||||
|  */ | ||||
| 
 | ||||
| package net.fabricmc.loom.configuration.providers.mappings; | ||||
| package net.fabricmc.loom.api.mappings.layered; | ||||
| 
 | ||||
| import java.io.IOException; | ||||
| import java.util.Collections; | ||||
| import java.util.List; | ||||
| 
 | ||||
| import org.jetbrains.annotations.ApiStatus; | ||||
| 
 | ||||
| import net.fabricmc.mappingio.MappingVisitor; | ||||
| 
 | ||||
| @ApiStatus.Experimental | ||||
| public interface MappingLayer { | ||||
| 	void visit(MappingVisitor mappingVisitor) throws IOException; | ||||
| 
 | ||||
| 	default MappingNamespace getSourceNamespace() { | ||||
| 		return MappingNamespace.NAMED; | ||||
| 	default MappingsNamespace getSourceNamespace() { | ||||
| 		return MappingsNamespace.NAMED; | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Provides a list of layer classes that this mapping layer depends on. If such a layer is not present an Exception will be thrown when trying to resolve the layer. | ||||
| 	 * @return A list of MappingLayer classes to depend on. | ||||
| 	 */ | ||||
| 	default List<Class<? extends MappingLayer>> dependsOn() { | ||||
| 		return Collections.emptyList(); | ||||
| 	} | ||||
|  | @ -0,0 +1,56 @@ | |||
| /* | ||||
|  * This file is part of fabric-loom, licensed under the MIT License (MIT). | ||||
|  * | ||||
|  * Copyright (c) 2016-2021 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.api.mappings.layered; | ||||
| 
 | ||||
| import java.util.Locale; | ||||
| 
 | ||||
| /** | ||||
|  * The standard namespaces used by loom. | ||||
|  */ | ||||
| public enum MappingsNamespace { | ||||
| 	/** | ||||
| 	 * Official mappings are the names that are used in the vanilla Minecraft game jars, these are usually obfuscated. | ||||
| 	 */ | ||||
| 	OFFICIAL, | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Intermediary mappings have been generated to provide a stable set of names across minecraft versions. | ||||
| 	 * | ||||
| 	 * <p>Intermediary is used in a production runtime (outside a dev env) allowing mods to run across multiple versions of the game. Mods are remapped from "named" at build time. | ||||
| 	 * | ||||
| 	 * @see <a href="https://github.com/FabricMC/intermediary/">github.com/FabricMC/intermediary/</a> | ||||
| 	 */ | ||||
| 	INTERMEDIARY, | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Named mappings are the developer friendly names used to develop mods against. | ||||
| 	 */ | ||||
| 	NAMED; | ||||
| 
 | ||||
| 	@Override | ||||
| 	public String toString() { | ||||
| 		return name().toLowerCase(Locale.ROOT); | ||||
| 	} | ||||
| } | ||||
|  | @ -0,0 +1,79 @@ | |||
| /* | ||||
|  * This file is part of fabric-loom, licensed under the MIT License (MIT). | ||||
|  * | ||||
|  * Copyright (c) 2021 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.api.mappings.layered.spec; | ||||
| 
 | ||||
| import java.io.File; | ||||
| import java.nio.file.Path; | ||||
| import java.util.Objects; | ||||
| 
 | ||||
| import org.gradle.api.artifacts.Dependency; | ||||
| import org.gradle.api.file.RegularFileProperty; | ||||
| 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.LocalFileSpec; | ||||
| import net.fabricmc.loom.configuration.providers.mappings.utils.MavenFileSpec; | ||||
| 
 | ||||
| /** | ||||
|  * 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. | ||||
|  */ | ||||
| @ApiStatus.Experimental | ||||
| public interface FileSpec { | ||||
| 	static FileSpec create(Object o) { | ||||
| 		Objects.requireNonNull(o, "Object cannot be null"); | ||||
| 
 | ||||
| 		if (o instanceof String s) { | ||||
| 			return createFromMavenDependency(s); | ||||
| 		} else if (o instanceof Dependency d) { | ||||
| 			return createFromDependency(d); | ||||
| 		} else if (o instanceof File f) { | ||||
| 			return createFromFile(f); | ||||
| 		} else if (o instanceof RegularFileProperty rfp) { | ||||
| 			return createFromFile(rfp); | ||||
| 		} | ||||
| 
 | ||||
| 		throw new UnsupportedOperationException("Cannot create FileSpec from object of type:" + o.getClass().getCanonicalName()); | ||||
| 	} | ||||
| 
 | ||||
| 	static FileSpec createFromMavenDependency(String dependencyNotation) { | ||||
| 		return new MavenFileSpec(dependencyNotation); | ||||
| 	} | ||||
| 
 | ||||
| 	static FileSpec createFromDependency(Dependency dependency) { | ||||
| 		return new DependencyFileSpec(dependency); | ||||
| 	} | ||||
| 
 | ||||
| 	static FileSpec createFromFile(File file) { | ||||
| 		return new LocalFileSpec(file); | ||||
| 	} | ||||
| 
 | ||||
| 	// Note resolved instantly, this is not lazy | ||||
| 	static FileSpec createFromFile(RegularFileProperty regularFileProperty) { | ||||
| 		return createFromFile(regularFileProperty.getAsFile().get()); | ||||
| 	} | ||||
| 
 | ||||
| 	Path get(MappingContext context); | ||||
| } | ||||
|  | @ -0,0 +1,50 @@ | |||
| /* | ||||
|  * This file is part of fabric-loom, licensed under the MIT License (MIT). | ||||
|  * | ||||
|  * Copyright (c) 2021 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.api.mappings.layered.spec; | ||||
| 
 | ||||
| import org.gradle.api.Action; | ||||
| import org.jetbrains.annotations.ApiStatus; | ||||
| 
 | ||||
| /** | ||||
|  * Used to configure a layered mapping spec. | ||||
|  */ | ||||
| @ApiStatus.Experimental | ||||
| public interface LayeredMappingSpecBuilder { | ||||
| 	/** | ||||
| 	 * Add a MappingsSpec layer. | ||||
| 	 */ | ||||
| 	LayeredMappingSpecBuilder addLayer(MappingsSpec<?> mappingSpec); | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Add a layer that uses the official mappings provided by Mojang. | ||||
| 	 */ | ||||
| 	LayeredMappingSpecBuilder officialMojangMappings(); | ||||
| 
 | ||||
| 	default LayeredMappingSpecBuilder parchment(Object object) { | ||||
| 		return parchment(object, parchmentMappingsSpecBuilder -> parchmentMappingsSpecBuilder.setRemovePrefix(true)); | ||||
| 	} | ||||
| 
 | ||||
| 	LayeredMappingSpecBuilder parchment(Object object, Action<ParchmentMappingsSpecBuilder> action); | ||||
| } | ||||
|  | @ -22,8 +22,21 @@ | |||
|  * SOFTWARE. | ||||
|  */ | ||||
| 
 | ||||
| package net.fabricmc.loom.configuration.providers.mappings; | ||||
| package net.fabricmc.loom.api.mappings.layered.spec; | ||||
| 
 | ||||
| import org.jetbrains.annotations.ApiStatus; | ||||
| 
 | ||||
| import net.fabricmc.loom.api.mappings.layered.MappingContext; | ||||
| import net.fabricmc.loom.api.mappings.layered.MappingLayer; | ||||
| 
 | ||||
| /** | ||||
|  * A MappingsSpec is an immutable set of data used to create the MappingLayer. | ||||
|  * | ||||
|  * <p>The hashCode is used to generate a hash of the full layered mapping spec, used to cache. | ||||
|  * | ||||
|  * <p>Commonly implemented as a record | ||||
|  */ | ||||
| @ApiStatus.Experimental | ||||
| public interface MappingsSpec<L extends MappingLayer> { | ||||
| 	L createLayer(MappingContext context); | ||||
| } | ||||
|  | @ -1,7 +1,7 @@ | |||
| /* | ||||
|  * This file is part of fabric-loom, licensed under the MIT License (MIT). | ||||
|  * | ||||
|  * Copyright (c) 2016-2021 FabricMC | ||||
|  * Copyright (c) 2021 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 | ||||
|  | @ -22,16 +22,14 @@ | |||
|  * SOFTWARE. | ||||
|  */ | ||||
| 
 | ||||
| package net.fabricmc.loom.configuration.providers.mappings; | ||||
| package net.fabricmc.loom.api.mappings.layered.spec; | ||||
| 
 | ||||
| import java.util.Locale; | ||||
| import org.jetbrains.annotations.ApiStatus; | ||||
| 
 | ||||
| public enum MappingNamespace { | ||||
| 	OFFICIAL, | ||||
| 	INTERMEDIARY, | ||||
| 	NAMED; | ||||
| 
 | ||||
| 	public String stringValue() { | ||||
| 		return name().toLowerCase(Locale.ROOT); | ||||
| 	} | ||||
| @ApiStatus.Experimental | ||||
| public interface ParchmentMappingsSpecBuilder { | ||||
| 	/** | ||||
| 	 * When enabled the "p" prefix will be stripped from parameter names. | ||||
| 	 */ | ||||
| 	ParchmentMappingsSpecBuilder setRemovePrefix(boolean removePrefix); | ||||
| } | ||||
|  | @ -54,6 +54,7 @@ import net.fabricmc.accesswidener.AccessWidenerRemapper; | |||
| import net.fabricmc.accesswidener.AccessWidenerVisitor; | ||||
| import net.fabricmc.accesswidener.AccessWidenerWriter; | ||||
| import net.fabricmc.loom.LoomGradleExtension; | ||||
| import net.fabricmc.loom.api.mappings.layered.MappingsNamespace; | ||||
| import net.fabricmc.loom.configuration.processors.JarProcessor; | ||||
| import net.fabricmc.loom.util.Checksum; | ||||
| import net.fabricmc.loom.util.Constants; | ||||
|  | @ -92,7 +93,7 @@ public class AccessWidenerJarProcessor implements JarProcessor { | |||
| 		} | ||||
| 
 | ||||
| 		//Remap accessWidener if its not named, allows for AE's to be written in intermediary | ||||
| 		if (!accessWidener.getNamespace().equals("named")) { | ||||
| 		if (!accessWidener.getNamespace().equals(MappingsNamespace.NAMED.toString())) { | ||||
| 			try { | ||||
| 				List<String> validNamespaces = loomGradleExtension.getMappingsProvider().getMappings().getMetadata().getNamespaces(); | ||||
| 
 | ||||
|  | @ -100,10 +101,10 @@ public class AccessWidenerJarProcessor implements JarProcessor { | |||
| 					throw new UnsupportedOperationException(String.format("Access Widener namespace '%s' is not a valid namespace, it must be one of: '%s'", accessWidener.getNamespace(), String.join(", ", validNamespaces))); | ||||
| 				} | ||||
| 
 | ||||
| 				TinyRemapper tinyRemapper = loomGradleExtension.getMinecraftMappedProvider().getTinyRemapper("official", "named"); | ||||
| 				TinyRemapper tinyRemapper = loomGradleExtension.getMinecraftMappedProvider().getTinyRemapper(MappingsNamespace.OFFICIAL.toString(), MappingsNamespace.NAMED.toString()); | ||||
| 				tinyRemapper.readClassPath(loomGradleExtension.getMinecraftMappedProvider().getRemapClasspath()); | ||||
| 
 | ||||
| 				AccessWidenerRemapper remapper = new AccessWidenerRemapper(accessWidener, tinyRemapper.getRemapper(), "named"); | ||||
| 				AccessWidenerRemapper remapper = new AccessWidenerRemapper(accessWidener, tinyRemapper.getRemapper(), MappingsNamespace.NAMED.toString()); | ||||
| 				accessWidener = remapper.remap(); | ||||
| 
 | ||||
| 				tinyRemapper.finish(); | ||||
|  | @ -160,7 +161,7 @@ public class AccessWidenerJarProcessor implements JarProcessor { | |||
| 	} | ||||
| 
 | ||||
| 	public byte[] getRemappedAccessWidener(Remapper asmRemapper) throws IOException { | ||||
| 		AccessWidenerRemapper remapper = new AccessWidenerRemapper(accessWidener, asmRemapper, "intermediary"); | ||||
| 		AccessWidenerRemapper remapper = new AccessWidenerRemapper(accessWidener, asmRemapper, MappingsNamespace.INTERMEDIARY.toString()); | ||||
| 		AccessWidener remapped = remapper.remap(); | ||||
| 		AccessWidenerWriter accessWidenerWriter = new AccessWidenerWriter(remapped); | ||||
| 
 | ||||
|  |  | |||
|  | @ -54,6 +54,7 @@ import net.fabricmc.accesswidener.AccessWidenerRemapper; | |||
| import net.fabricmc.accesswidener.AccessWidenerWriter; | ||||
| import net.fabricmc.loom.LoomGradleExtension; | ||||
| import net.fabricmc.loom.LoomGradlePlugin; | ||||
| import net.fabricmc.loom.api.mappings.layered.MappingsNamespace; | ||||
| import net.fabricmc.loom.configuration.RemappedConfigurationEntry; | ||||
| import net.fabricmc.loom.configuration.processors.dependency.ModDependencyInfo; | ||||
| import net.fabricmc.loom.configuration.providers.mappings.MappingsProviderImpl; | ||||
|  | @ -113,7 +114,7 @@ public class ModProcessor { | |||
| 			AccessWidenerReader accessWidenerReader = new AccessWidenerReader(accessWidener); | ||||
| 			accessWidenerReader.read(bufferedReader); | ||||
| 
 | ||||
| 			AccessWidenerRemapper accessWidenerRemapper = new AccessWidenerRemapper(accessWidener, remapper, "named"); | ||||
| 			AccessWidenerRemapper accessWidenerRemapper = new AccessWidenerRemapper(accessWidener, remapper, MappingsNamespace.NAMED.toString()); | ||||
| 			AccessWidener remapped = accessWidenerRemapper.remap(); | ||||
| 			AccessWidenerWriter accessWidenerWriter = new AccessWidenerWriter(remapped); | ||||
| 
 | ||||
|  | @ -128,8 +129,8 @@ public class ModProcessor { | |||
| 
 | ||||
| 	private static void remapJars(Project project, List<ModDependencyInfo> processList) throws IOException { | ||||
| 		LoomGradleExtension extension = LoomGradleExtension.get(project); | ||||
| 		String fromM = "intermediary"; | ||||
| 		String toM = "named"; | ||||
| 		String fromM = MappingsNamespace.INTERMEDIARY.toString(); | ||||
| 		String toM = MappingsNamespace.NAMED.toString(); | ||||
| 
 | ||||
| 		MinecraftMappedProvider mappedProvider = extension.getMinecraftMappedProvider(); | ||||
| 		MappingsProviderImpl mappingsProvider = extension.getMappingsProvider(); | ||||
|  |  | |||
|  | @ -25,12 +25,15 @@ | |||
| package net.fabricmc.loom.configuration.providers.mappings; | ||||
| 
 | ||||
| import java.io.File; | ||||
| import java.nio.file.Path; | ||||
| 
 | ||||
| import org.gradle.api.Project; | ||||
| import org.gradle.api.artifacts.Configuration; | ||||
| import org.gradle.api.artifacts.Dependency; | ||||
| import org.gradle.api.logging.Logger; | ||||
| 
 | ||||
| import net.fabricmc.loom.LoomGradleExtension; | ||||
| import net.fabricmc.loom.api.mappings.layered.MappingContext; | ||||
| import net.fabricmc.loom.configuration.providers.MinecraftProvider; | ||||
| 
 | ||||
| public class GradleMappingContext implements MappingContext { | ||||
|  | @ -45,9 +48,14 @@ public class GradleMappingContext implements MappingContext { | |||
| 	} | ||||
| 
 | ||||
| 	@Override | ||||
| 	public File mavenFile(String mavenNotation) { | ||||
| 		Configuration configuration = project.getConfigurations().detachedConfiguration(project.getDependencies().create(mavenNotation)); | ||||
| 		return configuration.getSingleFile(); | ||||
| 	public Path resolveDependency(Dependency dependency) { | ||||
| 		Configuration configuration = project.getConfigurations().detachedConfiguration(dependency); | ||||
| 		return configuration.getSingleFile().toPath(); | ||||
| 	} | ||||
| 
 | ||||
| 	@Override | ||||
| 	public Path resolveMavenDependency(String mavenNotation) { | ||||
| 		return resolveDependency(project.getDependencies().create(mavenNotation)); | ||||
| 	} | ||||
| 
 | ||||
| 	@Override | ||||
|  | @ -61,8 +69,8 @@ public class GradleMappingContext implements MappingContext { | |||
| 	} | ||||
| 
 | ||||
| 	@Override | ||||
| 	public File workingDirectory(String name) { | ||||
| 		return new File(minecraftProvider().dir("layered/working_dir/" + workingDirName), name); | ||||
| 	public Path workingDirectory(String name) { | ||||
| 		return new File(minecraftProvider().dir("layered/working_dir/" + workingDirName), name).toPath(); | ||||
| 	} | ||||
| 
 | ||||
| 	@Override | ||||
|  |  | |||
|  | @ -26,6 +26,8 @@ package net.fabricmc.loom.configuration.providers.mappings; | |||
| 
 | ||||
| import java.util.List; | ||||
| 
 | ||||
| import net.fabricmc.loom.api.mappings.layered.spec.MappingsSpec; | ||||
| 
 | ||||
| public record LayeredMappingSpec(List<MappingsSpec<?>> layers) { | ||||
| 	public String getVersion() { | ||||
| 		// TODO something better? | ||||
|  |  | |||
|  | @ -30,28 +30,33 @@ import java.util.List; | |||
| 
 | ||||
| import org.gradle.api.Action; | ||||
| 
 | ||||
| import net.fabricmc.loom.api.mappings.layered.spec.FileSpec; | ||||
| import net.fabricmc.loom.api.mappings.layered.spec.LayeredMappingSpecBuilder; | ||||
| import net.fabricmc.loom.api.mappings.layered.spec.MappingsSpec; | ||||
| import net.fabricmc.loom.api.mappings.layered.spec.ParchmentMappingsSpecBuilder; | ||||
| import net.fabricmc.loom.configuration.providers.mappings.intermediary.IntermediaryMappingsSpec; | ||||
| import net.fabricmc.loom.configuration.providers.mappings.mojmap.MojangMappingsSpec; | ||||
| import net.fabricmc.loom.configuration.providers.mappings.parchment.ParchmentMappingsSpecBuilder; | ||||
| import net.fabricmc.loom.configuration.providers.mappings.parchment.ParchmentMappingsSpecBuilderImpl; | ||||
| 
 | ||||
| public class LayeredMappingSpecBuilder { | ||||
| public class LayeredMappingSpecBuilderImpl implements LayeredMappingSpecBuilder { | ||||
| 	private final List<MappingsSpec<?>> layers = new LinkedList<>(); | ||||
| 
 | ||||
| 	@Override | ||||
| 	public LayeredMappingSpecBuilder addLayer(MappingsSpec<?> mappingSpec) { | ||||
| 		layers.add(mappingSpec); | ||||
| 		return this; | ||||
| 	} | ||||
| 
 | ||||
| 	@Override | ||||
| 	public LayeredMappingSpecBuilder officialMojangMappings() { | ||||
| 		layers.add(new MojangMappingsSpec()); | ||||
| 		return this; | ||||
| 		return addLayer(new MojangMappingsSpec()); | ||||
| 	} | ||||
| 
 | ||||
| 	public LayeredMappingSpecBuilder parchment(String mavenNotation) { | ||||
| 		parchment(mavenNotation, parchmentMappingsSpecBuilder -> parchmentMappingsSpecBuilder.setRemovePrefix(true)); | ||||
| 		return this; | ||||
| 	} | ||||
| 
 | ||||
| 	public LayeredMappingSpecBuilder parchment(String mavenNotation, Action<ParchmentMappingsSpecBuilder> action) { | ||||
| 		ParchmentMappingsSpecBuilder builder = ParchmentMappingsSpecBuilder.builder(mavenNotation); | ||||
| 	@Override | ||||
| 	public LayeredMappingSpecBuilder parchment(Object object, Action<ParchmentMappingsSpecBuilder> action) { | ||||
| 		ParchmentMappingsSpecBuilderImpl builder = ParchmentMappingsSpecBuilderImpl.builder(FileSpec.create(object)); | ||||
| 		action.execute(builder); | ||||
| 		layers.add(builder.build()); | ||||
| 		return this; | ||||
| 		return addLayer(builder.build()); | ||||
| 	} | ||||
| 
 | ||||
| 	public LayeredMappingSpec build() { | ||||
|  | @ -43,6 +43,8 @@ import org.zeroturnaround.zip.ZipEntrySource; | |||
| import org.zeroturnaround.zip.ZipUtil; | ||||
| 
 | ||||
| import net.fabricmc.loom.LoomGradlePlugin; | ||||
| import net.fabricmc.loom.api.mappings.layered.MappingContext; | ||||
| import net.fabricmc.loom.api.mappings.layered.MappingsNamespace; | ||||
| import net.fabricmc.mappingio.adapter.MappingDstNsReorder; | ||||
| import net.fabricmc.mappingio.adapter.MappingSourceNsSwitch; | ||||
| import net.fabricmc.mappingio.format.Tiny2Writer; | ||||
|  | @ -75,8 +77,8 @@ public class LayeredMappingsDependency implements SelfResolvingDependency { | |||
| 				try (Writer writer = new StringWriter()) { | ||||
| 					Tiny2Writer tiny2Writer = new Tiny2Writer(writer, false); | ||||
| 
 | ||||
| 					MappingDstNsReorder nsReorder = new MappingDstNsReorder(tiny2Writer, Collections.singletonList(MappingNamespace.NAMED.stringValue())); | ||||
| 					MappingSourceNsSwitch nsSwitch = new MappingSourceNsSwitch(nsReorder, MappingNamespace.INTERMEDIARY.stringValue(), true); | ||||
| 					MappingDstNsReorder nsReorder = new MappingDstNsReorder(tiny2Writer, Collections.singletonList(MappingsNamespace.NAMED.toString())); | ||||
| 					MappingSourceNsSwitch nsSwitch = new MappingSourceNsSwitch(nsReorder, MappingsNamespace.INTERMEDIARY.toString(), true); | ||||
| 					mappings.accept(nsSwitch); | ||||
| 
 | ||||
| 					Files.deleteIfExists(mappingsFile); | ||||
|  |  | |||
|  | @ -28,6 +28,10 @@ import java.io.IOException; | |||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
| 
 | ||||
| import net.fabricmc.loom.api.mappings.layered.MappingContext; | ||||
| import net.fabricmc.loom.api.mappings.layered.MappingLayer; | ||||
| import net.fabricmc.loom.api.mappings.layered.MappingsNamespace; | ||||
| import net.fabricmc.loom.api.mappings.layered.spec.MappingsSpec; | ||||
| import net.fabricmc.mappingio.adapter.MappingSourceNsSwitch; | ||||
| import net.fabricmc.mappingio.tree.MemoryMappingTree; | ||||
| 
 | ||||
|  | @ -55,7 +59,7 @@ public class LayeredMappingsProcessor { | |||
| 			visitedLayers.add(layer.getClass()); | ||||
| 
 | ||||
| 			// We have to rebuild a new tree to work on when a layer doesnt merge into layered | ||||
| 			boolean rebuild = layer.getSourceNamespace() != MappingNamespace.NAMED; | ||||
| 			boolean rebuild = layer.getSourceNamespace() != MappingsNamespace.NAMED; | ||||
| 			MemoryMappingTree workingTree; | ||||
| 
 | ||||
| 			if (rebuild) { | ||||
|  | @ -63,7 +67,7 @@ public class LayeredMappingsProcessor { | |||
| 
 | ||||
| 				// This can be null on the first layer | ||||
| 				if (mappingTree.getSrcNamespace() != null) { | ||||
| 					var sourceNsSwitch = new MappingSourceNsSwitch(tempTree, layer.getSourceNamespace().stringValue()); | ||||
| 					var sourceNsSwitch = new MappingSourceNsSwitch(tempTree, layer.getSourceNamespace().toString()); | ||||
| 					mappingTree.accept(sourceNsSwitch); | ||||
| 				} | ||||
| 
 | ||||
|  | @ -80,7 +84,7 @@ public class LayeredMappingsProcessor { | |||
| 
 | ||||
| 			if (rebuild) { | ||||
| 				mappingTree = new MemoryMappingTree(); | ||||
| 				workingTree.accept(new MappingSourceNsSwitch(mappingTree, MappingNamespace.NAMED.stringValue())); | ||||
| 				workingTree.accept(new MappingSourceNsSwitch(mappingTree, MappingsNamespace.NAMED.toString())); | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
|  |  | |||
|  | @ -48,6 +48,7 @@ import org.zeroturnaround.zip.ZipUtil; | |||
| 
 | ||||
| import net.fabricmc.loom.LoomGradleExtension; | ||||
| import net.fabricmc.loom.LoomGradlePlugin; | ||||
| import net.fabricmc.loom.api.mappings.layered.MappingsNamespace; | ||||
| import net.fabricmc.loom.configuration.DependencyProvider; | ||||
| import net.fabricmc.loom.configuration.accesswidener.AccessWidenerJarProcessor; | ||||
| import net.fabricmc.loom.configuration.processors.JarProcessorManager; | ||||
|  | @ -276,7 +277,7 @@ public class MappingsProviderImpl extends DependencyProvider implements Mappings | |||
| 		project.getLogger().info(":merging mappings"); | ||||
| 
 | ||||
| 		MemoryMappingTree tree = new MemoryMappingTree(); | ||||
| 		MappingSourceNsSwitch sourceNsSwitch = new MappingSourceNsSwitch(tree, MappingNamespace.OFFICIAL.stringValue()); | ||||
| 		MappingSourceNsSwitch sourceNsSwitch = new MappingSourceNsSwitch(tree, MappingsNamespace.OFFICIAL.toString()); | ||||
| 		readIntermediaryTree().accept(sourceNsSwitch); | ||||
| 
 | ||||
| 		try (BufferedReader reader = Files.newBufferedReader(from, StandardCharsets.UTF_8)) { | ||||
|  | @ -292,7 +293,7 @@ public class MappingsProviderImpl extends DependencyProvider implements Mappings | |||
| 
 | ||||
| 	private MemoryMappingTree readIntermediaryTree() throws IOException { | ||||
| 		MemoryMappingTree tree = new MemoryMappingTree(); | ||||
| 		MappingNsCompleter nsCompleter = new MappingNsCompleter(tree, Collections.singletonMap(MappingNamespace.NAMED.stringValue(), MappingNamespace.INTERMEDIARY.stringValue()), true); | ||||
| 		MappingNsCompleter nsCompleter = new MappingNsCompleter(tree, Collections.singletonMap(MappingsNamespace.NAMED.toString(), MappingsNamespace.INTERMEDIARY.toString()), true); | ||||
| 
 | ||||
| 		try (BufferedReader reader = Files.newBufferedReader(getIntermediaryTiny(), StandardCharsets.UTF_8)) { | ||||
| 			Tiny2Reader.read(reader, nsCompleter); | ||||
|  | @ -316,7 +317,7 @@ public class MappingsProviderImpl extends DependencyProvider implements Mappings | |||
| 			runCommand(command, intermediaryMappings.toAbsolutePath().toString(), | ||||
| 							yarnMappings.toAbsolutePath().toString(), | ||||
| 							newMergedMappings.toAbsolutePath().toString(), | ||||
| 							"intermediary", "official"); | ||||
| 							MappingsNamespace.INTERMEDIARY.toString(), MappingsNamespace.OFFICIAL.toString()); | ||||
| 		} catch (Exception e) { | ||||
| 			throw new RuntimeException("Could not merge mappings from " + intermediaryMappings.toString() | ||||
| 							+ " with mappings from " + yarnMappings, e); | ||||
|  |  | |||
|  | @ -31,22 +31,22 @@ import java.nio.charset.StandardCharsets; | |||
| import java.nio.file.Files; | ||||
| import java.util.Collections; | ||||
| 
 | ||||
| import net.fabricmc.loom.configuration.providers.mappings.MappingLayer; | ||||
| import net.fabricmc.loom.configuration.providers.mappings.MappingNamespace; | ||||
| import net.fabricmc.loom.api.mappings.layered.MappingLayer; | ||||
| import net.fabricmc.loom.api.mappings.layered.MappingsNamespace; | ||||
| import net.fabricmc.mappingio.MappingVisitor; | ||||
| import net.fabricmc.mappingio.adapter.MappingNsCompleter; | ||||
| import net.fabricmc.mappingio.format.Tiny2Reader; | ||||
| 
 | ||||
| public record IntermediaryMappingLayer(File tinyFile) implements MappingLayer { | ||||
| 	@Override | ||||
| 	public MappingNamespace getSourceNamespace() { | ||||
| 		return MappingNamespace.OFFICIAL; | ||||
| 	public MappingsNamespace getSourceNamespace() { | ||||
| 		return MappingsNamespace.OFFICIAL; | ||||
| 	} | ||||
| 
 | ||||
| 	@Override | ||||
| 	public void visit(MappingVisitor mappingVisitor) throws IOException { | ||||
| 		// Populate named with intermediary and add Add a "named" namespace | ||||
| 		MappingNsCompleter nsCompleter = new MappingNsCompleter(mappingVisitor, Collections.singletonMap(MappingNamespace.NAMED.stringValue(), MappingNamespace.INTERMEDIARY.stringValue()), true); | ||||
| 		MappingNsCompleter nsCompleter = new MappingNsCompleter(mappingVisitor, Collections.singletonMap(MappingsNamespace.NAMED.toString(), MappingsNamespace.INTERMEDIARY.toString()), true); | ||||
| 
 | ||||
| 		try (BufferedReader reader = Files.newBufferedReader(tinyFile().toPath(), StandardCharsets.UTF_8)) { | ||||
| 			Tiny2Reader.read(reader, nsCompleter); | ||||
|  |  | |||
|  | @ -24,8 +24,8 @@ | |||
| 
 | ||||
| package net.fabricmc.loom.configuration.providers.mappings.intermediary; | ||||
| 
 | ||||
| import net.fabricmc.loom.configuration.providers.mappings.MappingContext; | ||||
| import net.fabricmc.loom.configuration.providers.mappings.MappingsSpec; | ||||
| import net.fabricmc.loom.api.mappings.layered.MappingContext; | ||||
| import net.fabricmc.loom.api.mappings.layered.spec.MappingsSpec; | ||||
| 
 | ||||
| public record IntermediaryMappingsSpec() implements MappingsSpec<IntermediaryMappingLayer> { | ||||
| 	@Override | ||||
|  |  | |||
|  | @ -25,7 +25,6 @@ | |||
| package net.fabricmc.loom.configuration.providers.mappings.mojmap; | ||||
| 
 | ||||
| import java.io.BufferedReader; | ||||
| import java.io.File; | ||||
| import java.io.IOException; | ||||
| import java.net.URL; | ||||
| import java.nio.charset.StandardCharsets; | ||||
|  | @ -35,8 +34,8 @@ import java.util.List; | |||
| 
 | ||||
| import org.gradle.api.logging.Logger; | ||||
| 
 | ||||
| import net.fabricmc.loom.configuration.providers.mappings.MappingLayer; | ||||
| import net.fabricmc.loom.configuration.providers.mappings.MappingNamespace; | ||||
| import net.fabricmc.loom.api.mappings.layered.MappingLayer; | ||||
| import net.fabricmc.loom.api.mappings.layered.MappingsNamespace; | ||||
| import net.fabricmc.loom.configuration.providers.minecraft.MinecraftVersionMeta; | ||||
| import net.fabricmc.loom.configuration.providers.mappings.intermediary.IntermediaryMappingLayer; | ||||
| import net.fabricmc.loom.util.HashedDownloadUtil; | ||||
|  | @ -46,30 +45,30 @@ import net.fabricmc.mappingio.format.ProGuardReader; | |||
| 
 | ||||
| public record MojangMappingLayer(MinecraftVersionMeta.Download clientDownload, | ||||
| 									MinecraftVersionMeta.Download serverDownload, | ||||
| 									File workingDir, | ||||
| 									Path workingDir, | ||||
| 									Logger logger) implements MappingLayer { | ||||
| 	@Override | ||||
| 	public void visit(MappingVisitor mappingVisitor) throws IOException { | ||||
| 		var clientMappings = new File(workingDir(), "client.txt"); | ||||
| 		var serverMappings = new File(workingDir(), "server.txt"); | ||||
| 		Path clientMappings = workingDir().resolve("client.txt"); | ||||
| 		Path serverMappings = workingDir().resolve("server.txt"); | ||||
| 
 | ||||
| 		download(clientMappings, serverMappings); | ||||
| 
 | ||||
| 		printMappingsLicense(clientMappings.toPath()); | ||||
| 		printMappingsLicense(clientMappings); | ||||
| 
 | ||||
| 		// Make official the source namespace | ||||
| 		MappingSourceNsSwitch nsSwitch = new MappingSourceNsSwitch(mappingVisitor, MappingNamespace.OFFICIAL.stringValue()); | ||||
| 		MappingSourceNsSwitch nsSwitch = new MappingSourceNsSwitch(mappingVisitor, MappingsNamespace.OFFICIAL.toString()); | ||||
| 
 | ||||
| 		try (BufferedReader clientBufferedReader = Files.newBufferedReader(clientMappings.toPath(), StandardCharsets.UTF_8); | ||||
| 				BufferedReader serverBufferedReader = Files.newBufferedReader(serverMappings.toPath(), StandardCharsets.UTF_8)) { | ||||
| 			ProGuardReader.read(clientBufferedReader, MappingNamespace.NAMED.stringValue(), MappingNamespace.OFFICIAL.stringValue(), nsSwitch); | ||||
| 			ProGuardReader.read(serverBufferedReader, MappingNamespace.NAMED.stringValue(), MappingNamespace.OFFICIAL.stringValue(), nsSwitch); | ||||
| 		try (BufferedReader clientBufferedReader = Files.newBufferedReader(clientMappings, StandardCharsets.UTF_8); | ||||
| 				BufferedReader serverBufferedReader = Files.newBufferedReader(serverMappings, StandardCharsets.UTF_8)) { | ||||
| 			ProGuardReader.read(clientBufferedReader, MappingsNamespace.NAMED.toString(), MappingsNamespace.OFFICIAL.toString(), nsSwitch); | ||||
| 			ProGuardReader.read(serverBufferedReader, MappingsNamespace.NAMED.toString(), MappingsNamespace.OFFICIAL.toString(), nsSwitch); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	private void download(File clientMappings, File serverMappings) throws IOException { | ||||
| 		HashedDownloadUtil.downloadIfInvalid(new URL(clientDownload().url()), clientMappings, clientDownload().sha1(), logger(), false); | ||||
| 		HashedDownloadUtil.downloadIfInvalid(new URL(serverDownload().url()), serverMappings, serverDownload().sha1(), logger(), false); | ||||
| 	private void download(Path clientMappings, Path serverMappings) throws IOException { | ||||
| 		HashedDownloadUtil.downloadIfInvalid(new URL(clientDownload().url()), clientMappings.toFile(), clientDownload().sha1(), logger(), false); | ||||
| 		HashedDownloadUtil.downloadIfInvalid(new URL(serverDownload().url()), serverMappings.toFile(), serverDownload().sha1(), logger(), false); | ||||
| 	} | ||||
| 
 | ||||
| 	private void printMappingsLicense(Path clientMappings) { | ||||
|  | @ -91,8 +90,8 @@ public record MojangMappingLayer(MinecraftVersionMeta.Download clientDownload, | |||
| 	} | ||||
| 
 | ||||
| 	@Override | ||||
| 	public MappingNamespace getSourceNamespace() { | ||||
| 		return MappingNamespace.OFFICIAL; | ||||
| 	public MappingsNamespace getSourceNamespace() { | ||||
| 		return MappingsNamespace.OFFICIAL; | ||||
| 	} | ||||
| 
 | ||||
| 	@Override | ||||
|  |  | |||
|  | @ -24,8 +24,8 @@ | |||
| 
 | ||||
| package net.fabricmc.loom.configuration.providers.mappings.mojmap; | ||||
| 
 | ||||
| import net.fabricmc.loom.configuration.providers.mappings.MappingContext; | ||||
| import net.fabricmc.loom.configuration.providers.mappings.MappingsSpec; | ||||
| import net.fabricmc.loom.api.mappings.layered.MappingContext; | ||||
| import net.fabricmc.loom.api.mappings.layered.spec.MappingsSpec; | ||||
| import net.fabricmc.loom.configuration.providers.minecraft.MinecraftVersionMeta; | ||||
| 
 | ||||
| public record MojangMappingsSpec() implements MappingsSpec<MojangMappingLayer> { | ||||
|  |  | |||
|  | @ -24,19 +24,19 @@ | |||
| 
 | ||||
| package net.fabricmc.loom.configuration.providers.mappings.parchment; | ||||
| 
 | ||||
| import java.io.File; | ||||
| import java.io.IOException; | ||||
| import java.io.InputStreamReader; | ||||
| import java.nio.file.Path; | ||||
| import java.util.Objects; | ||||
| import java.util.zip.ZipEntry; | ||||
| import java.util.zip.ZipFile; | ||||
| 
 | ||||
| import net.fabricmc.loom.LoomGradlePlugin; | ||||
| import net.fabricmc.loom.configuration.providers.mappings.MappingLayer; | ||||
| import net.fabricmc.loom.configuration.providers.mappings.MappingNamespace; | ||||
| import net.fabricmc.loom.api.mappings.layered.MappingLayer; | ||||
| import net.fabricmc.loom.api.mappings.layered.MappingsNamespace; | ||||
| import net.fabricmc.mappingio.MappingVisitor; | ||||
| 
 | ||||
| public record ParchmentMappingLayer(File parchmentFile, boolean removePrefix) implements MappingLayer { | ||||
| public record ParchmentMappingLayer(Path parchmentFile, boolean removePrefix) implements MappingLayer { | ||||
| 	private static final String PARCHMENT_DATA_FILE_NAME = "parchment.json"; | ||||
| 
 | ||||
| 	@Override | ||||
|  | @ -47,11 +47,11 @@ public record ParchmentMappingLayer(File parchmentFile, boolean removePrefix) im | |||
| 			mappingVisitor = new ParchmentPrefixStripingMappingVisitor(mappingVisitor); | ||||
| 		} | ||||
| 
 | ||||
| 		parchmentData.visit(mappingVisitor, MappingNamespace.NAMED.stringValue()); | ||||
| 		parchmentData.visit(mappingVisitor, MappingsNamespace.NAMED.toString()); | ||||
| 	} | ||||
| 
 | ||||
| 	private ParchmentTreeV1 getParchmentData() throws IOException { | ||||
| 		try (var zipFile = new ZipFile(parchmentFile())) { | ||||
| 		try (var zipFile = new ZipFile(parchmentFile().toFile())) { | ||||
| 			ZipEntry zipFileEntry = zipFile.getEntry(PARCHMENT_DATA_FILE_NAME); | ||||
| 			Objects.requireNonNull(zipFileEntry, "Could not find %s in parchment data file".formatted(PARCHMENT_DATA_FILE_NAME)); | ||||
| 
 | ||||
|  |  | |||
|  | @ -24,12 +24,13 @@ | |||
| 
 | ||||
| package net.fabricmc.loom.configuration.providers.mappings.parchment; | ||||
| 
 | ||||
| import net.fabricmc.loom.configuration.providers.mappings.MappingContext; | ||||
| import net.fabricmc.loom.configuration.providers.mappings.MappingsSpec; | ||||
| import net.fabricmc.loom.api.mappings.layered.spec.FileSpec; | ||||
| import net.fabricmc.loom.api.mappings.layered.MappingContext; | ||||
| import net.fabricmc.loom.api.mappings.layered.spec.MappingsSpec; | ||||
| 
 | ||||
| public record ParchmentMappingsSpec(String mavenNotation, boolean removePrefix) implements MappingsSpec<ParchmentMappingLayer> { | ||||
| public record ParchmentMappingsSpec(FileSpec fileSpec, boolean removePrefix) implements MappingsSpec<ParchmentMappingLayer> { | ||||
| 	@Override | ||||
| 	public ParchmentMappingLayer createLayer(MappingContext context) { | ||||
| 		return new ParchmentMappingLayer(context.mavenFile(mavenNotation()), removePrefix()); | ||||
| 		return new ParchmentMappingLayer(fileSpec.get(context), removePrefix()); | ||||
| 	} | ||||
| } | ||||
|  |  | |||
|  | @ -24,25 +24,29 @@ | |||
| 
 | ||||
| package net.fabricmc.loom.configuration.providers.mappings.parchment; | ||||
| 
 | ||||
| public class ParchmentMappingsSpecBuilder { | ||||
| 	private final String mavenNotation; | ||||
| import net.fabricmc.loom.api.mappings.layered.spec.FileSpec; | ||||
| import net.fabricmc.loom.api.mappings.layered.spec.ParchmentMappingsSpecBuilder; | ||||
| 
 | ||||
| public class ParchmentMappingsSpecBuilderImpl implements ParchmentMappingsSpecBuilder { | ||||
| 	private final FileSpec fileSpec; | ||||
| 
 | ||||
| 	private boolean removePrefix; | ||||
| 
 | ||||
| 	private ParchmentMappingsSpecBuilder(String mavenNotation) { | ||||
| 		this.mavenNotation = mavenNotation; | ||||
| 	private ParchmentMappingsSpecBuilderImpl(FileSpec fileSpec) { | ||||
| 		this.fileSpec = fileSpec; | ||||
| 	} | ||||
| 
 | ||||
| 	public static ParchmentMappingsSpecBuilder builder(String depNotation) { | ||||
| 		return new ParchmentMappingsSpecBuilder(depNotation); | ||||
| 	public static ParchmentMappingsSpecBuilderImpl builder(FileSpec fileSpec) { | ||||
| 		return new ParchmentMappingsSpecBuilderImpl(fileSpec); | ||||
| 	} | ||||
| 
 | ||||
| 	@Override | ||||
| 	public ParchmentMappingsSpecBuilder setRemovePrefix(boolean removePrefix) { | ||||
| 		this.removePrefix = removePrefix; | ||||
| 		return this; | ||||
| 	} | ||||
| 
 | ||||
| 	public ParchmentMappingsSpec build() { | ||||
| 		return new ParchmentMappingsSpec(mavenNotation, removePrefix); | ||||
| 		return new ParchmentMappingsSpec(fileSpec, removePrefix); | ||||
| 	} | ||||
| } | ||||
|  | @ -0,0 +1,69 @@ | |||
| /* | ||||
|  * This file is part of fabric-loom, licensed under the MIT License (MIT). | ||||
|  * | ||||
|  * Copyright (c) 2021 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.io.File; | ||||
| import java.nio.file.Path; | ||||
| import java.util.Objects; | ||||
| import java.util.Set; | ||||
| 
 | ||||
| import org.gradle.api.artifacts.Dependency; | ||||
| import org.gradle.api.artifacts.SelfResolvingDependency; | ||||
| 
 | ||||
| import net.fabricmc.loom.api.mappings.layered.MappingContext; | ||||
| import net.fabricmc.loom.api.mappings.layered.spec.FileSpec; | ||||
| 
 | ||||
| public record DependencyFileSpec(Dependency dependency) implements FileSpec { | ||||
| 	@Override | ||||
| 	public Path get(MappingContext context) { | ||||
| 		if (dependency instanceof SelfResolvingDependency selfResolvingDependency) { | ||||
| 			Set<File> files = selfResolvingDependency.resolve(); | ||||
| 
 | ||||
| 			if (files.size() == 0) { | ||||
| 				throw new RuntimeException("SelfResolvingDependency (%s) resolved no files".formatted(selfResolvingDependency.toString())); | ||||
| 			} else if (files.size() > 1) { | ||||
| 				throw new RuntimeException("SelfResolvingDependency (%s) resolved too many files (%d) only 1 is expected".formatted(selfResolvingDependency.toString(), files.size())); | ||||
| 			} | ||||
| 
 | ||||
| 			return files.iterator().next().toPath(); | ||||
| 		} | ||||
| 
 | ||||
| 		return context.resolveDependency(dependency); | ||||
| 	} | ||||
| 
 | ||||
| 	@Override | ||||
| 	public int hashCode() { | ||||
| 		return Objects.hash(dependency.getGroup(), dependency.getName(), dependency.getVersion()); | ||||
| 	} | ||||
| 
 | ||||
| 	@Override | ||||
| 	public boolean equals(Object obj) { | ||||
| 		if (obj instanceof DependencyFileSpec other) { | ||||
| 			return other.dependency().contentEquals(this.dependency()); | ||||
| 		} | ||||
| 
 | ||||
| 		return false; | ||||
| 	} | ||||
| } | ||||
|  | @ -0,0 +1,63 @@ | |||
| /* | ||||
|  * This file is part of fabric-loom, licensed under the MIT License (MIT). | ||||
|  * | ||||
|  * Copyright (c) 2021 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.io.File; | ||||
| import java.nio.file.Path; | ||||
| import java.util.Arrays; | ||||
| import java.util.Objects; | ||||
| 
 | ||||
| import net.fabricmc.loom.api.mappings.layered.spec.FileSpec; | ||||
| import net.fabricmc.loom.api.mappings.layered.MappingContext; | ||||
| import net.fabricmc.loom.util.Checksum; | ||||
| 
 | ||||
| public class LocalFileSpec implements FileSpec { | ||||
| 	private final File file; | ||||
| 	private final int hash; | ||||
| 
 | ||||
| 	public LocalFileSpec(File file) { | ||||
| 		this.file = file; | ||||
| 		this.hash = calculateHashCode(); | ||||
| 	} | ||||
| 
 | ||||
| 	private int calculateHashCode() { | ||||
| 		if (!file.exists()) { | ||||
| 			throw new RuntimeException("Could not find %s, it must be present at spec creation time to calculate mappings hash".formatted(file.getAbsolutePath())); | ||||
| 		} | ||||
| 
 | ||||
| 		// Use the file hash as part of the spec, this means if the input file changes the mappings will be re-generated. | ||||
| 		return Objects.hash(Arrays.hashCode(Checksum.sha256(file)), file.getAbsolutePath()); | ||||
| 	} | ||||
| 
 | ||||
| 	@Override | ||||
| 	public Path get(MappingContext context) { | ||||
| 		return file.toPath(); | ||||
| 	} | ||||
| 
 | ||||
| 	@Override | ||||
| 	public int hashCode() { | ||||
| 		return hash; | ||||
| 	} | ||||
| } | ||||
|  | @ -0,0 +1,37 @@ | |||
| /* | ||||
|  * This file is part of fabric-loom, licensed under the MIT License (MIT). | ||||
|  * | ||||
|  * Copyright (c) 2021 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 net.fabricmc.loom.api.mappings.layered.spec.FileSpec; | ||||
| import net.fabricmc.loom.api.mappings.layered.MappingContext; | ||||
| 
 | ||||
| public record MavenFileSpec(String dependencyNotation) implements FileSpec { | ||||
| 	@Override | ||||
| 	public Path get(MappingContext context) { | ||||
| 		return context.resolveMavenDependency(dependencyNotation); | ||||
| 	} | ||||
| } | ||||
|  | @ -35,6 +35,7 @@ import java.util.function.Consumer; | |||
| import com.google.common.collect.ImmutableMap; | ||||
| import org.gradle.api.Project; | ||||
| 
 | ||||
| import net.fabricmc.loom.api.mappings.layered.MappingsNamespace; | ||||
| import net.fabricmc.loom.configuration.DependencyProvider; | ||||
| import net.fabricmc.loom.configuration.providers.MinecraftProviderImpl; | ||||
| import net.fabricmc.loom.configuration.providers.mappings.MappingsProviderImpl; | ||||
|  | @ -99,7 +100,7 @@ public class MinecraftMappedProvider extends DependencyProvider { | |||
| 	} | ||||
| 
 | ||||
| 	private void mapMinecraftJar() throws IOException { | ||||
| 		String fromM = "official"; | ||||
| 		String fromM = MappingsNamespace.OFFICIAL.toString(); | ||||
| 
 | ||||
| 		MappingsProviderImpl mappingsProvider = getExtension().getMappingsProvider(); | ||||
| 
 | ||||
|  | @ -107,8 +108,8 @@ public class MinecraftMappedProvider extends DependencyProvider { | |||
| 		Path outputMapped = minecraftMappedJar.toPath(); | ||||
| 		Path outputIntermediary = minecraftIntermediaryJar.toPath(); | ||||
| 
 | ||||
| 		for (String toM : Arrays.asList("named", "intermediary")) { | ||||
| 			Path output = "named".equals(toM) ? outputMapped : outputIntermediary; | ||||
| 		for (String toM : Arrays.asList(MappingsNamespace.NAMED.toString(), MappingsNamespace.INTERMEDIARY.toString())) { | ||||
| 			Path output = MappingsNamespace.NAMED.toString().equals(toM) ? outputMapped : outputIntermediary; | ||||
| 
 | ||||
| 			getProject().getLogger().lifecycle(":remapping minecraft (TinyRemapper, " + fromM + " -> " + toM + ")"); | ||||
| 
 | ||||
|  |  | |||
|  | @ -37,12 +37,13 @@ import org.gradle.api.publish.maven.MavenPublication; | |||
| import net.fabricmc.loom.api.LoomGradleExtensionAPI; | ||||
| import net.fabricmc.loom.api.MixinExtensionAPI; | ||||
| import net.fabricmc.loom.api.decompilers.LoomDecompiler; | ||||
| import net.fabricmc.loom.api.mappings.layered.spec.LayeredMappingSpecBuilder; | ||||
| import net.fabricmc.loom.configuration.ide.RunConfigSettings; | ||||
| import net.fabricmc.loom.configuration.mods.ModVersionParser; | ||||
| import net.fabricmc.loom.configuration.processors.JarProcessor; | ||||
| import net.fabricmc.loom.configuration.providers.mappings.GradleMappingContext; | ||||
| import net.fabricmc.loom.configuration.providers.mappings.LayeredMappingSpec; | ||||
| import net.fabricmc.loom.configuration.providers.mappings.LayeredMappingSpecBuilder; | ||||
| import net.fabricmc.loom.configuration.providers.mappings.LayeredMappingSpecBuilderImpl; | ||||
| import net.fabricmc.loom.configuration.providers.mappings.LayeredMappingsDependency; | ||||
| import net.fabricmc.loom.util.DeprecationHelper; | ||||
| 
 | ||||
|  | @ -113,7 +114,7 @@ public abstract class LoomGradleExtensionApiImpl implements LoomGradleExtensionA | |||
| 
 | ||||
| 	@Override | ||||
| 	public Dependency layered(Action<LayeredMappingSpecBuilder> action) { | ||||
| 		LayeredMappingSpecBuilder builder = new LayeredMappingSpecBuilder(); | ||||
| 		LayeredMappingSpecBuilderImpl builder = new LayeredMappingSpecBuilderImpl(); | ||||
| 		action.execute(builder); | ||||
| 		LayeredMappingSpec builtSpec = builder.build(); | ||||
| 		return new LayeredMappingsDependency(new GradleMappingContext(getProject(), builtSpec.getVersion().replace("+", "_").replace(".", "_")), builtSpec, builtSpec.getVersion()); | ||||
|  |  | |||
|  | @ -36,9 +36,9 @@ import org.gradle.api.publish.maven.MavenPublication; | |||
| import net.fabricmc.loom.api.LoomGradleExtensionAPI; | ||||
| import net.fabricmc.loom.api.MixinExtensionAPI; | ||||
| import net.fabricmc.loom.api.decompilers.LoomDecompiler; | ||||
| import net.fabricmc.loom.api.mappings.layered.spec.LayeredMappingSpecBuilder; | ||||
| import net.fabricmc.loom.configuration.ide.RunConfigSettings; | ||||
| import net.fabricmc.loom.configuration.processors.JarProcessor; | ||||
| import net.fabricmc.loom.configuration.providers.mappings.LayeredMappingSpecBuilder; | ||||
| import net.fabricmc.loom.util.DeprecationHelper; | ||||
| 
 | ||||
| public class MinecraftGradleExtension implements LoomGradleExtensionAPI { | ||||
|  |  | |||
|  | @ -49,10 +49,11 @@ import org.gradle.api.tasks.TaskAction; | |||
| import org.gradle.api.tasks.options.Option; | ||||
| 
 | ||||
| import net.fabricmc.loom.LoomGradleExtension; | ||||
| import net.fabricmc.loom.api.mappings.layered.spec.LayeredMappingSpecBuilder; | ||||
| import net.fabricmc.loom.api.mappings.layered.MappingsNamespace; | ||||
| import net.fabricmc.loom.configuration.providers.mappings.LayeredMappingsDependency; | ||||
| import net.fabricmc.loom.configuration.providers.mappings.MappingsProviderImpl; | ||||
| import net.fabricmc.loom.configuration.providers.minecraft.MinecraftMappedProvider; | ||||
| import net.fabricmc.loom.configuration.providers.mappings.LayeredMappingSpecBuilder; | ||||
| import net.fabricmc.loom.configuration.providers.mappings.LayeredMappingsDependency; | ||||
| import net.fabricmc.loom.util.SourceRemapper; | ||||
| import net.fabricmc.lorenztiny.TinyMappingsJoiner; | ||||
| import net.fabricmc.mapping.tree.TinyMappingFactory; | ||||
|  | @ -166,9 +167,9 @@ public class MigrateMappingsTask extends AbstractLoomTask { | |||
| 		project.getLogger().info(":joining mappings"); | ||||
| 
 | ||||
| 		MappingSet mappingSet = new TinyMappingsJoiner( | ||||
| 				currentMappings, "named", | ||||
| 				targetMappings, "named", | ||||
| 				"intermediary" | ||||
| 				currentMappings, MappingsNamespace.NAMED.toString(), | ||||
| 				targetMappings, MappingsNamespace.NAMED.toString(), | ||||
| 				MappingsNamespace.INTERMEDIARY.toString() | ||||
| 		).read(); | ||||
| 
 | ||||
| 		project.getLogger().lifecycle(":remapping"); | ||||
|  |  | |||
|  | @ -57,6 +57,7 @@ import org.zeroturnaround.zip.transform.StreamZipEntryTransformer; | |||
| import org.zeroturnaround.zip.transform.ZipEntryTransformerEntry; | ||||
| 
 | ||||
| import net.fabricmc.loom.LoomGradleExtension; | ||||
| import net.fabricmc.loom.api.mappings.layered.MappingsNamespace; | ||||
| import net.fabricmc.loom.build.JarRemapper; | ||||
| import net.fabricmc.loom.build.MixinRefmapHelper; | ||||
| import net.fabricmc.loom.build.nesting.JarNester; | ||||
|  | @ -130,8 +131,8 @@ public class RemapJarTask extends Jar { | |||
| 
 | ||||
| 		MappingsProviderImpl mappingsProvider = extension.getMappingsProvider(); | ||||
| 
 | ||||
| 		String fromM = "named"; | ||||
| 		String toM = "intermediary"; | ||||
| 		String fromM = MappingsNamespace.NAMED.toString(); | ||||
| 		String toM = MappingsNamespace.INTERMEDIARY.toString(); | ||||
| 
 | ||||
| 		if (isMainRemapTask) { | ||||
| 			jarRemapper.addToClasspath(getRemapClasspath()); | ||||
|  |  | |||
|  | @ -32,12 +32,13 @@ import org.gradle.api.tasks.Internal; | |||
| import org.gradle.api.tasks.OutputFile; | ||||
| import org.gradle.api.tasks.TaskAction; | ||||
| 
 | ||||
| import net.fabricmc.loom.api.mappings.layered.MappingsNamespace; | ||||
| import net.fabricmc.loom.util.SourceRemapper; | ||||
| 
 | ||||
| public class RemapSourcesJarTask extends AbstractLoomTask { | ||||
| 	private final RegularFileProperty input = getProject().getObjects().fileProperty(); | ||||
| 	private final RegularFileProperty output = getProject().getObjects().fileProperty().convention(input); | ||||
| 	private final Property<String> targetNamespace = getProject().getObjects().property(String.class).convention("intermediary"); | ||||
| 	private final Property<String> targetNamespace = getProject().getObjects().property(String.class).convention(MappingsNamespace.INTERMEDIARY.toString()); | ||||
| 	private SourceRemapper sourceRemapper = null; | ||||
| 	private final Property<Boolean> preserveFileTimestamps = getProject().getObjects().property(Boolean.class).convention(true); | ||||
| 	private final Property<Boolean> reproducibleFileOrder = getProject().getObjects().property(Boolean.class).convention(false); | ||||
|  | @ -49,7 +50,7 @@ public class RemapSourcesJarTask extends AbstractLoomTask { | |||
| 	public void remap() throws Exception { | ||||
| 		if (sourceRemapper == null) { | ||||
| 			String direction = targetNamespace.get(); | ||||
| 			SourceRemapper.remapSources(getProject(), input.get().getAsFile(), output.get().getAsFile(), direction.equals("named"), reproducibleFileOrder.get(), preserveFileTimestamps.get()); | ||||
| 			SourceRemapper.remapSources(getProject(), input.get().getAsFile(), output.get().getAsFile(), direction.equals(MappingsNamespace.NAMED.toString()), reproducibleFileOrder.get(), preserveFileTimestamps.get()); | ||||
| 		} else { | ||||
| 			sourceRemapper.scheduleRemapSources(input.get().getAsFile(), output.get().getAsFile(), reproducibleFileOrder.get(), preserveFileTimestamps.get()); | ||||
| 		} | ||||
|  |  | |||
|  | @ -40,6 +40,7 @@ import org.gradle.api.Project; | |||
| import org.zeroturnaround.zip.ZipUtil; | ||||
| 
 | ||||
| import net.fabricmc.loom.LoomGradleExtension; | ||||
| import net.fabricmc.loom.api.mappings.layered.MappingsNamespace; | ||||
| import net.fabricmc.loom.configuration.RemappedConfigurationEntry; | ||||
| import net.fabricmc.loom.configuration.providers.mappings.MappingsProviderImpl; | ||||
| import net.fabricmc.loom.util.gradle.ProgressLogger; | ||||
|  | @ -166,7 +167,7 @@ public class SourceRemapper { | |||
| 			try { | ||||
| 				TinyTree m = mappingsProvider.getMappings(); | ||||
| 				project.getLogger().info(":loading " + (toNamed ? "intermediary -> named" : "named -> intermediary") + " source mappings"); | ||||
| 				return new TinyMappingsReader(m, toNamed ? "intermediary" : "named", toNamed ? "named" : "intermediary").read(); | ||||
| 				return new TinyMappingsReader(m, toNamed ? MappingsNamespace.INTERMEDIARY.toString() : MappingsNamespace.NAMED.toString(), toNamed ? MappingsNamespace.NAMED.toString() : MappingsNamespace.INTERMEDIARY.toString()).read(); | ||||
| 			} catch (Exception e) { | ||||
| 				throw new RuntimeException(e); | ||||
| 			} | ||||
|  |  | |||
|  | @ -24,8 +24,9 @@ | |||
| 
 | ||||
| package net.fabricmc.loom.test.unit.layeredmappings | ||||
| 
 | ||||
| import net.fabricmc.loom.configuration.providers.mappings.utils.MavenFileSpec | ||||
| import net.fabricmc.loom.configuration.providers.mappings.LayeredMappingSpec | ||||
| import net.fabricmc.loom.configuration.providers.mappings.LayeredMappingSpecBuilder | ||||
| import net.fabricmc.loom.configuration.providers.mappings.LayeredMappingSpecBuilderImpl | ||||
| import net.fabricmc.loom.configuration.providers.mappings.intermediary.IntermediaryMappingsSpec | ||||
| import net.fabricmc.loom.configuration.providers.mappings.mojmap.MojangMappingsSpec | ||||
| import net.fabricmc.loom.configuration.providers.mappings.parchment.ParchmentMappingsSpec | ||||
|  | @ -61,7 +62,7 @@ class LayeredMappingSpecBuilderTest extends Specification { | |||
|             layers[0].class == IntermediaryMappingsSpec | ||||
|             layers[1].class == MojangMappingsSpec | ||||
|             layers[2].class == ParchmentMappingsSpec | ||||
|             parchment.mavenNotation() == "I like cake" | ||||
|             (parchment.fileSpec() as MavenFileSpec).dependencyNotation() == "I like cake" | ||||
|             parchment.removePrefix() == true | ||||
|     } | ||||
| 
 | ||||
|  | @ -81,7 +82,7 @@ class LayeredMappingSpecBuilderTest extends Specification { | |||
|             layers[0].class == IntermediaryMappingsSpec | ||||
|             layers[1].class == MojangMappingsSpec | ||||
|             layers[2].class == ParchmentMappingsSpec | ||||
|             parchment.mavenNotation() == "I like cake" | ||||
|             (parchment.fileSpec() as MavenFileSpec).dependencyNotation() == "I like cake" | ||||
|             parchment.removePrefix() == false | ||||
|     } | ||||
| 
 | ||||
|  | @ -101,17 +102,17 @@ class LayeredMappingSpecBuilderTest extends Specification { | |||
|             layers[0].class == IntermediaryMappingsSpec | ||||
|             layers[1].class == MojangMappingsSpec | ||||
|             layers[2].class == ParchmentMappingsSpec | ||||
|             parchment.mavenNotation() == "I really like cake" | ||||
|             (parchment.fileSpec() as MavenFileSpec).dependencyNotation() == "I really like cake" | ||||
|             parchment.removePrefix() == false | ||||
|     } | ||||
| 
 | ||||
|     // Gradle does this big of magic behind the scenes | ||||
|     LayeredMappingSpec layered(@DelegatesTo(LayeredMappingSpecBuilder) Closure cl) { | ||||
|     LayeredMappingSpec layered(@DelegatesTo(LayeredMappingSpecBuilderImpl) Closure cl) { | ||||
|         return layeredAction(ConfigureUtil.configureUsing(cl)) | ||||
|     } | ||||
| 
 | ||||
|     LayeredMappingSpec layeredAction(Action<LayeredMappingSpecBuilder> action) { | ||||
|         LayeredMappingSpecBuilder builder = new LayeredMappingSpecBuilder() | ||||
|     LayeredMappingSpec layeredAction(Action<LayeredMappingSpecBuilderImpl> action) { | ||||
|         LayeredMappingSpecBuilderImpl builder = new LayeredMappingSpecBuilderImpl() | ||||
|         action.execute(builder) | ||||
|         return builder.build() | ||||
|     } | ||||
|  |  | |||
|  | @ -28,18 +28,20 @@ import groovy.transform.CompileStatic | |||
| import net.fabricmc.loom.configuration.providers.MinecraftProvider | ||||
| import net.fabricmc.loom.configuration.providers.mappings.LayeredMappingSpec | ||||
| import net.fabricmc.loom.configuration.providers.mappings.LayeredMappingsProcessor | ||||
| import net.fabricmc.loom.configuration.providers.mappings.MappingContext | ||||
| import net.fabricmc.loom.configuration.providers.mappings.MappingLayer | ||||
| import net.fabricmc.loom.configuration.providers.mappings.MappingNamespace | ||||
| import net.fabricmc.loom.api.mappings.layered.MappingContext | ||||
| import net.fabricmc.loom.api.mappings.layered.MappingLayer | ||||
| import net.fabricmc.loom.api.mappings.layered.MappingsNamespace | ||||
| import net.fabricmc.loom.configuration.providers.mappings.MappingsProvider | ||||
| import net.fabricmc.loom.configuration.providers.mappings.MappingsSpec | ||||
| import net.fabricmc.loom.api.mappings.layered.spec.MappingsSpec | ||||
| import net.fabricmc.mappingio.adapter.MappingDstNsReorder | ||||
| 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.logging.Logger | ||||
| import spock.lang.Specification | ||||
| 
 | ||||
| import java.nio.file.Path | ||||
| import java.util.zip.ZipFile | ||||
| 
 | ||||
| abstract class LayeredMappingsSpecification extends Specification implements LayeredMappingsTestConstants { | ||||
|  | @ -94,8 +96,8 @@ abstract class LayeredMappingsSpecification extends Specification implements Lay | |||
| 
 | ||||
|     MemoryMappingTree reorder(MemoryMappingTree mappingTree) { | ||||
|         def reorderedMappings = new MemoryMappingTree() | ||||
|         def nsReorder = new MappingDstNsReorder(reorderedMappings, Collections.singletonList(MappingNamespace.NAMED.stringValue())) | ||||
|         def nsSwitch = new MappingSourceNsSwitch(nsReorder, MappingNamespace.INTERMEDIARY.stringValue(), true) | ||||
|         def nsReorder = new MappingDstNsReorder(reorderedMappings, Collections.singletonList(MappingsNamespace.NAMED.toString())) | ||||
|         def nsSwitch = new MappingSourceNsSwitch(nsReorder, MappingsNamespace.INTERMEDIARY.toString(), true) | ||||
|         mappingTree.accept(nsSwitch) | ||||
|         return reorderedMappings | ||||
|     } | ||||
|  | @ -103,9 +105,14 @@ abstract class LayeredMappingsSpecification extends Specification implements Lay | |||
|     @CompileStatic | ||||
|     class TestMappingContext implements MappingContext { | ||||
|         @Override | ||||
|         File mavenFile(String mavenNotation) { | ||||
|         Path resolveDependency(Dependency dependency) { | ||||
|             throw new UnsupportedOperationException("TODO") | ||||
|         } | ||||
| 
 | ||||
|         @Override | ||||
|         Path resolveMavenDependency(String mavenNotation) { | ||||
|             assert mavenFiles.containsKey(mavenNotation) | ||||
|             return mavenFiles.get(mavenNotation) | ||||
|             return mavenFiles.get(mavenNotation).toPath() | ||||
|         } | ||||
| 
 | ||||
|         @Override | ||||
|  | @ -119,8 +126,8 @@ abstract class LayeredMappingsSpecification extends Specification implements Lay | |||
|         } | ||||
| 
 | ||||
|         @Override | ||||
|         File workingDirectory(String name) { | ||||
|             return new File(tempDir, name) | ||||
|         Path workingDirectory(String name) { | ||||
|             return new File(tempDir, name).toPath() | ||||
|         } | ||||
| 
 | ||||
|         @Override | ||||
|  |  | |||
|  | @ -24,6 +24,7 @@ | |||
| 
 | ||||
| package net.fabricmc.loom.test.unit.layeredmappings | ||||
| 
 | ||||
| import net.fabricmc.loom.api.mappings.layered.spec.FileSpec | ||||
| import net.fabricmc.loom.configuration.providers.mappings.intermediary.IntermediaryMappingsSpec | ||||
| import net.fabricmc.loom.configuration.providers.mappings.mojmap.MojangMappingsSpec | ||||
| import net.fabricmc.loom.configuration.providers.mappings.parchment.ParchmentMappingsSpec | ||||
|  | @ -38,7 +39,7 @@ class ParchmentMappingLayerTest extends LayeredMappingsSpecification { | |||
|             def mappings = getLayeredMappings( | ||||
|                     new IntermediaryMappingsSpec(), | ||||
|                     new MojangMappingsSpec(), | ||||
|                     new ParchmentMappingsSpec(PARCHMENT_NOTATION, false) | ||||
|                     new ParchmentMappingsSpec(FileSpec.create(PARCHMENT_NOTATION), false) | ||||
|             ) | ||||
|             def tiny = getTiny(mappings) | ||||
|             def reorderedMappings = reorder(mappings) | ||||
|  | @ -61,7 +62,7 @@ class ParchmentMappingLayerTest extends LayeredMappingsSpecification { | |||
|             def mappings = getLayeredMappings( | ||||
|                     new IntermediaryMappingsSpec(), | ||||
|                     new MojangMappingsSpec(), | ||||
|                     new ParchmentMappingsSpec(PARCHMENT_NOTATION, true) | ||||
|                     new ParchmentMappingsSpec(FileSpec.create(PARCHMENT_NOTATION), true) | ||||
|             ) | ||||
|             def tiny = getTiny(mappings) | ||||
|             def reorderedMappings = reorder(mappings) | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue