Make remapped configurations lazy
This commit is contained in:
		
							parent
							
								
									891870584d
								
							
						
					
					
						commit
						a5bc38a940
					
				
					 4 changed files with 131 additions and 43 deletions
				
			
		|  | @ -48,6 +48,7 @@ import org.jetbrains.annotations.ApiStatus; | |||
| 
 | ||||
| import net.fabricmc.loom.api.decompilers.LoomDecompiler; | ||||
| import net.fabricmc.loom.configuration.LoomDependencyManager; | ||||
| import net.fabricmc.loom.configuration.LoomProjectData; | ||||
| import net.fabricmc.loom.configuration.ide.RunConfigSettings; | ||||
| import net.fabricmc.loom.configuration.processors.JarProcessor; | ||||
| import net.fabricmc.loom.configuration.processors.JarProcessorManager; | ||||
|  | @ -80,6 +81,9 @@ public class LoomGradleExtension { | |||
| 	private Mercury[] srcMercuryCache = new Mercury[2]; | ||||
| 	private Set<File> mixinMappings = Collections.synchronizedSet(new HashSet<>()); | ||||
| 
 | ||||
| 	@ApiStatus.Internal | ||||
| 	private final LoomProjectData projectData; | ||||
| 
 | ||||
| 	private NamedDomainObjectContainer<RunConfigSettings> runConfigs; | ||||
| 
 | ||||
| 	/** | ||||
|  | @ -119,6 +123,7 @@ public class LoomGradleExtension { | |||
| 		this.runConfigs = project.container(RunConfigSettings.class, | ||||
| 				baseName -> new RunConfigSettings(project, baseName)); | ||||
| 		this.log4jConfigs = project.files(getDefaultLog4jConfigFile()); | ||||
| 		projectData = new LoomProjectData(project); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
|  | @ -371,4 +376,9 @@ public class LoomGradleExtension { | |||
| 	public NamedDomainObjectContainer<RunConfigSettings> getRunConfigs() { | ||||
| 		return runConfigs; | ||||
| 	} | ||||
| 
 | ||||
| 	@ApiStatus.Internal | ||||
| 	public LoomProjectData getProjectData() { | ||||
| 		return projectData; | ||||
| 	} | ||||
| } | ||||
|  |  | |||
|  | @ -46,6 +46,7 @@ import org.gradle.language.base.artifact.SourcesArtifact; | |||
| 
 | ||||
| import net.fabricmc.loom.LoomGradleExtension; | ||||
| import net.fabricmc.loom.LoomGradlePlugin; | ||||
| import net.fabricmc.loom.configuration.LoomProjectData; | ||||
| import net.fabricmc.loom.configuration.RemappedConfigurationEntry; | ||||
| import net.fabricmc.loom.configuration.mods.ModProcessor; | ||||
| import net.fabricmc.loom.configuration.processors.dependency.ModDependencyInfo; | ||||
|  | @ -64,60 +65,63 @@ public class ModCompileRemapper { | |||
| 		final File modStore = extension.getRemappedModCache(); | ||||
| 		final RemapData remapData = new RemapData(mappingsSuffix, modStore); | ||||
| 
 | ||||
| 		final LoomProjectData data = extension.getProjectData(); | ||||
| 
 | ||||
| 		for (RemappedConfigurationEntry entry : Constants.MOD_COMPILE_ENTRIES) { | ||||
| 			Configuration sourceConfig = project.getConfigurations().getByName(entry.getSourceConfiguration()); | ||||
| 			Configuration remappedConfig = project.getConfigurations().getByName(entry.getRemappedConfiguration()); | ||||
| 			Configuration regularConfig = project.getConfigurations().getByName(entry.getTargetConfiguration(project.getConfigurations())); | ||||
| 			data.getLazyConfigurationProvider(entry.getRemappedConfiguration()).configure(remappedConfig -> { | ||||
| 				Configuration sourceConfig = project.getConfigurations().getByName(entry.getSourceConfiguration()); | ||||
| 				Configuration regularConfig = project.getConfigurations().getByName(entry.getTargetConfiguration(project.getConfigurations())); | ||||
| 
 | ||||
| 			List<ModDependencyInfo> modDependencies = new ArrayList<>(); | ||||
| 				List<ModDependencyInfo> modDependencies = new ArrayList<>(); | ||||
| 
 | ||||
| 			for (ResolvedArtifact artifact : sourceConfig.getResolvedConfiguration().getResolvedArtifacts()) { | ||||
| 				// TODO: This collection doesn't appear to include FileCollection dependencies | ||||
| 				// Might have to go based on the dependencies, rather than their resolved form? | ||||
| 				// File dependencies use SelfResolvingDependency, which appears to be handled differently | ||||
| 				String group = artifact.getModuleVersion().getId().getGroup(); | ||||
| 				String name = artifact.getModuleVersion().getId().getName(); | ||||
| 				String version = artifact.getModuleVersion().getId().getVersion(); | ||||
| 				for (ResolvedArtifact artifact : sourceConfig.getResolvedConfiguration().getResolvedArtifacts()) { | ||||
| 					// TODO: This collection doesn't appear to include FileCollection dependencies | ||||
| 					// Might have to go based on the dependencies, rather than their resolved form? | ||||
| 					// File dependencies use SelfResolvingDependency, which appears to be handled differently | ||||
| 					String group = artifact.getModuleVersion().getId().getGroup(); | ||||
| 					String name = artifact.getModuleVersion().getId().getName(); | ||||
| 					String version = artifact.getModuleVersion().getId().getVersion(); | ||||
| 
 | ||||
| 				if (!isFabricMod(logger, artifact)) { | ||||
| 					addToRegularCompile(project, regularConfig, artifact); | ||||
| 					continue; | ||||
| 				} | ||||
| 					if (!isFabricMod(logger, artifact)) { | ||||
| 						addToRegularCompile(project, regularConfig, artifact); | ||||
| 						continue; | ||||
| 					} | ||||
| 
 | ||||
| 				ModDependencyInfo info = new ModDependencyInfo(group, name, version, artifact.getClassifier(), artifact.getFile(), remappedConfig, remapData); | ||||
| 					ModDependencyInfo info = new ModDependencyInfo(group, name, version, artifact.getClassifier(), artifact.getFile(), remappedConfig, remapData); | ||||
| 
 | ||||
| 				if (refreshDeps) { | ||||
| 					info.forceRemap(); | ||||
| 				} | ||||
| 					if (refreshDeps) { | ||||
| 						info.forceRemap(); | ||||
| 					} | ||||
| 
 | ||||
| 				modDependencies.add(info); | ||||
| 					modDependencies.add(info); | ||||
| 
 | ||||
| 				String remappedLog = group + ":" + name + ":" + version + (artifact.getClassifier() == null ? "" : ":" + artifact.getClassifier()) + " (" + mappingsSuffix + ")"; | ||||
| 				project.getLogger().info(":providing " + remappedLog); | ||||
| 					String remappedLog = group + ":" + name + ":" + version + (artifact.getClassifier() == null ? "" : ":" + artifact.getClassifier()) + " (" + mappingsSuffix + ")"; | ||||
| 					project.getLogger().info(":providing " + remappedLog); | ||||
| 
 | ||||
| 				File remappedSources = info.getRemappedOutput("sources"); | ||||
| 					File remappedSources = info.getRemappedOutput("sources"); | ||||
| 
 | ||||
| 				if ((!remappedSources.exists() || refreshDeps) && !OperatingSystem.isCIBuild()) { | ||||
| 					File sources = findSources(dependencies, artifact); | ||||
| 					if ((!remappedSources.exists() || refreshDeps) && !OperatingSystem.isCIBuild()) { | ||||
| 						File sources = findSources(dependencies, artifact); | ||||
| 
 | ||||
| 					if (sources != null) { | ||||
| 						scheduleSourcesRemapping(project, sourceRemapper, sources, info.getRemappedNotation(), remappedSources); | ||||
| 						if (sources != null) { | ||||
| 							scheduleSourcesRemapping(project, sourceRemapper, sources, info.getRemappedNotation(), remappedSources); | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 
 | ||||
| 			try { | ||||
| 				ModProcessor.processMods(project, modDependencies); | ||||
| 			} catch (IOException e) { | ||||
| 				// Failed to remap, lets clean up to ensure we try again next time | ||||
| 				modDependencies.forEach(info -> info.getRemappedOutput().delete()); | ||||
| 				throw new RuntimeException("Failed to remap mods", e); | ||||
| 			} | ||||
| 				try { | ||||
| 					ModProcessor.processMods(project, modDependencies); | ||||
| 				} catch (IOException e) { | ||||
| 					// Failed to remap, lets clean up to ensure we try again next time | ||||
| 					modDependencies.forEach(info -> info.getRemappedOutput().delete()); | ||||
| 					throw new RuntimeException("Failed to remap mods", e); | ||||
| 				} | ||||
| 
 | ||||
| 			// Add all of the remapped mods onto the config | ||||
| 			for (ModDependencyInfo info : modDependencies) { | ||||
| 				project.getDependencies().add(info.targetConfig.getName(), info.getRemappedNotation()); | ||||
| 			} | ||||
| 				// Add all of the remapped mods onto the config | ||||
| 				for (ModDependencyInfo info : modDependencies) { | ||||
| 					project.getDependencies().add(info.targetConfig.getName(), info.getRemappedNotation()); | ||||
| 				} | ||||
| 			}); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
|  |  | |||
|  | @ -72,11 +72,15 @@ public final class CompileConfiguration { | |||
| 		project.getConfigurations().maybeCreate(Constants.Configurations.LOOM_DEVELOPMENT_DEPENDENCIES); | ||||
| 		project.getConfigurations().maybeCreate(Constants.Configurations.UNPICK_CLASSPATH); | ||||
| 
 | ||||
| 		LoomProjectData data = project.getExtensions().getByType(LoomGradleExtension.class).getProjectData(); | ||||
| 
 | ||||
| 		for (RemappedConfigurationEntry entry : Constants.MOD_COMPILE_ENTRIES) { | ||||
| 			Configuration compileModsConfig = project.getConfigurations().maybeCreate(entry.getSourceConfiguration()); | ||||
| 			compileModsConfig.setTransitive(true); | ||||
| 			Configuration compileModsMappedConfig = project.getConfigurations().maybeCreate(entry.getRemappedConfiguration()); | ||||
| 			compileModsMappedConfig.setTransitive(false); // Don't get transitive deps of already remapped mods | ||||
| 			data.createLazyConfiguration(entry.getSourceConfiguration()) | ||||
| 					.configure(configuration -> configuration.setTransitive(true)); | ||||
| 
 | ||||
| 			// Don't get transitive deps of already remapped mods | ||||
| 			data.createLazyConfiguration(entry.getRemappedConfiguration()) | ||||
| 					.configure(configuration -> configuration.setTransitive(false)); | ||||
| 
 | ||||
| 			extendsFrom(entry.getTargetConfiguration(project.getConfigurations()), entry.getRemappedConfiguration(), project); | ||||
| 
 | ||||
|  |  | |||
|  | @ -0,0 +1,70 @@ | |||
| /* | ||||
|  * This file is part of fabric-loom, licensed under the MIT License (MIT). | ||||
|  * | ||||
|  * Copyright (c) 2016, 2017, 2018 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; | ||||
| 
 | ||||
| import java.util.HashMap; | ||||
| import java.util.Map; | ||||
| import java.util.Objects; | ||||
| 
 | ||||
| import org.gradle.api.NamedDomainObjectProvider; | ||||
| import org.gradle.api.Project; | ||||
| import org.gradle.api.artifacts.Configuration; | ||||
| import org.jetbrains.annotations.ApiStatus; | ||||
| 
 | ||||
| @ApiStatus.Internal | ||||
| /** | ||||
|  * This class is stored in the gradle extension, and should not be used outside of loom. | ||||
|  * It contains data/info related to the current project | ||||
|  */ | ||||
| public final class LoomProjectData { | ||||
| 	private final Project project; | ||||
| 	private final Map<String, NamedDomainObjectProvider<Configuration>> lazyConfigurations = new HashMap<>(); | ||||
| 
 | ||||
| 	public LoomProjectData(Project project) { | ||||
| 		this.project = Objects.requireNonNull(project); | ||||
| 	} | ||||
| 
 | ||||
| 	public NamedDomainObjectProvider<Configuration> createLazyConfiguration(String name) { | ||||
| 		NamedDomainObjectProvider<Configuration> provider = project.getConfigurations().register(name); | ||||
| 
 | ||||
| 		if (lazyConfigurations.containsKey(name)) { | ||||
| 			throw new IllegalStateException("Duplicate configuration name" + name); | ||||
| 		} | ||||
| 
 | ||||
| 		lazyConfigurations.put(name, provider); | ||||
| 
 | ||||
| 		return provider; | ||||
| 	} | ||||
| 
 | ||||
| 	public NamedDomainObjectProvider<Configuration> getLazyConfigurationProvider(String name) { | ||||
| 		NamedDomainObjectProvider<Configuration> provider = lazyConfigurations.get(name); | ||||
| 
 | ||||
| 		if (provider == null) { | ||||
| 			throw new NullPointerException("Could not find provider with name: " + name); | ||||
| 		} | ||||
| 
 | ||||
| 		return provider; | ||||
| 	} | ||||
| } | ||||
		Loading…
	
		Reference in a new issue