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.api.decompilers.LoomDecompiler; | ||||||
| import net.fabricmc.loom.configuration.LoomDependencyManager; | import net.fabricmc.loom.configuration.LoomDependencyManager; | ||||||
|  | import net.fabricmc.loom.configuration.LoomProjectData; | ||||||
| import net.fabricmc.loom.configuration.ide.RunConfigSettings; | import net.fabricmc.loom.configuration.ide.RunConfigSettings; | ||||||
| import net.fabricmc.loom.configuration.processors.JarProcessor; | import net.fabricmc.loom.configuration.processors.JarProcessor; | ||||||
| import net.fabricmc.loom.configuration.processors.JarProcessorManager; | import net.fabricmc.loom.configuration.processors.JarProcessorManager; | ||||||
|  | @ -80,6 +81,9 @@ public class LoomGradleExtension { | ||||||
| 	private Mercury[] srcMercuryCache = new Mercury[2]; | 	private Mercury[] srcMercuryCache = new Mercury[2]; | ||||||
| 	private Set<File> mixinMappings = Collections.synchronizedSet(new HashSet<>()); | 	private Set<File> mixinMappings = Collections.synchronizedSet(new HashSet<>()); | ||||||
| 
 | 
 | ||||||
|  | 	@ApiStatus.Internal | ||||||
|  | 	private final LoomProjectData projectData; | ||||||
|  | 
 | ||||||
| 	private NamedDomainObjectContainer<RunConfigSettings> runConfigs; | 	private NamedDomainObjectContainer<RunConfigSettings> runConfigs; | ||||||
| 
 | 
 | ||||||
| 	/** | 	/** | ||||||
|  | @ -119,6 +123,7 @@ public class LoomGradleExtension { | ||||||
| 		this.runConfigs = project.container(RunConfigSettings.class, | 		this.runConfigs = project.container(RunConfigSettings.class, | ||||||
| 				baseName -> new RunConfigSettings(project, baseName)); | 				baseName -> new RunConfigSettings(project, baseName)); | ||||||
| 		this.log4jConfigs = project.files(getDefaultLog4jConfigFile()); | 		this.log4jConfigs = project.files(getDefaultLog4jConfigFile()); | ||||||
|  | 		projectData = new LoomProjectData(project); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	/** | 	/** | ||||||
|  | @ -371,4 +376,9 @@ public class LoomGradleExtension { | ||||||
| 	public NamedDomainObjectContainer<RunConfigSettings> getRunConfigs() { | 	public NamedDomainObjectContainer<RunConfigSettings> getRunConfigs() { | ||||||
| 		return runConfigs; | 		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.LoomGradleExtension; | ||||||
| import net.fabricmc.loom.LoomGradlePlugin; | import net.fabricmc.loom.LoomGradlePlugin; | ||||||
|  | import net.fabricmc.loom.configuration.LoomProjectData; | ||||||
| import net.fabricmc.loom.configuration.RemappedConfigurationEntry; | import net.fabricmc.loom.configuration.RemappedConfigurationEntry; | ||||||
| import net.fabricmc.loom.configuration.mods.ModProcessor; | import net.fabricmc.loom.configuration.mods.ModProcessor; | ||||||
| import net.fabricmc.loom.configuration.processors.dependency.ModDependencyInfo; | import net.fabricmc.loom.configuration.processors.dependency.ModDependencyInfo; | ||||||
|  | @ -64,60 +65,63 @@ public class ModCompileRemapper { | ||||||
| 		final File modStore = extension.getRemappedModCache(); | 		final File modStore = extension.getRemappedModCache(); | ||||||
| 		final RemapData remapData = new RemapData(mappingsSuffix, modStore); | 		final RemapData remapData = new RemapData(mappingsSuffix, modStore); | ||||||
| 
 | 
 | ||||||
|  | 		final LoomProjectData data = extension.getProjectData(); | ||||||
|  | 
 | ||||||
| 		for (RemappedConfigurationEntry entry : Constants.MOD_COMPILE_ENTRIES) { | 		for (RemappedConfigurationEntry entry : Constants.MOD_COMPILE_ENTRIES) { | ||||||
| 			Configuration sourceConfig = project.getConfigurations().getByName(entry.getSourceConfiguration()); | 			data.getLazyConfigurationProvider(entry.getRemappedConfiguration()).configure(remappedConfig -> { | ||||||
| 			Configuration remappedConfig = project.getConfigurations().getByName(entry.getRemappedConfiguration()); | 				Configuration sourceConfig = project.getConfigurations().getByName(entry.getSourceConfiguration()); | ||||||
| 			Configuration regularConfig = project.getConfigurations().getByName(entry.getTargetConfiguration(project.getConfigurations())); | 				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()) { | 				for (ResolvedArtifact artifact : sourceConfig.getResolvedConfiguration().getResolvedArtifacts()) { | ||||||
| 				// TODO: This collection doesn't appear to include FileCollection dependencies | 					// TODO: This collection doesn't appear to include FileCollection dependencies | ||||||
| 				// Might have to go based on the dependencies, rather than their resolved form? | 					// Might have to go based on the dependencies, rather than their resolved form? | ||||||
| 				// File dependencies use SelfResolvingDependency, which appears to be handled differently | 					// File dependencies use SelfResolvingDependency, which appears to be handled differently | ||||||
| 				String group = artifact.getModuleVersion().getId().getGroup(); | 					String group = artifact.getModuleVersion().getId().getGroup(); | ||||||
| 				String name = artifact.getModuleVersion().getId().getName(); | 					String name = artifact.getModuleVersion().getId().getName(); | ||||||
| 				String version = artifact.getModuleVersion().getId().getVersion(); | 					String version = artifact.getModuleVersion().getId().getVersion(); | ||||||
| 
 | 
 | ||||||
| 				if (!isFabricMod(logger, artifact)) { | 					if (!isFabricMod(logger, artifact)) { | ||||||
| 					addToRegularCompile(project, regularConfig, artifact); | 						addToRegularCompile(project, regularConfig, artifact); | ||||||
| 					continue; | 						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) { | 					if (refreshDeps) { | ||||||
| 					info.forceRemap(); | 						info.forceRemap(); | ||||||
| 				} | 					} | ||||||
| 
 | 
 | ||||||
| 				modDependencies.add(info); | 					modDependencies.add(info); | ||||||
| 
 | 
 | ||||||
| 				String remappedLog = group + ":" + name + ":" + version + (artifact.getClassifier() == null ? "" : ":" + artifact.getClassifier()) + " (" + mappingsSuffix + ")"; | 					String remappedLog = group + ":" + name + ":" + version + (artifact.getClassifier() == null ? "" : ":" + artifact.getClassifier()) + " (" + mappingsSuffix + ")"; | ||||||
| 				project.getLogger().info(":providing " + remappedLog); | 					project.getLogger().info(":providing " + remappedLog); | ||||||
| 
 | 
 | ||||||
| 				File remappedSources = info.getRemappedOutput("sources"); | 					File remappedSources = info.getRemappedOutput("sources"); | ||||||
| 
 | 
 | ||||||
| 				if ((!remappedSources.exists() || refreshDeps) && !OperatingSystem.isCIBuild()) { | 					if ((!remappedSources.exists() || refreshDeps) && !OperatingSystem.isCIBuild()) { | ||||||
| 					File sources = findSources(dependencies, artifact); | 						File sources = findSources(dependencies, artifact); | ||||||
| 
 | 
 | ||||||
| 					if (sources != null) { | 						if (sources != null) { | ||||||
| 						scheduleSourcesRemapping(project, sourceRemapper, sources, info.getRemappedNotation(), remappedSources); | 							scheduleSourcesRemapping(project, sourceRemapper, sources, info.getRemappedNotation(), remappedSources); | ||||||
|  | 						} | ||||||
| 					} | 					} | ||||||
| 				} | 				} | ||||||
| 			} |  | ||||||
| 
 | 
 | ||||||
| 			try { | 				try { | ||||||
| 				ModProcessor.processMods(project, modDependencies); | 					ModProcessor.processMods(project, modDependencies); | ||||||
| 			} catch (IOException e) { | 				} catch (IOException e) { | ||||||
| 				// Failed to remap, lets clean up to ensure we try again next time | 					// Failed to remap, lets clean up to ensure we try again next time | ||||||
| 				modDependencies.forEach(info -> info.getRemappedOutput().delete()); | 					modDependencies.forEach(info -> info.getRemappedOutput().delete()); | ||||||
| 				throw new RuntimeException("Failed to remap mods", e); | 					throw new RuntimeException("Failed to remap mods", e); | ||||||
| 			} | 				} | ||||||
| 
 | 
 | ||||||
| 			// Add all of the remapped mods onto the config | 				// Add all of the remapped mods onto the config | ||||||
| 			for (ModDependencyInfo info : modDependencies) { | 				for (ModDependencyInfo info : modDependencies) { | ||||||
| 				project.getDependencies().add(info.targetConfig.getName(), info.getRemappedNotation()); | 					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.LOOM_DEVELOPMENT_DEPENDENCIES); | ||||||
| 		project.getConfigurations().maybeCreate(Constants.Configurations.UNPICK_CLASSPATH); | 		project.getConfigurations().maybeCreate(Constants.Configurations.UNPICK_CLASSPATH); | ||||||
| 
 | 
 | ||||||
|  | 		LoomProjectData data = project.getExtensions().getByType(LoomGradleExtension.class).getProjectData(); | ||||||
|  | 
 | ||||||
| 		for (RemappedConfigurationEntry entry : Constants.MOD_COMPILE_ENTRIES) { | 		for (RemappedConfigurationEntry entry : Constants.MOD_COMPILE_ENTRIES) { | ||||||
| 			Configuration compileModsConfig = project.getConfigurations().maybeCreate(entry.getSourceConfiguration()); | 			data.createLazyConfiguration(entry.getSourceConfiguration()) | ||||||
| 			compileModsConfig.setTransitive(true); | 					.configure(configuration -> configuration.setTransitive(true)); | ||||||
| 			Configuration compileModsMappedConfig = project.getConfigurations().maybeCreate(entry.getRemappedConfiguration()); | 
 | ||||||
| 			compileModsMappedConfig.setTransitive(false); // Don't get transitive deps of already remapped mods | 			// 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); | 			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