Allow either file or task inputs
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
package com.hypherionmc.modfusioner.actions;
|
package com.hypherionmc.modfusioner.actions;
|
||||||
|
|
||||||
import com.hypherionmc.modfusioner.Constants;
|
import com.hypherionmc.modfusioner.Constants;
|
||||||
import com.hypherionmc.modfusioner.plugin.ModFusionerExtension;
|
import com.hypherionmc.modfusioner.plugin.FusionerExtension;
|
||||||
import com.hypherionmc.modfusioner.utils.FileTools;
|
import com.hypherionmc.modfusioner.utils.FileTools;
|
||||||
import fr.stevecohen.jarmanager.JarPacker;
|
import fr.stevecohen.jarmanager.JarPacker;
|
||||||
import fr.stevecohen.jarmanager.JarUnpacker;
|
import fr.stevecohen.jarmanager.JarUnpacker;
|
||||||
@@ -37,7 +37,7 @@ public class JarMergeAction {
|
|||||||
@Setter private File forgeInput;
|
@Setter private File forgeInput;
|
||||||
@Setter private File fabricInput;
|
@Setter private File fabricInput;
|
||||||
@Setter private File quiltInput;
|
@Setter private File quiltInput;
|
||||||
private final Map<ModFusionerExtension.CustomConfiguration, File> customInputs;
|
private final Map<FusionerExtension.CustomConfiguration, File> customInputs;
|
||||||
|
|
||||||
// Relocations
|
// Relocations
|
||||||
@Setter private Map<String, String> forgeRelocations;
|
@Setter private Map<String, String> forgeRelocations;
|
||||||
@@ -48,7 +48,7 @@ public class JarMergeAction {
|
|||||||
@Setter private List<String> forgeMixins;
|
@Setter private List<String> forgeMixins;
|
||||||
|
|
||||||
// Custom
|
// Custom
|
||||||
private Map<ModFusionerExtension.CustomConfiguration, Map<File, File>> customTemps;
|
private Map<FusionerExtension.CustomConfiguration, Map<File, File>> customTemps;
|
||||||
|
|
||||||
// Relocations
|
// Relocations
|
||||||
private final List<String> ignoredPackages;
|
private final List<String> ignoredPackages;
|
||||||
@@ -143,7 +143,7 @@ public class JarMergeAction {
|
|||||||
FileTools.moveDirectory(fabricTemp, mergedTemp);
|
FileTools.moveDirectory(fabricTemp, mergedTemp);
|
||||||
FileTools.moveDirectory(quiltTemp, mergedTemp);
|
FileTools.moveDirectory(quiltTemp, mergedTemp);
|
||||||
|
|
||||||
for (Map.Entry<ModFusionerExtension.CustomConfiguration, Map<File, File>> entry : customTemps.entrySet()) {
|
for (Map.Entry<FusionerExtension.CustomConfiguration, Map<File, File>> entry : customTemps.entrySet()) {
|
||||||
for (Map.Entry<File, File> entry2 : entry.getValue().entrySet()) {
|
for (Map.Entry<File, File> entry2 : entry.getValue().entrySet()) {
|
||||||
FileTools.moveDirectory(entry2.getValue(), mergedTemp);
|
FileTools.moveDirectory(entry2.getValue(), mergedTemp);
|
||||||
}
|
}
|
||||||
@@ -213,7 +213,7 @@ public class JarMergeAction {
|
|||||||
remapJar(fabricInput, "fabric", fabricRelocations);
|
remapJar(fabricInput, "fabric", fabricRelocations);
|
||||||
remapJar(quiltInput, "quilt", quiltRelocations);
|
remapJar(quiltInput, "quilt", quiltRelocations);
|
||||||
|
|
||||||
for (Map.Entry<ModFusionerExtension.CustomConfiguration, File> entry : customInputs.entrySet()) {
|
for (Map.Entry<FusionerExtension.CustomConfiguration, File> entry : customInputs.entrySet()) {
|
||||||
if (FileTools.exists(entry.getValue())) {
|
if (FileTools.exists(entry.getValue())) {
|
||||||
remapCustomJar(entry.getKey(), entry.getValue());
|
remapCustomJar(entry.getKey(), entry.getValue());
|
||||||
}
|
}
|
||||||
@@ -281,7 +281,7 @@ public class JarMergeAction {
|
|||||||
* @param jarFile - The input jar of the custom project to be processed
|
* @param jarFile - The input jar of the custom project to be processed
|
||||||
* @throws IOException - Thrown if an io exception occurs
|
* @throws IOException - Thrown if an io exception occurs
|
||||||
*/
|
*/
|
||||||
private void remapCustomJar(ModFusionerExtension.CustomConfiguration configuration, File jarFile) throws IOException {
|
private void remapCustomJar(FusionerExtension.CustomConfiguration configuration, File jarFile) throws IOException {
|
||||||
String name = configuration.getProjectName();
|
String name = configuration.getProjectName();
|
||||||
File remappedJar = FileTools.createOrReCreateF(new File(tempDir, "tempCustomInMerging_" + name + ".jar"));
|
File remappedJar = FileTools.createOrReCreateF(new File(tempDir, "tempCustomInMerging_" + name + ".jar"));
|
||||||
|
|
||||||
@@ -331,7 +331,7 @@ public class JarMergeAction {
|
|||||||
remapJarResources(fabricInput, "fabric", fabricTemps, fabricRelocations);
|
remapJarResources(fabricInput, "fabric", fabricTemps, fabricRelocations);
|
||||||
remapJarResources(quiltInput, "quilt", quiltTemps, quiltRelocations);
|
remapJarResources(quiltInput, "quilt", quiltTemps, quiltRelocations);
|
||||||
|
|
||||||
for (Map.Entry<ModFusionerExtension.CustomConfiguration, Map<File, File>> entry : customTemps.entrySet()) {
|
for (Map.Entry<FusionerExtension.CustomConfiguration, Map<File, File>> entry : customTemps.entrySet()) {
|
||||||
for (Map.Entry<File, File> entry2 : entry.getValue().entrySet()) {
|
for (Map.Entry<File, File> entry2 : entry.getValue().entrySet()) {
|
||||||
if (entry2.getKey() != null && entry2.getKey().exists()) {
|
if (entry2.getKey() != null && entry2.getKey().exists()) {
|
||||||
File customTemps = entry2.getValue();
|
File customTemps = entry2.getValue();
|
||||||
@@ -449,7 +449,7 @@ public class JarMergeAction {
|
|||||||
if (FileTools.exists(quiltInput)) quiltManifest.read(fileInputStream = new FileInputStream(new File(quiltTemp, "META-INF/MANIFEST.MF")));
|
if (FileTools.exists(quiltInput)) quiltManifest.read(fileInputStream = new FileInputStream(new File(quiltTemp, "META-INF/MANIFEST.MF")));
|
||||||
if (fileInputStream != null) fileInputStream.close();
|
if (fileInputStream != null) fileInputStream.close();
|
||||||
|
|
||||||
for (Map.Entry<ModFusionerExtension.CustomConfiguration, Map<File, File>> entry : customTemps.entrySet()) {
|
for (Map.Entry<FusionerExtension.CustomConfiguration, Map<File, File>> entry : customTemps.entrySet()) {
|
||||||
for (Map.Entry<File, File> entry2 : entry.getValue().entrySet()) {
|
for (Map.Entry<File, File> entry2 : entry.getValue().entrySet()) {
|
||||||
Manifest manifest = new Manifest();
|
Manifest manifest = new Manifest();
|
||||||
if (FileTools.exists(entry2.getKey())) {
|
if (FileTools.exists(entry2.getKey())) {
|
||||||
@@ -514,7 +514,7 @@ public class JarMergeAction {
|
|||||||
if (FileTools.exists(fabricInput)) new File(fabricTemp, "META-INF/MANIFEST.MF").delete();
|
if (FileTools.exists(fabricInput)) new File(fabricTemp, "META-INF/MANIFEST.MF").delete();
|
||||||
if (FileTools.exists(quiltInput)) new File(quiltTemp, "META-INF/MANIFEST.MF").delete();
|
if (FileTools.exists(quiltInput)) new File(quiltTemp, "META-INF/MANIFEST.MF").delete();
|
||||||
|
|
||||||
for (Map.Entry<ModFusionerExtension.CustomConfiguration, Map<File, File>> entry : customTemps.entrySet()) {
|
for (Map.Entry<FusionerExtension.CustomConfiguration, Map<File, File>> entry : customTemps.entrySet()) {
|
||||||
for (Map.Entry<File, File> entry2 : entry.getValue().entrySet()) {
|
for (Map.Entry<File, File> entry2 : entry.getValue().entrySet()) {
|
||||||
if (FileTools.exists(entry2.getKey())) new File(entry2.getValue(), "META-INF/MANIFEST.MF").delete();
|
if (FileTools.exists(entry2.getKey())) new File(entry2.getValue(), "META-INF/MANIFEST.MF").delete();
|
||||||
}
|
}
|
||||||
@@ -555,7 +555,7 @@ public class JarMergeAction {
|
|||||||
removeDuplicateRelocationResources.put("quilt/" + duplicatePath, duplicatePath);
|
removeDuplicateRelocationResources.put("quilt/" + duplicatePath, duplicatePath);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Map.Entry<ModFusionerExtension.CustomConfiguration, Map<File, File>> entry : customTemps.entrySet()) {
|
for (Map.Entry<FusionerExtension.CustomConfiguration, Map<File, File>> entry : customTemps.entrySet()) {
|
||||||
for (Map.Entry<File, File> entry2 : entry.getValue().entrySet()) {
|
for (Map.Entry<File, File> entry2 : entry.getValue().entrySet()) {
|
||||||
if (FileTools.exists(entry2.getKey())) {
|
if (FileTools.exists(entry2.getKey())) {
|
||||||
String name = entry.getKey().getProjectName();
|
String name = entry.getKey().getProjectName();
|
||||||
|
@@ -6,55 +6,71 @@ import lombok.Setter;
|
|||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
/**
|
public class FusionerExtension {
|
||||||
* @author HypherionSA
|
|
||||||
* Main Plugin Extension allowing users to configure the plugin
|
|
||||||
*/
|
|
||||||
public class ModFusionerExtension {
|
|
||||||
|
|
||||||
// Group, or package names that will be used for the final jar
|
// Group, or package names that will be used for the final jar
|
||||||
@Getter @Setter
|
@Getter
|
||||||
String group;
|
@Setter
|
||||||
|
String packageGroup;
|
||||||
|
|
||||||
// The name of the final jar
|
// The name of the final jar
|
||||||
@Getter @Setter
|
@Getter @Setter
|
||||||
String outJarName;
|
String mergedJarName;
|
||||||
|
|
||||||
// Duplicate packages that fill be de-duplicated upon merge
|
// The name of the final jar
|
||||||
|
@Getter @Setter
|
||||||
|
String jarVersion;
|
||||||
|
|
||||||
|
// Duplicate packages that will be de-duplicated upon merge
|
||||||
@Getter
|
@Getter
|
||||||
List<String> duplicateRelocations;
|
List<String> duplicateRelocations;
|
||||||
|
|
||||||
// The output directory for the merged jar
|
// The output directory for the merged jar
|
||||||
@Getter @Setter
|
@Getter @Setter
|
||||||
String outputDir = "fused";
|
String outputDirectory;
|
||||||
|
|
||||||
// Forge Project Configuration
|
// Forge Project Configuration
|
||||||
@Getter @Setter
|
@Getter @Setter
|
||||||
ForgeConfiguration forgeConfiguration;
|
FusionerExtension.ForgeConfiguration forgeConfiguration;
|
||||||
|
|
||||||
// Fabric Project Configuration
|
// Fabric Project Configuration
|
||||||
@Getter @Setter
|
@Getter @Setter
|
||||||
FabricConfiguration fabricConfiguration;
|
FusionerExtension.FabricConfiguration fabricConfiguration;
|
||||||
|
|
||||||
// Quilt Project Configuration
|
// Quilt Project Configuration
|
||||||
@Getter @Setter
|
@Getter @Setter
|
||||||
QuiltConfiguration quiltConfiguration;
|
FusionerExtension.QuiltConfiguration quiltConfiguration;
|
||||||
|
|
||||||
// Custom Project Configurations
|
// Custom Project Configurations
|
||||||
@Getter
|
@Getter
|
||||||
List<CustomConfiguration> customConfigurations = new ArrayList<>();
|
List<FusionerExtension.CustomConfiguration> customConfigurations = new ArrayList<>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Main extension entry point
|
* Main extension entry point
|
||||||
*/
|
*/
|
||||||
public ModFusionerExtension() {
|
public FusionerExtension() {
|
||||||
if (group == null || group.isEmpty()) {
|
if (packageGroup == null || packageGroup.isEmpty()) {
|
||||||
if (ModFusionerPlugin.rootProject.hasProperty("group") && ModFusionerPlugin.rootProject.property("group") != null) {
|
if (ModFusionerPlugin.rootProject.hasProperty("group") && ModFusionerPlugin.rootProject.property("group") != null) {
|
||||||
group = ModFusionerPlugin.rootProject.property("group").toString();
|
packageGroup = ModFusionerPlugin.rootProject.property("group").toString();
|
||||||
} else {
|
} else {
|
||||||
ModFusionerPlugin.logger.error("\"group\" is not defined and cannot be set automatically");
|
ModFusionerPlugin.logger.error("\"group\" is not defined and cannot be set automatically");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (mergedJarName == null || mergedJarName.isEmpty()) {
|
||||||
|
mergedJarName = "MergedJar";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (jarVersion == null || jarVersion.isEmpty()) {
|
||||||
|
if (ModFusionerPlugin.rootProject.hasProperty("version") && ModFusionerPlugin.rootProject.property("version") != null) {
|
||||||
|
jarVersion = ModFusionerPlugin.rootProject.property("version").toString();
|
||||||
|
} else {
|
||||||
|
jarVersion = "1.0";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (outputDirectory == null || outputDirectory.isEmpty())
|
||||||
|
outputDirectory = "artifacts/fused";
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -78,8 +94,8 @@ public class ModFusionerExtension {
|
|||||||
/**
|
/**
|
||||||
* Set up the forge project configurations
|
* Set up the forge project configurations
|
||||||
*/
|
*/
|
||||||
public ForgeConfiguration forge(Closure<ForgeConfiguration> closure) {
|
public FusionerExtension.ForgeConfiguration forge(Closure<FusionerExtension.ForgeConfiguration> closure) {
|
||||||
forgeConfiguration = new ForgeConfiguration();
|
forgeConfiguration = new FusionerExtension.ForgeConfiguration();
|
||||||
ModFusionerPlugin.rootProject.configure(forgeConfiguration, closure);
|
ModFusionerPlugin.rootProject.configure(forgeConfiguration, closure);
|
||||||
return forgeConfiguration;
|
return forgeConfiguration;
|
||||||
}
|
}
|
||||||
@@ -87,8 +103,8 @@ public class ModFusionerExtension {
|
|||||||
/**
|
/**
|
||||||
* Set up the fabric project configurations
|
* Set up the fabric project configurations
|
||||||
*/
|
*/
|
||||||
public FabricConfiguration fabric(Closure<FabricConfiguration> closure) {
|
public FusionerExtension.FabricConfiguration fabric(Closure<FusionerExtension.FabricConfiguration> closure) {
|
||||||
fabricConfiguration = new FabricConfiguration();
|
fabricConfiguration = new FusionerExtension.FabricConfiguration();
|
||||||
ModFusionerPlugin.rootProject.configure(fabricConfiguration, closure);
|
ModFusionerPlugin.rootProject.configure(fabricConfiguration, closure);
|
||||||
return fabricConfiguration;
|
return fabricConfiguration;
|
||||||
}
|
}
|
||||||
@@ -96,8 +112,8 @@ public class ModFusionerExtension {
|
|||||||
/**
|
/**
|
||||||
* Set up the quilt project configurations
|
* Set up the quilt project configurations
|
||||||
*/
|
*/
|
||||||
public QuiltConfiguration quilt(Closure<QuiltConfiguration> closure) {
|
public FusionerExtension.QuiltConfiguration quilt(Closure<FusionerExtension.QuiltConfiguration> closure) {
|
||||||
quiltConfiguration = new QuiltConfiguration();
|
quiltConfiguration = new FusionerExtension.QuiltConfiguration();
|
||||||
ModFusionerPlugin.rootProject.configure(quiltConfiguration, closure);
|
ModFusionerPlugin.rootProject.configure(quiltConfiguration, closure);
|
||||||
return quiltConfiguration;
|
return quiltConfiguration;
|
||||||
}
|
}
|
||||||
@@ -105,8 +121,8 @@ public class ModFusionerExtension {
|
|||||||
/**
|
/**
|
||||||
* Set up custom project configurations
|
* Set up custom project configurations
|
||||||
*/
|
*/
|
||||||
public CustomConfiguration custom(Closure<CustomConfiguration> closure) {
|
public FusionerExtension.CustomConfiguration custom(Closure<FusionerExtension.CustomConfiguration> closure) {
|
||||||
CustomConfiguration customConfiguration = new CustomConfiguration();
|
FusionerExtension.CustomConfiguration customConfiguration = new FusionerExtension.CustomConfiguration();
|
||||||
ModFusionerPlugin.rootProject.configure(customConfiguration, closure);
|
ModFusionerPlugin.rootProject.configure(customConfiguration, closure);
|
||||||
|
|
||||||
if (customConfiguration.getProjectName() == null || customConfiguration.getProjectName().isEmpty()) {
|
if (customConfiguration.getProjectName() == null || customConfiguration.getProjectName().isEmpty()) {
|
||||||
@@ -127,7 +143,11 @@ public class ModFusionerExtension {
|
|||||||
|
|
||||||
// The file that will be used as the input
|
// The file that will be used as the input
|
||||||
@Getter @Setter
|
@Getter @Setter
|
||||||
String jarLocation;
|
String inputFile;
|
||||||
|
|
||||||
|
// The name of the task to run to get the input file
|
||||||
|
@Getter @Setter
|
||||||
|
String inputTaskName;
|
||||||
|
|
||||||
// Packages that should be relocated, instead of duplicated
|
// Packages that should be relocated, instead of duplicated
|
||||||
@Getter
|
@Getter
|
||||||
@@ -166,7 +186,11 @@ public class ModFusionerExtension {
|
|||||||
|
|
||||||
// The file that will be used as the input
|
// The file that will be used as the input
|
||||||
@Getter @Setter
|
@Getter @Setter
|
||||||
String jarLocation;
|
String inputFile;
|
||||||
|
|
||||||
|
// The name of the task to run to get the input file
|
||||||
|
@Getter @Setter
|
||||||
|
String inputTaskName;
|
||||||
|
|
||||||
// Packages that should be relocated, instead of duplicated
|
// Packages that should be relocated, instead of duplicated
|
||||||
@Getter
|
@Getter
|
||||||
@@ -193,7 +217,11 @@ public class ModFusionerExtension {
|
|||||||
|
|
||||||
// The file that will be used as the input
|
// The file that will be used as the input
|
||||||
@Getter @Setter
|
@Getter @Setter
|
||||||
String jarLocation;
|
String inputFile;
|
||||||
|
|
||||||
|
// The name of the task to run to get the input file
|
||||||
|
@Getter @Setter
|
||||||
|
String inputTaskName;
|
||||||
|
|
||||||
// Packages that should be relocated, instead of duplicated
|
// Packages that should be relocated, instead of duplicated
|
||||||
@Getter
|
@Getter
|
||||||
@@ -220,7 +248,11 @@ public class ModFusionerExtension {
|
|||||||
|
|
||||||
// The file that will be used as the input
|
// The file that will be used as the input
|
||||||
@Getter @Setter
|
@Getter @Setter
|
||||||
String jarLocation;
|
String inputFile;
|
||||||
|
|
||||||
|
// The name of the task to run to get the input file
|
||||||
|
@Getter @Setter
|
||||||
|
String inputTaskName;
|
||||||
|
|
||||||
// Packages that should be relocated, instead of duplicated
|
// Packages that should be relocated, instead of duplicated
|
||||||
@Getter
|
@Getter
|
||||||
@@ -235,4 +267,5 @@ public class ModFusionerExtension {
|
|||||||
this.relocations.put(from, to);
|
this.relocations.put(from, to);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@@ -1,10 +1,13 @@
|
|||||||
package com.hypherionmc.modfusioner.plugin;
|
package com.hypherionmc.modfusioner.plugin;
|
||||||
|
|
||||||
import com.hypherionmc.modfusioner.Constants;
|
import com.hypherionmc.modfusioner.Constants;
|
||||||
import com.hypherionmc.modfusioner.task.FuseJarsTask;
|
import com.hypherionmc.modfusioner.task.JarFuseTask;
|
||||||
import org.gradle.api.Plugin;
|
import org.gradle.api.Plugin;
|
||||||
import org.gradle.api.Project;
|
import org.gradle.api.Project;
|
||||||
|
import org.gradle.api.Task;
|
||||||
import org.gradle.api.logging.Logger;
|
import org.gradle.api.logging.Logger;
|
||||||
|
import org.gradle.api.tasks.TaskProvider;
|
||||||
|
import org.gradle.api.tasks.bundling.AbstractArchiveTask;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author HypherionSA
|
* @author HypherionSA
|
||||||
@@ -14,18 +17,101 @@ public class ModFusionerPlugin implements Plugin<Project> {
|
|||||||
|
|
||||||
public static Project rootProject;
|
public static Project rootProject;
|
||||||
public static Logger logger;
|
public static Logger logger;
|
||||||
public static ModFusionerExtension modFusionerExtension;
|
public static FusionerExtension modFusionerExtension;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void apply(Project project) {
|
public void apply(Project project) {
|
||||||
rootProject = project;
|
// We only want to apply the project to the Root project
|
||||||
|
if (project != project.getRootProject())
|
||||||
|
return;
|
||||||
|
|
||||||
|
rootProject = project.getRootProject();
|
||||||
logger = project.getLogger();
|
logger = project.getLogger();
|
||||||
|
|
||||||
modFusionerExtension = rootProject.getExtensions().create(Constants.EXTENSION_NAME, ModFusionerExtension.class);
|
// Register the extension
|
||||||
|
modFusionerExtension = rootProject.getExtensions().create(Constants.EXTENSION_NAME, FusionerExtension.class);
|
||||||
|
|
||||||
rootProject.getTasks().register(Constants.TASK_NAME, FuseJarsTask.class).configure(fusioner -> {
|
// Register the task
|
||||||
|
TaskProvider<JarFuseTask> task = rootProject.getTasks().register(Constants.TASK_NAME, JarFuseTask.class);
|
||||||
|
task.configure(fusioner -> {
|
||||||
fusioner.setGroup(Constants.TASK_GROUP);
|
fusioner.setGroup(Constants.TASK_GROUP);
|
||||||
fusioner.setDescription("Merge multiple jars into a single jar, for multi mod loader projects");
|
fusioner.setDescription("Merge multiple jars into a single jar, for multi mod loader projects");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Check for task dependencies and register them on the main task
|
||||||
|
project.subprojects(cc -> cc.afterEvaluate(ccc -> {
|
||||||
|
if (modFusionerExtension.getForgeConfiguration() != null
|
||||||
|
&& modFusionerExtension.getForgeConfiguration().inputTaskName != null
|
||||||
|
&& !modFusionerExtension.getForgeConfiguration().inputTaskName.isEmpty()) {
|
||||||
|
if (ccc.getName().equals(modFusionerExtension.getForgeConfiguration().getProjectName()))
|
||||||
|
resolveInputTasks(
|
||||||
|
ccc,
|
||||||
|
modFusionerExtension.getForgeConfiguration().getInputTaskName(),
|
||||||
|
modFusionerExtension.getForgeConfiguration().getProjectName(),
|
||||||
|
task
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (modFusionerExtension.getFabricConfiguration() != null
|
||||||
|
&& modFusionerExtension.getFabricConfiguration().inputTaskName != null
|
||||||
|
&& !modFusionerExtension.getFabricConfiguration().inputTaskName.isEmpty()) {
|
||||||
|
if (ccc.getName().equals(modFusionerExtension.getFabricConfiguration().getProjectName()))
|
||||||
|
resolveInputTasks(
|
||||||
|
ccc,
|
||||||
|
modFusionerExtension.getFabricConfiguration().getInputTaskName(),
|
||||||
|
modFusionerExtension.getFabricConfiguration().getProjectName(),
|
||||||
|
task
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (modFusionerExtension.getQuiltConfiguration() != null
|
||||||
|
&& modFusionerExtension.getQuiltConfiguration().inputTaskName != null
|
||||||
|
&& !modFusionerExtension.getQuiltConfiguration().inputTaskName.isEmpty()) {
|
||||||
|
if (ccc.getName().equals(modFusionerExtension.getQuiltConfiguration().getProjectName()))
|
||||||
|
resolveInputTasks(
|
||||||
|
ccc,
|
||||||
|
modFusionerExtension.getQuiltConfiguration().getInputTaskName(),
|
||||||
|
modFusionerExtension.getQuiltConfiguration().getProjectName(),
|
||||||
|
task
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (modFusionerExtension.getCustomConfigurations() != null && !modFusionerExtension.getCustomConfigurations().isEmpty()) {
|
||||||
|
modFusionerExtension.getCustomConfigurations().forEach(c -> {
|
||||||
|
if (ccc.getName().equals(c.getProjectName()) && c.getInputTaskName() != null && !c.getInputTaskName().isEmpty())
|
||||||
|
resolveInputTasks(ccc, c.getInputTaskName(), c.getProjectName(), task);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Try to locate the correct task to run on the subproject
|
||||||
|
* @param project - Sub project being processed
|
||||||
|
* @param inTask - The name of the task that will be run
|
||||||
|
* @param inProject - The name of the project the task is on
|
||||||
|
* @param mainTask - The FuseJars task
|
||||||
|
*/
|
||||||
|
private void resolveInputTasks(Project project, Object inTask, String inProject, TaskProvider<JarFuseTask> mainTask) {
|
||||||
|
if (inTask == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Task task = null;
|
||||||
|
|
||||||
|
if (inProject == null || inProject.isEmpty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (project == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (inTask instanceof String) {
|
||||||
|
task = project.getTasks().getByName((String) inTask);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(task instanceof AbstractArchiveTask))
|
||||||
|
return;
|
||||||
|
|
||||||
|
rootProject.task("prepareFuseTask" + project.getName()).dependsOn(":" + project.getName() + ":" + task.getName());
|
||||||
|
mainTask.get().dependsOn("prepareFuseTask" + project.getName());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -2,13 +2,16 @@ package com.hypherionmc.modfusioner.task;
|
|||||||
|
|
||||||
import com.hypherionmc.modfusioner.Constants;
|
import com.hypherionmc.modfusioner.Constants;
|
||||||
import com.hypherionmc.modfusioner.actions.JarMergeAction;
|
import com.hypherionmc.modfusioner.actions.JarMergeAction;
|
||||||
import com.hypherionmc.modfusioner.plugin.ModFusionerExtension;
|
import com.hypherionmc.modfusioner.plugin.FusionerExtension;
|
||||||
import com.hypherionmc.modfusioner.plugin.ModFusionerPlugin;
|
import com.hypherionmc.modfusioner.plugin.ModFusionerPlugin;
|
||||||
import com.hypherionmc.modfusioner.utils.FileChecks;
|
import com.hypherionmc.modfusioner.utils.FileChecks;
|
||||||
|
import com.hypherionmc.modfusioner.utils.FileTools;
|
||||||
import org.apache.commons.io.FileUtils;
|
import org.apache.commons.io.FileUtils;
|
||||||
import org.gradle.api.DefaultTask;
|
|
||||||
import org.gradle.api.Project;
|
import org.gradle.api.Project;
|
||||||
import org.gradle.api.tasks.TaskAction;
|
import org.gradle.api.internal.file.copy.CopyAction;
|
||||||
|
import org.gradle.api.tasks.WorkResults;
|
||||||
|
import org.gradle.jvm.tasks.Jar;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
@@ -17,6 +20,7 @@ import java.nio.file.Files;
|
|||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.nio.file.StandardCopyOption;
|
import java.nio.file.StandardCopyOption;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
|
|
||||||
import static com.hypherionmc.modfusioner.plugin.ModFusionerPlugin.modFusionerExtension;
|
import static com.hypherionmc.modfusioner.plugin.ModFusionerPlugin.modFusionerExtension;
|
||||||
import static com.hypherionmc.modfusioner.plugin.ModFusionerPlugin.rootProject;
|
import static com.hypherionmc.modfusioner.plugin.ModFusionerPlugin.rootProject;
|
||||||
@@ -25,32 +29,50 @@ import static com.hypherionmc.modfusioner.plugin.ModFusionerPlugin.rootProject;
|
|||||||
* @author HypherionSA
|
* @author HypherionSA
|
||||||
* The main task of the plugin
|
* The main task of the plugin
|
||||||
*/
|
*/
|
||||||
public class FuseJarsTask extends DefaultTask {
|
public class JarFuseTask extends Jar {
|
||||||
|
|
||||||
@TaskAction
|
// Fixed values
|
||||||
void meldJars() throws IOException {
|
private final File mergedJar;
|
||||||
|
private static final AtomicBoolean hasRun = new AtomicBoolean(false);
|
||||||
|
|
||||||
|
public JarFuseTask() {
|
||||||
|
// Set task default values from extension
|
||||||
|
getArchiveBaseName().set(modFusionerExtension.getMergedJarName());
|
||||||
|
getArchiveVersion().set(modFusionerExtension.getJarVersion());
|
||||||
|
getDestinationDirectory().set(getProject().file(modFusionerExtension.getOutputDirectory()));
|
||||||
|
|
||||||
|
// We don't allow custom input files, when the user defines their own task
|
||||||
|
getInputs().files();
|
||||||
|
|
||||||
|
// Only allow the task to run once per cycle
|
||||||
|
getOutputs().upToDateWhen(spec -> hasRun.get());
|
||||||
|
|
||||||
|
// Set output file
|
||||||
|
mergedJar = new File(getDestinationDirectory().get().getAsFile(), getArchiveFileName().get());
|
||||||
|
getOutputs().file(mergedJar);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Main task logic
|
||||||
|
* @throws IOException - Thrown when an IO error occurs
|
||||||
|
*/
|
||||||
|
void fuseJars() throws IOException {
|
||||||
long time = System.currentTimeMillis();
|
long time = System.currentTimeMillis();
|
||||||
|
|
||||||
// Check that all required values are set
|
|
||||||
if (modFusionerExtension.getOutJarName() == null || modFusionerExtension.getGroup() == null) {
|
|
||||||
ModFusionerPlugin.logger.error("Please configure \"group\" and \"outJarName\" manually!");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
ModFusionerPlugin.logger.lifecycle("Start Fusing Jars");
|
ModFusionerPlugin.logger.lifecycle("Start Fusing Jars");
|
||||||
|
|
||||||
// Get settings from extension
|
// Get settings from extension
|
||||||
ModFusionerExtension.ForgeConfiguration forgeConfiguration = modFusionerExtension.getForgeConfiguration();
|
FusionerExtension.ForgeConfiguration forgeConfiguration = modFusionerExtension.getForgeConfiguration();
|
||||||
ModFusionerExtension.FabricConfiguration fabricConfiguration = modFusionerExtension.getFabricConfiguration();
|
FusionerExtension.FabricConfiguration fabricConfiguration = modFusionerExtension.getFabricConfiguration();
|
||||||
ModFusionerExtension.QuiltConfiguration quiltConfiguration = modFusionerExtension.getQuiltConfiguration();
|
FusionerExtension.QuiltConfiguration quiltConfiguration = modFusionerExtension.getQuiltConfiguration();
|
||||||
|
|
||||||
List<ModFusionerExtension.CustomConfiguration> customConfigurations = modFusionerExtension.getCustomConfigurations();
|
List<FusionerExtension.CustomConfiguration> customConfigurations = modFusionerExtension.getCustomConfigurations();
|
||||||
|
|
||||||
// Try to resolve the projects specific in the extension config
|
// Try to resolve the projects specific in the extension config
|
||||||
Project forgeProject = null;
|
Project forgeProject = null;
|
||||||
Project fabricProject = null;
|
Project fabricProject = null;
|
||||||
Project quiltProject = null;
|
Project quiltProject = null;
|
||||||
Map<Project, ModFusionerExtension.CustomConfiguration> customProjects = new HashMap<>();
|
Map<Project, FusionerExtension.CustomConfiguration> customProjects = new HashMap<>();
|
||||||
List<Boolean> validation = new ArrayList<>();
|
List<Boolean> validation = new ArrayList<>();
|
||||||
|
|
||||||
if (forgeConfiguration != null) {
|
if (forgeConfiguration != null) {
|
||||||
@@ -75,7 +97,7 @@ public class FuseJarsTask extends DefaultTask {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (customConfigurations != null) {
|
if (customConfigurations != null) {
|
||||||
for (ModFusionerExtension.CustomConfiguration customSettings : customConfigurations) {
|
for (FusionerExtension.CustomConfiguration customSettings : customConfigurations) {
|
||||||
try {
|
try {
|
||||||
customProjects.put(rootProject.getAllprojects().stream().filter(p -> !p.getName().equals(rootProject.getName())).filter(p -> p.getName().equals(customSettings.getProjectName())).findFirst().get(), customSettings);
|
customProjects.put(rootProject.getAllprojects().stream().filter(p -> !p.getName().equals(rootProject.getName())).filter(p -> p.getName().equals(customSettings.getProjectName())).findFirst().get(), customSettings);
|
||||||
validation.add(true);
|
validation.add(true);
|
||||||
@@ -95,28 +117,27 @@ public class FuseJarsTask extends DefaultTask {
|
|||||||
File forgeJar = null;
|
File forgeJar = null;
|
||||||
File fabricJar = null;
|
File fabricJar = null;
|
||||||
File quiltJar = null;
|
File quiltJar = null;
|
||||||
Map<ModFusionerExtension.CustomConfiguration, File> customJars = new HashMap<>();
|
Map<FusionerExtension.CustomConfiguration, File> customJars = new HashMap<>();
|
||||||
|
|
||||||
if (forgeProject != null && forgeConfiguration != null) {
|
if (forgeProject != null && forgeConfiguration != null) {
|
||||||
forgeJar = getInputFile(forgeConfiguration.getJarLocation(), forgeProject);
|
forgeJar = getInputFile(forgeConfiguration.getInputFile(), forgeConfiguration.getInputTaskName(), forgeProject);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fabricProject != null && fabricConfiguration != null) {
|
if (fabricProject != null && fabricConfiguration != null) {
|
||||||
fabricJar = getInputFile(fabricConfiguration.getJarLocation(), fabricProject);
|
fabricJar = getInputFile(fabricConfiguration.getInputFile(), fabricConfiguration.getInputTaskName(), fabricProject);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (quiltProject != null && quiltConfiguration != null) {
|
if (quiltProject != null && quiltConfiguration != null) {
|
||||||
quiltJar = getInputFile(quiltConfiguration.getJarLocation(), quiltProject);
|
quiltJar = getInputFile(quiltConfiguration.getInputFile(), quiltConfiguration.getInputTaskName(), quiltProject);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Map.Entry<Project, ModFusionerExtension.CustomConfiguration> entry : customProjects.entrySet()) {
|
for (Map.Entry<Project, FusionerExtension.CustomConfiguration> entry : customProjects.entrySet()) {
|
||||||
File f = getInputFile(entry.getValue().getJarLocation(), entry.getKey());
|
File f = getInputFile(entry.getValue().getInputFile(), entry.getValue().getInputTaskName(), entry.getKey());
|
||||||
if (f != null)
|
if (f != null)
|
||||||
customJars.put(entry.getValue(), f);
|
customJars.put(entry.getValue(), f);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set up the final output jar
|
// Set up the final output jar
|
||||||
File mergedJar = new File(rootProject.getRootDir(), modFusionerExtension.getOutputDir() + File.separator + modFusionerExtension.getOutJarName());
|
|
||||||
if (mergedJar.exists()) FileUtils.forceDelete(mergedJar);
|
if (mergedJar.exists()) FileUtils.forceDelete(mergedJar);
|
||||||
if (!mergedJar.getParentFile().exists()) mergedJar.getParentFile().mkdirs();
|
if (!mergedJar.getParentFile().exists()) mergedJar.getParentFile().mkdirs();
|
||||||
|
|
||||||
@@ -124,9 +145,9 @@ public class FuseJarsTask extends DefaultTask {
|
|||||||
JarMergeAction mergeAction = JarMergeAction.of(
|
JarMergeAction mergeAction = JarMergeAction.of(
|
||||||
customJars,
|
customJars,
|
||||||
modFusionerExtension.getDuplicateRelocations(),
|
modFusionerExtension.getDuplicateRelocations(),
|
||||||
modFusionerExtension.getGroup(),
|
modFusionerExtension.getPackageGroup(),
|
||||||
new File(rootProject.getRootDir(), ".gradle" + File.separator + "fusioner"),
|
new File(rootProject.getRootDir(), ".gradle" + File.separator + "fusioner"),
|
||||||
modFusionerExtension.getOutJarName()
|
getArchiveFileName().get()
|
||||||
);
|
);
|
||||||
|
|
||||||
// Forge
|
// Forge
|
||||||
@@ -155,6 +176,27 @@ public class FuseJarsTask extends DefaultTask {
|
|||||||
mergeAction.clean();
|
mergeAction.clean();
|
||||||
|
|
||||||
ModFusionerPlugin.logger.lifecycle("Fused jar created in " + (System.currentTimeMillis() - time) / 1000.0 + " seconds.");
|
ModFusionerPlugin.logger.lifecycle("Fused jar created in " + (System.currentTimeMillis() - time) / 1000.0 + " seconds.");
|
||||||
|
hasRun.set(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Run the main task logic and copy the files to the correct locations
|
||||||
|
* @return - Just returns true to say the task executed
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected @NotNull CopyAction createCopyAction() {
|
||||||
|
return copyActionProcessingStream -> {
|
||||||
|
copyActionProcessingStream.process(fileCopyDetailsInternal -> {
|
||||||
|
if (!hasRun.get())
|
||||||
|
try {
|
||||||
|
fuseJars();
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return WorkResults.didWork(true);
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -164,9 +206,11 @@ public class FuseJarsTask extends DefaultTask {
|
|||||||
* @return - The jar file or null
|
* @return - The jar file or null
|
||||||
*/
|
*/
|
||||||
@Nullable
|
@Nullable
|
||||||
private File getInputFile(@Nullable String jarLocation, Project inProject) {
|
private File getInputFile(@Nullable String jarLocation, String inputTaskName, Project inProject) {
|
||||||
if (jarLocation != null && !jarLocation.isEmpty()) {
|
if (jarLocation != null && !jarLocation.isEmpty()) {
|
||||||
return new File(inProject.getProjectDir(), jarLocation);
|
return new File(inProject.getProjectDir(), jarLocation);
|
||||||
|
} else if (inputTaskName != null && !inputTaskName.isEmpty()) {
|
||||||
|
return FileTools.resolveFile(inProject, inputTaskName);
|
||||||
} else {
|
} else {
|
||||||
int i = 0;
|
int i = 0;
|
||||||
for (File file : new File(inProject.getBuildDir(), "libs").listFiles()) {
|
for (File file : new File(inProject.getBuildDir(), "libs").listFiles()) {
|
@@ -3,7 +3,6 @@ package com.hypherionmc.modfusioner.utils;
|
|||||||
import org.apache.tika.Tika;
|
import org.apache.tika.Tika;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
import java.io.BufferedInputStream;
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
@@ -2,6 +2,9 @@ package com.hypherionmc.modfusioner.utils;
|
|||||||
|
|
||||||
import org.apache.commons.io.FileUtils;
|
import org.apache.commons.io.FileUtils;
|
||||||
import org.apache.commons.io.FilenameUtils;
|
import org.apache.commons.io.FilenameUtils;
|
||||||
|
import org.gradle.api.Project;
|
||||||
|
import org.gradle.api.Task;
|
||||||
|
import org.gradle.api.tasks.bundling.AbstractArchiveTask;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
@@ -10,11 +13,11 @@ import java.io.FileNotFoundException;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.nio.charset.Charset;
|
import java.nio.charset.Charset;
|
||||||
import java.nio.file.CopyOption;
|
import java.nio.file.CopyOption;
|
||||||
import java.nio.file.Files;
|
|
||||||
import java.nio.file.Path;
|
|
||||||
import java.nio.file.StandardCopyOption;
|
import java.nio.file.StandardCopyOption;
|
||||||
import java.util.*;
|
import java.util.ArrayList;
|
||||||
import java.util.stream.Stream;
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.Scanner;
|
||||||
|
|
||||||
import static org.apache.commons.io.FileUtils.*;
|
import static org.apache.commons.io.FileUtils.*;
|
||||||
|
|
||||||
@@ -399,4 +402,25 @@ public class FileTools {
|
|||||||
|
|
||||||
return dir;
|
return dir;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static File resolveFile(Project project, Object obj) {
|
||||||
|
if (obj == null) {
|
||||||
|
throw new NullPointerException("Null Path");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (obj instanceof String) {
|
||||||
|
Task t = project.getTasks().getByName((String) obj);
|
||||||
|
if (t instanceof AbstractArchiveTask)
|
||||||
|
return ((AbstractArchiveTask)t).getArchiveFile().get().getAsFile();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (obj instanceof File) {
|
||||||
|
return (File) obj;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (obj instanceof AbstractArchiveTask) {
|
||||||
|
return ((AbstractArchiveTask)obj).getArchiveFile().get().getAsFile();
|
||||||
|
}
|
||||||
|
return project.file(obj);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user