Merge branch 'pull/110' into dev/0.2.5
# Conflicts: # gradle/wrapper/gradle-wrapper.properties # src/main/java/net/fabricmc/loom/util/MixinRefmapHelper.java
This commit is contained in:
		
						commit
						3e4ade38a7
					
				
					 13 changed files with 479 additions and 63 deletions
				
			
		
							
								
								
									
										2
									
								
								Jenkinsfile
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								Jenkinsfile
									
									
									
									
										vendored
									
									
								
							|  | @ -7,7 +7,7 @@ node { | ||||||
| 
 | 
 | ||||||
|    sh "rm -rf build/libs/" |    sh "rm -rf build/libs/" | ||||||
|    sh "chmod +x gradlew" |    sh "chmod +x gradlew" | ||||||
|    sh "./gradlew build --refresh-dependencies" |    sh "./gradlew build -x test --refresh-dependencies" | ||||||
| 
 | 
 | ||||||
|    stage "Archive artifacts" |    stage "Archive artifacts" | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -4,6 +4,7 @@ plugins { | ||||||
| 	id 'java-gradle-plugin' | 	id 'java-gradle-plugin' | ||||||
| 	id 'idea' | 	id 'idea' | ||||||
| 	id 'eclipse' | 	id 'eclipse' | ||||||
|  | 	id 'groovy' | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| sourceCompatibility = 1.8 | sourceCompatibility = 1.8 | ||||||
|  | @ -54,6 +55,9 @@ dependencies { | ||||||
| 	// source code remapping | 	// source code remapping | ||||||
| 	implementation ('org.cadixdev:mercury:0.1.0.fabric-SNAPSHOT') | 	implementation ('org.cadixdev:mercury:0.1.0.fabric-SNAPSHOT') | ||||||
| 
 | 
 | ||||||
|  | 	// Testing | ||||||
|  | 	testImplementation(gradleTestKit()) | ||||||
|  | 	testImplementation("org.spockframework:spock-core:1.3-groovy-2.5") | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| jar { | jar { | ||||||
|  |  | ||||||
							
								
								
									
										
											BIN
										
									
								
								gradle/wrapper/gradle-wrapper.jar
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								gradle/wrapper/gradle-wrapper.jar
									
									
									
									
										vendored
									
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										2
									
								
								gradlew
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								gradlew
									
									
									
									
										vendored
									
									
								
							|  | @ -28,7 +28,7 @@ APP_NAME="Gradle" | ||||||
| APP_BASE_NAME=`basename "$0"` | APP_BASE_NAME=`basename "$0"` | ||||||
| 
 | 
 | ||||||
| # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. | ||||||
| DEFAULT_JVM_OPTS="" | DEFAULT_JVM_OPTS='"-Xmx64m"' | ||||||
| 
 | 
 | ||||||
| # Use the maximum available, or set MAX_FD != -1 to use that value. | # Use the maximum available, or set MAX_FD != -1 to use that value. | ||||||
| MAX_FD="maximum" | MAX_FD="maximum" | ||||||
|  |  | ||||||
							
								
								
									
										2
									
								
								gradlew.bat
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								gradlew.bat
									
									
									
									
										vendored
									
									
								
							|  | @ -14,7 +14,7 @@ set APP_BASE_NAME=%~n0 | ||||||
| set APP_HOME=%DIRNAME% | set APP_HOME=%DIRNAME% | ||||||
| 
 | 
 | ||||||
| @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. | ||||||
| set DEFAULT_JVM_OPTS= | set DEFAULT_JVM_OPTS="-Xmx64m" | ||||||
| 
 | 
 | ||||||
| @rem Find java.exe | @rem Find java.exe | ||||||
| if defined JAVA_HOME goto findJavaFromJavaHome | if defined JAVA_HOME goto findJavaFromJavaHome | ||||||
|  |  | ||||||
|  | @ -31,7 +31,10 @@ import net.fabricmc.loom.providers.MinecraftProvider; | ||||||
| import net.fabricmc.loom.task.RemapJarTask; | import net.fabricmc.loom.task.RemapJarTask; | ||||||
| import net.fabricmc.loom.task.RemapSourcesJarTask; | import net.fabricmc.loom.task.RemapSourcesJarTask; | ||||||
| import net.fabricmc.loom.util.*; | import net.fabricmc.loom.util.*; | ||||||
| import org.gradle.api.*; | import org.gradle.api.Plugin; | ||||||
|  | import org.gradle.api.Project; | ||||||
|  | import org.gradle.api.Task; | ||||||
|  | import org.gradle.api.UnknownTaskException; | ||||||
| import org.gradle.api.artifacts.Configuration; | import org.gradle.api.artifacts.Configuration; | ||||||
| import org.gradle.api.artifacts.Dependency; | import org.gradle.api.artifacts.Dependency; | ||||||
| import org.gradle.api.artifacts.component.ModuleComponentIdentifier; | import org.gradle.api.artifacts.component.ModuleComponentIdentifier; | ||||||
|  | @ -61,6 +64,10 @@ import java.util.function.Predicate; | ||||||
| public class AbstractPlugin implements Plugin<Project> { | public class AbstractPlugin implements Plugin<Project> { | ||||||
| 	protected Project project; | 	protected Project project; | ||||||
| 
 | 
 | ||||||
|  | 	public static boolean isRootProject(Project project) { | ||||||
|  | 		return project.getRootProject() == project; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	private void extendsFrom(String a, String b) { | 	private void extendsFrom(String a, String b) { | ||||||
| 		project.getConfigurations().getByName(a).extendsFrom(project.getConfigurations().getByName(b)); | 		project.getConfigurations().getByName(a).extendsFrom(project.getConfigurations().getByName(b)); | ||||||
| 	} | 	} | ||||||
|  | @ -302,15 +309,15 @@ public class AbstractPlugin implements Plugin<Project> { | ||||||
| 				AbstractArchiveTask jarTask = (AbstractArchiveTask) project1.getTasks().getByName("jar"); | 				AbstractArchiveTask jarTask = (AbstractArchiveTask) project1.getTasks().getByName("jar"); | ||||||
| 				RemapJarTask remapJarTask = (RemapJarTask) project1.getTasks().findByName("remapJar"); | 				RemapJarTask remapJarTask = (RemapJarTask) project1.getTasks().findByName("remapJar"); | ||||||
| 
 | 
 | ||||||
| 				if (remapJarTask.getInput() == null) { | 				assert remapJarTask != null; | ||||||
| 					remapJarTask.setOutput(jarTask.getArchivePath()); | 				if (!remapJarTask.getInput().isPresent()) { | ||||||
| 					jarTask.setClassifier("dev"); | 					remapJarTask.getArchiveClassifier().set("remapped"); | ||||||
| 					remapJarTask.setInput(jarTask.getArchivePath()); | 					remapJarTask.getInput().set(jarTask.getArchiveFile()); | ||||||
| 				} | 				} | ||||||
| 
 | 
 | ||||||
| 				remapJarTask.setAddNestedDependencies(true); | 				remapJarTask.getAddNestedDependencies().set(true); | ||||||
| 
 | 
 | ||||||
| 				remapJarTask.doLast(task -> project1.getArtifacts().add("archives", remapJarTask.getOutput())); | 				remapJarTask.doLast(task -> project1.getArtifacts().add("archives", remapJarTask.getArchiveFile())); | ||||||
| 				remapJarTask.dependsOn(project1.getTasks().getByName("jar")); | 				remapJarTask.dependsOn(project1.getTasks().getByName("jar")); | ||||||
| 				project1.getTasks().getByName("build").dependsOn(remapJarTask); | 				project1.getTasks().getByName("build").dependsOn(remapJarTask); | ||||||
| 
 | 
 | ||||||
|  | @ -318,7 +325,7 @@ public class AbstractPlugin implements Plugin<Project> { | ||||||
| 				for (Map.Entry<Project, Set<Task>> entry : taskMap.entrySet()) { | 				for (Map.Entry<Project, Set<Task>> entry : taskMap.entrySet()) { | ||||||
| 					Set<Task> taskSet = entry.getValue(); | 					Set<Task> taskSet = entry.getValue(); | ||||||
| 					for (Task task : taskSet) { | 					for (Task task : taskSet) { | ||||||
| 						if (task instanceof RemapJarTask && ((RemapJarTask) task).isAddNestedDependencies()) { | 						if (task instanceof RemapJarTask && ((RemapJarTask) task).getAddNestedDependencies().get()) { | ||||||
| 							//Run all the sub project remap jars tasks before the root projects jar, this is to allow us to include projects | 							//Run all the sub project remap jars tasks before the root projects jar, this is to allow us to include projects | ||||||
| 							NestedJars.getRequiredTasks(project1).forEach(task::dependsOn); | 							NestedJars.getRequiredTasks(project1).forEach(task::dependsOn); | ||||||
| 						} | 						} | ||||||
|  | @ -394,8 +401,4 @@ public class AbstractPlugin implements Plugin<Project> { | ||||||
| 			} | 			} | ||||||
| 		}); | 		}); | ||||||
| 	} | 	} | ||||||
| 
 |  | ||||||
| 	public static boolean isRootProject(Project project){ |  | ||||||
| 		return project.getRootProject() == project; |  | ||||||
| 	} |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -26,7 +26,6 @@ package net.fabricmc.loom.task; | ||||||
| 
 | 
 | ||||||
| import net.fabricmc.loom.LoomGradleExtension; | import net.fabricmc.loom.LoomGradleExtension; | ||||||
| import net.fabricmc.loom.providers.MappingsProvider; | import net.fabricmc.loom.providers.MappingsProvider; | ||||||
| import net.fabricmc.loom.util.Constants; |  | ||||||
| import net.fabricmc.loom.util.MixinRefmapHelper; | import net.fabricmc.loom.util.MixinRefmapHelper; | ||||||
| import net.fabricmc.loom.util.NestedJars; | import net.fabricmc.loom.util.NestedJars; | ||||||
| import net.fabricmc.loom.util.TinyRemapperMappingsHelper; | import net.fabricmc.loom.util.TinyRemapperMappingsHelper; | ||||||
|  | @ -34,29 +33,36 @@ import net.fabricmc.tinyremapper.OutputConsumerPath; | ||||||
| import net.fabricmc.tinyremapper.TinyRemapper; | import net.fabricmc.tinyremapper.TinyRemapper; | ||||||
| import net.fabricmc.tinyremapper.TinyUtils; | import net.fabricmc.tinyremapper.TinyUtils; | ||||||
| import org.gradle.api.Project; | import org.gradle.api.Project; | ||||||
|  | import org.gradle.api.file.RegularFileProperty; | ||||||
|  | import org.gradle.api.provider.Property; | ||||||
| import org.gradle.api.tasks.Input; | import org.gradle.api.tasks.Input; | ||||||
| import org.gradle.api.tasks.InputFile; | import org.gradle.api.tasks.InputFile; | ||||||
| import org.gradle.api.tasks.OutputFile; |  | ||||||
| import org.gradle.api.tasks.TaskAction; | import org.gradle.api.tasks.TaskAction; | ||||||
|  | import org.gradle.jvm.tasks.Jar; | ||||||
| 
 | 
 | ||||||
| import java.io.File; | import java.io.File; | ||||||
| import java.io.FileNotFoundException; | import java.io.FileNotFoundException; | ||||||
| import java.io.IOException; |  | ||||||
| import java.nio.file.Files; | import java.nio.file.Files; | ||||||
| import java.nio.file.Path; | import java.nio.file.Path; | ||||||
| import java.util.*; | import java.util.LinkedHashSet; | ||||||
|  | import java.util.Set; | ||||||
| 
 | 
 | ||||||
| public class RemapJarTask extends AbstractLoomTask { | public class RemapJarTask extends Jar { | ||||||
| 	private Object input; | 	private RegularFileProperty input; | ||||||
| 	private Object output; | 	private Property<Boolean> addNestedDependencies; | ||||||
| 	private boolean addNestedDependencies; | 
 | ||||||
|  | 	public RemapJarTask() { | ||||||
|  | 		super(); | ||||||
|  | 		input = getProject().getObjects().fileProperty(); | ||||||
|  | 		addNestedDependencies = getProject().getObjects().property(Boolean.class); | ||||||
|  | 	} | ||||||
| 
 | 
 | ||||||
| 	@TaskAction | 	@TaskAction | ||||||
| 	public void doTask() throws Throwable { | 	public void doTask() throws Throwable { | ||||||
| 		Project project = getProject(); | 		Project project = getProject(); | ||||||
| 		LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class); | 		LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class); | ||||||
| 		Path input = getInput().toPath(); | 		Path input = this.getInput().getAsFile().get().toPath(); | ||||||
| 		Path output = getOutput().toPath(); | 		Path output = this.getArchiveFile().get().getAsFile().toPath(); | ||||||
| 
 | 
 | ||||||
| 		if (!Files.exists(input)) { | 		if (!Files.exists(input)) { | ||||||
| 			throw new FileNotFoundException(input.toString()); | 			throw new FileNotFoundException(input.toString()); | ||||||
|  | @ -67,9 +73,9 @@ public class RemapJarTask extends AbstractLoomTask { | ||||||
| 		String fromM = "named"; | 		String fromM = "named"; | ||||||
| 		String toM = "intermediary"; | 		String toM = "intermediary"; | ||||||
| 
 | 
 | ||||||
| 		Set<File> classpathFiles = new LinkedHashSet<>(); | 		Set<File> classpathFiles = new LinkedHashSet<>( | ||||||
| 		//noinspection CollectionAddAllCanBeReplacedWithConstructor | 				project.getConfigurations().getByName("compileClasspath").getFiles() | ||||||
| 		classpathFiles.addAll(project.getConfigurations().getByName("compileClasspath").getFiles()); | 		); | ||||||
| 		Path[] classpath = classpathFiles.stream().map(File::toPath).filter((p) -> !input.equals(p)).toArray(Path[]::new); | 		Path[] classpath = classpathFiles.stream().map(File::toPath).filter((p) -> !input.equals(p)).toArray(Path[]::new); | ||||||
| 
 | 
 | ||||||
| 		File mixinMapFile = mappingsProvider.MAPPINGS_MIXIN_EXPORT; | 		File mixinMapFile = mappingsProvider.MAPPINGS_MIXIN_EXPORT; | ||||||
|  | @ -111,7 +117,7 @@ public class RemapJarTask extends AbstractLoomTask { | ||||||
| 			project.getLogger().debug("Transformed mixin reference maps in output JAR!"); | 			project.getLogger().debug("Transformed mixin reference maps in output JAR!"); | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		if (addNestedDependencies) { | 		if (getAddNestedDependencies().get()) { | ||||||
| 			if (NestedJars.addNestedJars(project, output)) { | 			if (NestedJars.addNestedJars(project, output)) { | ||||||
| 				project.getLogger().debug("Added nested jar paths to mod json"); | 				project.getLogger().debug("Added nested jar paths to mod json"); | ||||||
| 			} | 			} | ||||||
|  | @ -119,10 +125,7 @@ public class RemapJarTask extends AbstractLoomTask { | ||||||
| 
 | 
 | ||||||
| 		extension.addUnmappedMod(input); | 		extension.addUnmappedMod(input); | ||||||
| 
 | 
 | ||||||
| 		/** | 		/*try { | ||||||
| 		 * |  | ||||||
| 
 |  | ||||||
| 		 try { |  | ||||||
| 			if (modJar.exists()) { | 			if (modJar.exists()) { | ||||||
| 				Files.move(modJar, modJarUnmappedCopy); | 				Files.move(modJar, modJarUnmappedCopy); | ||||||
| 				extension.addUnmappedMod(modJarUnmappedCopy); | 				extension.addUnmappedMod(modJarUnmappedCopy); | ||||||
|  | @ -131,17 +134,16 @@ public class RemapJarTask extends AbstractLoomTask { | ||||||
| 			Files.move(modJarOutput, modJar); | 			Files.move(modJarOutput, modJar); | ||||||
| 		} catch (IOException e) { | 		} catch (IOException e) { | ||||||
| 			throw new RuntimeException(e); | 			throw new RuntimeException(e); | ||||||
| 		 } | 		}*/ | ||||||
| 		 */ |  | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	//@formatter:off | 	@InputFile | ||||||
| 	// the null-check in getInput() is done to allow reconfiguration by AbstractPlugin | 	public RegularFileProperty getInput() { | ||||||
| 	@InputFile public File getInput() { return input == null ? null : getProject().file(input); } | 		return input; | ||||||
| 	@OutputFile public File getOutput() { return getProject().file(output); } | 	} | ||||||
| 	@Input public boolean isAddNestedDependencies() { return addNestedDependencies; } | 
 | ||||||
| 	public void setAddNestedDependencies(boolean value) { this.addNestedDependencies = value; } | 	@Input | ||||||
| 	public void setInput(Object input) { this.input = input; } | 	public Property<Boolean> getAddNestedDependencies() { | ||||||
| 	public void setOutput(Object output) { this.output = output; } | 		return addNestedDependencies; | ||||||
| 	//@formatter:on | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -26,7 +26,6 @@ package net.fabricmc.loom.util; | ||||||
| 
 | 
 | ||||||
| import com.google.gson.Gson; | import com.google.gson.Gson; | ||||||
| import com.google.gson.GsonBuilder; | import com.google.gson.GsonBuilder; | ||||||
| import com.google.gson.JsonElement; |  | ||||||
| import com.google.gson.JsonObject; | import com.google.gson.JsonObject; | ||||||
| import net.fabricmc.tinyremapper.TinyRemapper; | import net.fabricmc.tinyremapper.TinyRemapper; | ||||||
| import org.objectweb.asm.commons.Remapper; | import org.objectweb.asm.commons.Remapper; | ||||||
|  | @ -37,10 +36,8 @@ import org.zeroturnaround.zip.transform.ZipEntryTransformerEntry; | ||||||
| import java.io.File; | import java.io.File; | ||||||
| import java.io.IOException; | import java.io.IOException; | ||||||
| import java.io.InputStreamReader; | import java.io.InputStreamReader; | ||||||
| import java.lang.reflect.Field; |  | ||||||
| import java.nio.file.Path; | import java.nio.file.Path; | ||||||
| import java.util.HashSet; | import java.util.HashSet; | ||||||
| import java.util.Map; |  | ||||||
| import java.util.Set; | import java.util.Set; | ||||||
| import java.util.zip.ZipEntry; | import java.util.zip.ZipEntry; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -28,8 +28,10 @@ import com.google.gson.Gson; | ||||||
| import com.google.gson.GsonBuilder; | import com.google.gson.GsonBuilder; | ||||||
| import com.google.gson.JsonArray; | import com.google.gson.JsonArray; | ||||||
| import com.google.gson.JsonObject; | import com.google.gson.JsonObject; | ||||||
|  | 
 | ||||||
| import net.fabricmc.loom.LoomGradleExtension; | import net.fabricmc.loom.LoomGradleExtension; | ||||||
| import net.fabricmc.loom.task.RemapJarTask; | import net.fabricmc.loom.task.RemapJarTask; | ||||||
|  | 
 | ||||||
| import org.apache.commons.io.FileUtils; | import org.apache.commons.io.FileUtils; | ||||||
| import org.gradle.api.Project; | import org.gradle.api.Project; | ||||||
| import org.gradle.api.Task; | import org.gradle.api.Task; | ||||||
|  | @ -47,7 +49,11 @@ import org.zeroturnaround.zip.transform.ZipEntryTransformerEntry; | ||||||
| import java.io.File; | import java.io.File; | ||||||
| import java.io.IOException; | import java.io.IOException; | ||||||
| import java.nio.file.Path; | import java.nio.file.Path; | ||||||
| import java.util.*; | import java.util.ArrayList; | ||||||
|  | import java.util.Collection; | ||||||
|  | import java.util.List; | ||||||
|  | import java.util.Locale; | ||||||
|  | import java.util.Set; | ||||||
| import java.util.zip.ZipEntry; | import java.util.zip.ZipEntry; | ||||||
| 
 | 
 | ||||||
| public class NestedJars { | public class NestedJars { | ||||||
|  | @ -101,7 +107,7 @@ public class NestedJars { | ||||||
| 
 | 
 | ||||||
| 				for (Task task : remapJarTasks.isEmpty() ? jarTasks : remapJarTasks) { | 				for (Task task : remapJarTasks.isEmpty() ? jarTasks : remapJarTasks) { | ||||||
| 					if (task instanceof RemapJarTask) { | 					if (task instanceof RemapJarTask) { | ||||||
| 						fileList.add(((RemapJarTask) task).getOutput()); | 						fileList.add(((RemapJarTask) task).getArchiveFile().get().getAsFile()); | ||||||
| 					} else if (task instanceof AbstractArchiveTask) { | 					} else if (task instanceof AbstractArchiveTask) { | ||||||
| 						fileList.add(((AbstractArchiveTask) task).getArchivePath()); | 						fileList.add(((AbstractArchiveTask) task).getArchivePath()); | ||||||
| 					} | 					} | ||||||
|  |  | ||||||
							
								
								
									
										213
									
								
								src/test/groovy/net/fabricmc/loom/BuildUtils.groovy
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										213
									
								
								src/test/groovy/net/fabricmc/loom/BuildUtils.groovy
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,213 @@ | ||||||
|  | package net.fabricmc.loom | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Created by Mitchell Skaggs on 6/12/2019. | ||||||
|  |  */ | ||||||
|  | static String genBuildFile() { | ||||||
|  | 	""" | ||||||
|  | plugins { | ||||||
|  | 	id 'fabric-loom' | ||||||
|  | 	id 'maven-publish' | ||||||
|  | } | ||||||
|  | sourceCompatibility = JavaVersion.VERSION_1_8 | ||||||
|  | targetCompatibility = JavaVersion.VERSION_1_8 | ||||||
|  | 
 | ||||||
|  | archivesBaseName = project.archives_base_name | ||||||
|  | version = project.mod_version | ||||||
|  | group = project.maven_group | ||||||
|  | 
 | ||||||
|  | minecraft { | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | dependencies { | ||||||
|  | 	//to change the versions see the gradle.properties file | ||||||
|  | 	minecraft "com.mojang:minecraft:\${project.minecraft_version}" | ||||||
|  | 	mappings "net.fabricmc:yarn:\${project.yarn_mappings}" | ||||||
|  | 	modCompile "net.fabricmc:fabric-loader:\${project.loader_version}" | ||||||
|  | 
 | ||||||
|  | 	// Fabric API. This is technically optional, but you probably want it anyway. | ||||||
|  | 	modCompile "net.fabricmc.fabric-api:fabric-api:\${project.fabric_version}" | ||||||
|  | 
 | ||||||
|  | 	// PSA: Some older mods, compiled on Loom 0.2.1, might have outdated Maven POMs. | ||||||
|  | 	// You may need to force-disable transitiveness on them. | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | processResources { | ||||||
|  | 	inputs.property "version", project.version | ||||||
|  | 
 | ||||||
|  | 	from(sourceSets.main.resources.srcDirs) { | ||||||
|  | 		include "fabric.mod.json" | ||||||
|  | 		expand "version": project.version | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	from(sourceSets.main.resources.srcDirs) { | ||||||
|  | 		exclude "fabric.mod.json" | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ensure that the encoding is set to UTF-8, no matter what the system default is | ||||||
|  | // this fixes some edge cases with special characters not displaying correctly | ||||||
|  | // see http://yodaconditions.net/blog/fix-for-java-file-encoding-problems-with-gradle.html | ||||||
|  | tasks.withType(JavaCompile) { | ||||||
|  | 	options.encoding = "UTF-8" | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task | ||||||
|  | // if it is present. | ||||||
|  | // If you remove this task, sources will not be generated. | ||||||
|  | task sourcesJar(type: Jar, dependsOn: classes) { | ||||||
|  | 	classifier = "sources" | ||||||
|  | 	from sourceSets.main.allSource | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | jar { | ||||||
|  | 	from "LICENSE" | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // configure the maven publication | ||||||
|  | publishing { | ||||||
|  | 	publications { | ||||||
|  | 		mavenJava(MavenPublication) { | ||||||
|  | 			// add all the jars that should be included when publishing to maven | ||||||
|  | 			artifact(jar) { | ||||||
|  | 				builtBy remapJar | ||||||
|  | 			} | ||||||
|  | 			artifact(sourcesJar) { | ||||||
|  | 				builtBy remapSourcesJar | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// select the repositories you want to publish to | ||||||
|  | 	repositories { | ||||||
|  | 		// uncomment to publish to the local maven | ||||||
|  | 		// mavenLocal() | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | """ | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static String genPropsFile(String mcVersion, String yarnVersion, String loaderVersion, String fabricVersion, boolean caching = true, boolean parallel = true) { | ||||||
|  | 	""" | ||||||
|  | org.gradle.caching=$caching | ||||||
|  | org.gradle.parallel=$parallel | ||||||
|  | 
 | ||||||
|  | # Fabric Properties | ||||||
|  | # check these on https://fabricmc.net/use | ||||||
|  | minecraft_version=$mcVersion | ||||||
|  | yarn_mappings=$yarnVersion | ||||||
|  | loader_version=$loaderVersion | ||||||
|  | 
 | ||||||
|  | # Mod Properties | ||||||
|  | mod_version = 1.0.0 | ||||||
|  | maven_group = net.fabricmc | ||||||
|  | archives_base_name = fabric-example-mod | ||||||
|  | 
 | ||||||
|  | # Dependencies | ||||||
|  | # currently not on the main fabric site, check on the maven: https://maven.fabricmc.net/net/fabricmc/fabric | ||||||
|  | fabric_version=$fabricVersion | ||||||
|  | """ | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static String genSettingsFile(String name) { | ||||||
|  | 	""" | ||||||
|  | rootProject.name = '$name' | ||||||
|  | """ | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static String genModJsonFile() { | ||||||
|  | 	""" | ||||||
|  | { | ||||||
|  |   "schemaVersion": 1, | ||||||
|  |   "id": "modid", | ||||||
|  |   "version": "\${version}", | ||||||
|  | 
 | ||||||
|  |   "name": "Example Mod", | ||||||
|  |   "description": "This is an example description! Tell everyone what your mod is about!", | ||||||
|  |   "authors": [ | ||||||
|  |     "Me!" | ||||||
|  |   ], | ||||||
|  |   "contact": { | ||||||
|  |     "homepage": "https://fabricmc.net/", | ||||||
|  |     "sources": "https://github.com/FabricMC/fabric-example-mod" | ||||||
|  |   }, | ||||||
|  | 
 | ||||||
|  |   "license": "CC0-1.0", | ||||||
|  | 
 | ||||||
|  |   "environment": "*", | ||||||
|  |   "entrypoints": { | ||||||
|  |     "main": [ | ||||||
|  |       "net.fabricmc.example.ExampleMod" | ||||||
|  |     ] | ||||||
|  |   }, | ||||||
|  |   "mixins": [ | ||||||
|  |     "modid.mixins.json" | ||||||
|  |   ], | ||||||
|  | 
 | ||||||
|  |   "depends": { | ||||||
|  |     "fabricloader": ">=0.4.0", | ||||||
|  |     "fabric": "*" | ||||||
|  |   }, | ||||||
|  |   "suggests": { | ||||||
|  |     "flamingo": "*" | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | """ | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static String genModJavaFile() { | ||||||
|  | 	""" | ||||||
|  | package net.fabricmc.example; | ||||||
|  | 
 | ||||||
|  | import net.fabricmc.api.ModInitializer; | ||||||
|  | 
 | ||||||
|  | public class ExampleMod implements ModInitializer { | ||||||
|  | 	@Override | ||||||
|  | 	public void onInitialize() { | ||||||
|  | 		// This code runs as soon as Minecraft is in a mod-load-ready state. | ||||||
|  | 		// However, some things (like resources) may still be uninitialized. | ||||||
|  | 		// Proceed with mild caution. | ||||||
|  | 
 | ||||||
|  | 		System.out.println("Hello Fabric world!"); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | """ | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static String genModMixinsJsonFile() { | ||||||
|  | 	""" | ||||||
|  | { | ||||||
|  |   "required": true, | ||||||
|  |   "package": "net.fabricmc.example.mixin", | ||||||
|  |   "compatibilityLevel": "JAVA_8", | ||||||
|  |   "mixins": [ | ||||||
|  |   ], | ||||||
|  |   "client": [ | ||||||
|  |     "ExampleMixin" | ||||||
|  |   ], | ||||||
|  |   "injectors": { | ||||||
|  |     "defaultRequire": 1 | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | """ | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static String genModMixinsJavaFile() { | ||||||
|  | 	""" | ||||||
|  | package net.fabricmc.example.mixin; | ||||||
|  | 
 | ||||||
|  | import net.minecraft.client.MinecraftClient; | ||||||
|  | import org.spongepowered.asm.mixin.Mixin; | ||||||
|  | import org.spongepowered.asm.mixin.injection.At; | ||||||
|  | import org.spongepowered.asm.mixin.injection.Inject; | ||||||
|  | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; | ||||||
|  | 
 | ||||||
|  | @Mixin(MinecraftClient.class) | ||||||
|  | public class ExampleMixin { | ||||||
|  | 	@Inject(at = @At("HEAD"), method = "init()V") | ||||||
|  | 	private void init(CallbackInfo info) { | ||||||
|  | 		System.out.println("This line is printed by an example mod mixin!"); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | """ | ||||||
|  | } | ||||||
|  | @ -0,0 +1,52 @@ | ||||||
|  | package net.fabricmc.loom | ||||||
|  | 
 | ||||||
|  | import org.gradle.testkit.runner.GradleRunner | ||||||
|  | import org.junit.Rule | ||||||
|  | import org.junit.rules.TemporaryFolder | ||||||
|  | import spock.lang.Specification | ||||||
|  | import spock.lang.Unroll | ||||||
|  | 
 | ||||||
|  | import static net.fabricmc.loom.BuildUtils.* | ||||||
|  | import static org.gradle.testkit.runner.TaskOutcome.SUCCESS | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Created by Mitchell Skaggs on 6/10/2019. | ||||||
|  |  */ | ||||||
|  | class EmptyBuildFunctionalTest extends Specification { | ||||||
|  | 	@Rule | ||||||
|  | 	TemporaryFolder testProjectDir = new TemporaryFolder() | ||||||
|  | 	File settingsFile | ||||||
|  | 	File buildFile | ||||||
|  | 	File propsFile | ||||||
|  | 
 | ||||||
|  | 	def setup() { | ||||||
|  | 		settingsFile = testProjectDir.newFile('settings.gradle') | ||||||
|  | 		buildFile = testProjectDir.newFile('build.gradle') | ||||||
|  | 		propsFile = testProjectDir.newFile('gradle.properties') | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Unroll | ||||||
|  | 	def "empty build succeeds using Minecraft #mcVersion"() { | ||||||
|  | 		given: | ||||||
|  | 		settingsFile << genSettingsFile("empty-build-functional-test") | ||||||
|  | 		propsFile << genPropsFile(mcVersion, yarnVersion, loaderVersion, fabricVersion) | ||||||
|  | 		buildFile << genBuildFile() | ||||||
|  | 
 | ||||||
|  | 		when: | ||||||
|  | 		def result = GradleRunner.create() | ||||||
|  | 				.withProjectDir(testProjectDir.root) | ||||||
|  | 				.withArguments('build') | ||||||
|  | 				.withPluginClasspath() | ||||||
|  | 				.withGradleVersion("5.1.1") | ||||||
|  | 				.build() | ||||||
|  | 
 | ||||||
|  | 		then: | ||||||
|  | 		result.task(":build").outcome == SUCCESS | ||||||
|  | 
 | ||||||
|  | 		where: | ||||||
|  | 		mcVersion | yarnVersion       | loaderVersion     | fabricVersion | ||||||
|  | 		'1.14'    | '1.14+build.21'   | '0.4.8+build.155' | '0.3.0+build.183' | ||||||
|  | 		'1.14.1'  | '1.14.1+build.10' | '0.4.8+build.155' | '0.3.0+build.183' | ||||||
|  | 		'1.14.2'  | '1.14.2+build.7'  | '0.4.8+build.155' | '0.3.0+build.183' | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -0,0 +1,77 @@ | ||||||
|  | package net.fabricmc.loom | ||||||
|  | 
 | ||||||
|  | import org.gradle.testkit.runner.GradleRunner | ||||||
|  | import org.junit.Rule | ||||||
|  | import org.junit.rules.TemporaryFolder | ||||||
|  | import spock.lang.Ignore | ||||||
|  | import spock.lang.Specification | ||||||
|  | import spock.lang.Unroll | ||||||
|  | 
 | ||||||
|  | import static net.fabricmc.loom.BuildUtils.* | ||||||
|  | import static org.gradle.testkit.runner.TaskOutcome.SUCCESS | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Created by Mitchell Skaggs on 6/10/2019. | ||||||
|  |  */ | ||||||
|  | class MixinBuildFunctionalTest extends Specification { | ||||||
|  | 	@Rule | ||||||
|  | 	TemporaryFolder testProjectDir = new TemporaryFolder() | ||||||
|  | 	File settingsFile | ||||||
|  | 	File buildFile | ||||||
|  | 	File propsFile | ||||||
|  | 	File modJsonFile | ||||||
|  | 	File modJavaFile | ||||||
|  | 	File modMixinsJsonFile | ||||||
|  | 	File modMixinsJavaFile | ||||||
|  | 
 | ||||||
|  | 	def setup() { | ||||||
|  | 		settingsFile = testProjectDir.newFile('settings.gradle') | ||||||
|  | 		buildFile = testProjectDir.newFile('build.gradle') | ||||||
|  | 		propsFile = testProjectDir.newFile('gradle.properties') | ||||||
|  | 
 | ||||||
|  | 		testProjectDir.newFolder("src", "main", "resources") | ||||||
|  | 		modJsonFile = testProjectDir.newFile('src/main/resources/fabric.mod.json') | ||||||
|  | 		modMixinsJsonFile = testProjectDir.newFile('src/main/resources/modid.mixins.json') | ||||||
|  | 
 | ||||||
|  | 		testProjectDir.newFolder("src", "main", "java", "net", "fabricmc", "example") | ||||||
|  | 		modJavaFile = testProjectDir.newFile("src/main/java/net/fabricmc/example/ExampleMod.java") | ||||||
|  | 
 | ||||||
|  | 		testProjectDir.newFolder("src", "main", "java", "net", "fabricmc", "example", "mixin") | ||||||
|  | 		modMixinsJavaFile = testProjectDir.newFile("src/main/java/net/fabricmc/example/mixin/ExampleMixin.java") | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Why it's ignored: | ||||||
|  | 	 * <p> | ||||||
|  | 	 * When doing mixin annotation processing, a {@link ServiceLoader} is used to find implementations of {@link org.spongepowered.tools.obfuscation.service.IObfuscationService}. The classpath isn't passed to the build properly in this case, causing the Fabric-specific {@link net.fabricmc.loom.mixin.ObfuscationServiceFabric} to not be loaded. This causes the mixin to fail to compile because it doesn't know how to be reobfuscated. | ||||||
|  | 	 */ | ||||||
|  | 	@Unroll | ||||||
|  | 	@Ignore("fails because the annotation processor classpath doesn't include fabric-mixin-compile-extensions, so it doesn't know how to remap anything") | ||||||
|  | 	def "mixin build succeeds using Minecraft #mcVersion"() { | ||||||
|  | 		given: | ||||||
|  | 		settingsFile << genSettingsFile("mixin-build-functional-test") | ||||||
|  | 		propsFile << genPropsFile(mcVersion, yarnVersion, loaderVersion, fabricVersion) | ||||||
|  | 		buildFile << genBuildFile() | ||||||
|  | 		modJsonFile << genModJsonFile() | ||||||
|  | 		modJavaFile << genModJavaFile() | ||||||
|  | 		modMixinsJsonFile << genModMixinsJsonFile() | ||||||
|  | 		modMixinsJavaFile << genModMixinsJavaFile() | ||||||
|  | 
 | ||||||
|  | 		when: | ||||||
|  | 		def result = GradleRunner.create() | ||||||
|  | 				.withProjectDir(testProjectDir.root) | ||||||
|  | 				.withArguments('build') | ||||||
|  | 				.withPluginClasspath() | ||||||
|  | 				.withGradleVersion("5.1.1") | ||||||
|  | 				.build() | ||||||
|  | 
 | ||||||
|  | 		then: | ||||||
|  | 		result.task(":build").outcome == SUCCESS | ||||||
|  | 
 | ||||||
|  | 		where: | ||||||
|  | 		mcVersion | yarnVersion       | loaderVersion     | fabricVersion | ||||||
|  | 		'1.14'    | '1.14+build.21'   | '0.4.8+build.155' | '0.3.0+build.184' | ||||||
|  | 		'1.14.1'  | '1.14.1+build.10' | '0.4.8+build.155' | '0.3.0+build.184' | ||||||
|  | 		'1.14.2'  | '1.14.2+build.7'  | '0.4.8+build.155' | '0.3.0+build.184' | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -0,0 +1,62 @@ | ||||||
|  | package net.fabricmc.loom | ||||||
|  | 
 | ||||||
|  | import org.gradle.testkit.runner.GradleRunner | ||||||
|  | import org.junit.Rule | ||||||
|  | import org.junit.rules.TemporaryFolder | ||||||
|  | import spock.lang.Specification | ||||||
|  | import spock.lang.Unroll | ||||||
|  | 
 | ||||||
|  | import static net.fabricmc.loom.BuildUtils.* | ||||||
|  | import static org.gradle.testkit.runner.TaskOutcome.SUCCESS | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Created by Mitchell Skaggs on 6/10/2019. | ||||||
|  |  */ | ||||||
|  | class SimpleBuildFunctionalTest extends Specification { | ||||||
|  | 	@Rule | ||||||
|  | 	TemporaryFolder testProjectDir = new TemporaryFolder() | ||||||
|  | 	File settingsFile | ||||||
|  | 	File buildFile | ||||||
|  | 	File propsFile | ||||||
|  | 	File modJsonFile | ||||||
|  | 	File modExampleFile | ||||||
|  | 
 | ||||||
|  | 	def setup() { | ||||||
|  | 		settingsFile = testProjectDir.newFile('settings.gradle') | ||||||
|  | 		buildFile = testProjectDir.newFile('build.gradle') | ||||||
|  | 		propsFile = testProjectDir.newFile('gradle.properties') | ||||||
|  | 
 | ||||||
|  | 		testProjectDir.newFolder("src", "main", "resources") | ||||||
|  | 		modJsonFile = testProjectDir.newFile('src/main/resources/fabric.mod.json') | ||||||
|  | 
 | ||||||
|  | 		testProjectDir.newFolder("src", "main", "java", "net", "fabricmc", "example") | ||||||
|  | 		modExampleFile = testProjectDir.newFile("src/main/java/net/fabricmc/example/ExampleMod.java") | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Unroll | ||||||
|  | 	def "simple build succeeds using Minecraft #mcVersion"() { | ||||||
|  | 		given: | ||||||
|  | 		settingsFile << genSettingsFile("simple-build-functional-test") | ||||||
|  | 		propsFile << genPropsFile(mcVersion, yarnVersion, loaderVersion, fabricVersion) | ||||||
|  | 		buildFile << genBuildFile() | ||||||
|  | 		modJsonFile << genModJsonFile() | ||||||
|  | 		modExampleFile << genModJavaFile() | ||||||
|  | 
 | ||||||
|  | 		when: | ||||||
|  | 		def result = GradleRunner.create() | ||||||
|  | 				.withProjectDir(testProjectDir.root) | ||||||
|  | 				.withArguments('build') | ||||||
|  | 				.withPluginClasspath() | ||||||
|  | 				.withGradleVersion("5.1.1") | ||||||
|  | 				.build() | ||||||
|  | 
 | ||||||
|  | 		then: | ||||||
|  | 		result.task(":build").outcome == SUCCESS | ||||||
|  | 
 | ||||||
|  | 		where: | ||||||
|  | 		mcVersion | yarnVersion       | loaderVersion     | fabricVersion | ||||||
|  | 		'1.14'    | '1.14+build.21'   | '0.4.8+build.155' | '0.3.0+build.184' | ||||||
|  | 		'1.14.1'  | '1.14.1+build.10' | '0.4.8+build.155' | '0.3.0+build.184' | ||||||
|  | 		'1.14.2'  | '1.14.2+build.7'  | '0.4.8+build.155' | '0.3.0+build.184' | ||||||
|  | 	} | ||||||
|  | } | ||||||
		Loading…
	
		Reference in a new issue