Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 29 additions & 0 deletions src/main/groovy/net/minecraftforge/forgedev/ForgeDevExtension.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,13 @@
*/
package net.minecraftforge.forgedev;

import net.minecraftforge.forgedev.legacy.tasks.DownloadDependency;
import net.minecraftforge.forgedev.legacy.values.CIRuntime;
import net.minecraftforge.forgedev.tasks.compat.LegacyExtractZip;
import net.minecraftforge.forgedev.tasks.compat.LegacyMergeFilesTask;
import net.minecraftforge.forgedev.tasks.filtering.LegacyFilterNewJar;
import net.minecraftforge.forgedev.tasks.generation.GeneratePatcherConfigV2;
import net.minecraftforge.forgedev.tasks.installer.Installer;
import net.minecraftforge.forgedev.tasks.installertools.DownloadMappings;
import net.minecraftforge.forgedev.tasks.launcher.SlimeLauncherExec;
import net.minecraftforge.forgedev.tasks.mappings.LegacyApplyMappings;
Expand Down Expand Up @@ -35,6 +38,7 @@
import org.gradle.api.attributes.Attribute;
import org.gradle.api.file.Directory;
import org.gradle.api.file.DirectoryProperty;
import org.gradle.api.file.DuplicatesStrategy;
import org.gradle.api.file.ProjectLayout;
import org.gradle.api.model.ObjectFactory;
import org.gradle.api.plugins.JavaPlugin;
Expand All @@ -47,6 +51,7 @@
import org.gradle.api.tasks.bundling.Jar;
import org.gradle.api.tasks.bundling.Zip;
import org.gradle.api.tasks.compile.JavaCompile;
import org.gradle.internal.Actions;
import org.gradle.language.base.plugins.LifecycleBasePlugin;
import org.gradle.plugins.ide.eclipse.model.EclipseModel;
import org.jetbrains.annotations.VisibleForTesting;
Expand Down Expand Up @@ -77,9 +82,14 @@ public abstract class ForgeDevExtension {

protected abstract @Inject ProjectLayout getProjectLayout();

private final Project project;
private final Provider<Boolean> isCi;

@Inject
public ForgeDevExtension(ForgeDevPlugin plugin, Project project) {
this.mavenizerRepo.set(plugin.globalCaches().dir("repo").map(this.problems.ensureFileLocation()));
this.project = project;
this.isCi = getProviders().of(CIRuntime.class, it -> {});
this.setup(plugin, project);
}

Expand All @@ -101,6 +111,25 @@ public Configuration getMinecraftConfiguration() {
return this.minecraftDepsConfiguration;
}

public Installer installer() {
return installer(Installer.DEFAULT_NAME);
}
public Installer installer(Action<Installer> action) {
return installer(Installer.DEFAULT_NAME, action);
}
public Installer installer(String name) {
return installer(name, i -> {});
}
public Installer installer(String name, Action<Installer> action) {
var ret = Installer.register(this.project, this, name);
action.execute(ret);
return ret;
}

public boolean isCi() {
return this.isCi.get();
}

private void setup(ForgeDevPlugin plugin, Project project) {
var tasks = project.getTasks();

Expand Down
1 change: 1 addition & 0 deletions src/main/groovy/net/minecraftforge/forgedev/Tools.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ private Tools() { }
public static final Tool DIFFPATCH = Tool.of("diffpatch", "io.codechicken:DiffPatch:2.1.0.42:all", Constants.MAVEN_CENTRAL, 8);
public static final Tool BINPATCH = Tool.ofForge("binpatcher", "net.minecraftforge:binarypatcher:1.2.2:fatjar", 8);
public static final Tool INSTALLERTOOLS = Tool.ofForge("installertools", "net.minecraftforge:installertools:1.4.4:fatjar", 8);
public static final Tool INSTALLER = Tool.ofForge("installer", "net.minecraftforge:installer:2.2.9:fatjar", 8);
public static final Tool JARCOMPATIBILITYCHECKER = Tool.ofForge("jarcompatibilitychecker", "net.minecraftforge:JarCompatibilityChecker:0.1.28:all", 8);
public static final Tool RENAMER = Tool.ofForge("renamer", "net.minecraftforge:ForgeAutoRenamingTool:1.1.1:all", 8);
public static final Tool SRG2SRC = Tool.ofForge("srg2source", "net.minecraftforge:Srg2Source:8.1.1:fatjar", 17);
Expand Down
19 changes: 0 additions & 19 deletions src/main/groovy/net/minecraftforge/forgedev/Util.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,26 +5,7 @@
package net.minecraftforge.forgedev;

import net.minecraftforge.gradleutils.shared.SharedUtil;
import org.gradle.TaskExecutionRequest;
import org.gradle.api.Action;
import org.gradle.api.Project;
import org.gradle.api.plugins.JavaPluginExtension;
import org.gradle.api.provider.Provider;
import org.gradle.api.specs.Spec;
import org.gradle.api.tasks.TaskProvider;
import org.gradle.jvm.toolchain.JavaLanguageVersion;
import org.gradle.jvm.toolchain.JavaLauncher;
import org.gradle.jvm.toolchain.JavaToolchainService;
import org.gradle.jvm.toolchain.JavaToolchainSpec;
import org.jetbrains.annotations.Nullable;

import java.io.File;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.Callable;

public final class Util extends SharedUtil {
private Util() { }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,17 @@ public static TaskProvider<CheckJarCompatibility> register(Project project, Stri
task.getInputJar().set(reobfJar.flatMap(LegacyReobfuscateJar::getOutput));
});
checkJarCompatibility.configure(action);

var providers = project.getProviders();
var hasMaven = providers.environmentVariable("MAVEN_USER").isPresent() && providers.environmentVariable("MAVEN_PASSWORD").isPresent();
var checkCompatibility = providers.gradleProperty("net.minecraftforge.forge.build.check.compatibility").map(Boolean::parseBoolean).getOrElse(false);

if (!hasMaven && checkCompatibility) {
project.getTasks().named("check", task -> {
task.dependsOn(checkJarCompatibility);
});
}

return checkJarCompatibility;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,12 @@ import javax.inject.Inject
@CompileStatic
abstract class DownloadDependency extends DefaultTask {
static TaskProvider<DownloadDependency> register(Project project, String name, Object dependency) {
return project.tasks.register(name, DownloadDependency) {
it.artifact = dependency;
}
}

public void setArtifact(Object dependency) {
final def unpacked
if (dependency instanceof ProviderConvertible<?>)
unpacked = dependency.asProvider().get()
Expand All @@ -42,15 +48,13 @@ abstract class DownloadDependency extends DefaultTask {
}
)

project.tasks.register(name, DownloadDependency) {
it.output.fileProvider(it.providers.provider {
try {
configuration.singleFile
} catch (IllegalStateException e) {
throw new IllegalArgumentException('Downloaded dependency variant is not a single file', e)
}
})
}
output.fileProvider(providers.provider {
try {
configuration.singleFile
} catch (IllegalStateException e) {
throw new IllegalArgumentException('Downloaded dependency variant is not a single file', e)
}
})
}

abstract @OutputFile RegularFileProperty getOutput()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,13 @@ import groovy.transform.stc.ClosureParams
import groovy.transform.stc.SimpleType
import net.minecraftforge.forgedev.legacy.values.LibraryInfo
import net.minecraftforge.forgedev.legacy.values.MinimalResolvedArtifact
import net.minecraftforge.gradleutils.shared.SharedUtil
import org.gradle.api.Project
import org.gradle.api.Task
import org.gradle.api.artifacts.Configuration
import org.gradle.api.artifacts.Dependency
import org.gradle.api.artifacts.ResolvedArtifact
import org.gradle.api.provider.HasConfigurableValue
import org.gradle.api.provider.MapProperty
import org.gradle.api.provider.Provider
import org.gradle.api.provider.SetProperty
Expand Down Expand Up @@ -181,11 +184,11 @@ final class Util {
}

@CompileDynamic
private static Provider<Map<String, MinimalResolvedArtifact>> artifactTree(Project project, String artifact, boolean transitive = true) {
static Provider<Map<String, MinimalResolvedArtifact>> artifactTree(Project project, String artifact, boolean transitive = true) {
return MinimalResolvedArtifact.from(project, project.configurations.detachedConfiguration(
project.dependencies.create(artifact)
).tap { it.transitive = transitive }).map { list ->
var map = new HashMap<String, MinimalResolvedArtifact>(list.size())
var map = new LinkedHashMap<String, MinimalResolvedArtifact>(list.size())
for (var minimal in list) {
map.put(minimal.info().key(), minimal)
}
Expand Down Expand Up @@ -239,4 +242,32 @@ final class Util {
}
}
}

@CompileDynamic
static String asArtifactString(Object artifact) {
def value = SharedUtil.unpack(artifact)
if (!(value instanceof Dependency))
throw new IllegalArgumentException("Cannot get non-dependency as artifact string! Found: $value.class")

def classifier = value.hasProperty('classifier') ? ":$value.classifier" : ''
def extension = value.hasProperty('artifactType') ? "@$value.artifactType" : value.hasProperty('extension') ? "@$value.extension" : ''
classifier = classifier != ':null' ? classifier : ''
extension = extension != '@null' ? extension : ''

"$value.group:$value.name:$value.version$classifier$extension".toString()
}

static <R extends HasConfigurableValue> R finalize(Project project, R ret) {
ret.disallowChanges();
ret.finalizeValueOnRead();
return ret;
}

static String capitalize(String s) {
return s.capitalize();
}

static String kebab(String s) {
s.replaceAll('([A-Z])', '-$1').toLowerCase()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,22 +5,39 @@
package net.minecraftforge.forgedev.legacy.values;

import net.minecraftforge.forgedev.legacy.tasks.Util;
import org.gradle.api.Action;
import org.gradle.api.Project;
import org.gradle.api.Transformer;
import org.gradle.api.artifacts.Configuration;
import org.gradle.api.provider.Provider;
import org.gradle.api.tasks.TaskProvider;
import org.gradle.api.tasks.bundling.AbstractArchiveTask;
import org.gradle.plugins.ide.eclipse.model.Library;

import java.io.File;
import java.io.Serializable;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Semaphore;

public record LibraryInfo(String name, Downloads downloads) implements Serializable {
public record Downloads(ArtifactInfo artifact) implements Serializable {
public record ArtifactInfo(String path, String url, String sha1, long size) implements Serializable {
public static class ArtifactInfo implements Serializable {
public String path;
public String url;
public String sha1;
public long size;

public ArtifactInfo(String path, String url, String sha1, long size) {
this.path = path;
this.url = url;
this.sha1 = sha1;
this.size = size;
}

public ArtifactInfo validateUrl(boolean offline) {
if (offline || !url.startsWith("https://libraries.minecraft.net/"))
return this;
Expand Down Expand Up @@ -57,41 +74,48 @@ public static Map<String, LibraryInfo> from(Collection<MinimalResolvedArtifact>
return from(dependencies, Boolean.valueOf(validateUrl));
}

public static LibraryInfo from(MinimalResolvedArtifact dependency) {
var info = dependency.info();
var url = "https://libraries.minecraft.net/" + info.path();
if (!Util.checkExists(url))
url = "https://maven.minecraftforge.net/" + info.path();

var file = dependency.file();
var sha1 = Util.sha1(dependency.file());

return new LibraryInfo(
info.name(),
info.path(),
url,
sha1,
file.length()
);
}

private static Map<String, LibraryInfo> from(Collection<MinimalResolvedArtifact> dependencies, Boolean offline) {
var ret = new HashMap<String, LibraryInfo>(dependencies.size());
var ret = new LinkedHashMap<String, LibraryInfo>(dependencies.size());
var semaphore = new Semaphore(1, true);
dependencies.parallelStream().forEachOrdered(dependency -> {
var info = dependency.info();
var url = "https://libraries.minecraft.net/" + info.path();
if (!Util.checkExists(url))
url = "https://maven.minecraftforge.net/" + info.path();

var file = dependency.file();
var sha1 = Util.sha1(dependency.file());
var library = from(dependency);
if (offline != null)
library = library.validateUrl(offline);

try {
semaphore.acquire();
ret.put(dependency.info().key(), library);
semaphore.release();
} catch (InterruptedException e) {
throw new RuntimeException("Interrupted while trying to get library info for " + dependency.info(), e);
}

var library = new LibraryInfo(
info.name(),
info.path(),
url,
sha1,
file.length()
);
if (offline != null)
library = library.validateUrl(offline);
ret.put(info.key(), library);

semaphore.release();
});

return ret;
}

public static Provider<LibraryInfo> from(Project project, TaskProvider<? extends AbstractArchiveTask> task) {
return MinimalResolvedArtifact.from(project, task).map(LibraryInfo::from);
}

@SafeVarargs
public static Provider<Map<String, LibraryInfo>> from(Project project, TaskProvider<? extends AbstractArchiveTask>... tasks) {
var dependencies = project.getObjects().listProperty(MinimalResolvedArtifact.class);
Expand All @@ -100,17 +124,21 @@ public static Provider<Map<String, LibraryInfo>> from(Project project, TaskProvi
}

var ret = project.getObjects().mapProperty(String.class, LibraryInfo.class).value(dependencies.map(LibraryInfo::from));

ret.disallowChanges();
ret.finalizeValueOnRead();
if (project.getState().getExecuted()) {
ret.finalizeValue();
}

return ret;
return Util.finalize(project, ret);
}

public static Provider<Map<String, LibraryInfo>> from(Project project, Configuration configuration) {
return MinimalResolvedArtifact.from(project, configuration).map(LibraryInfo::from);
}

public static List<LibraryInfo> toList(List<MinimalResolvedArtifact> list) {
return list.stream().map(LibraryInfo::from).toList();
}

public static Transformer<LibraryInfo, LibraryInfo> apply(Action<LibraryInfo> action) {
return info -> {
action.execute(info);
return info;
};
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,32 @@ public int compareTo(MavenInfo that) {
return this.key.compareTo(that.key);
}

public static MavenInfo from(String gav) {
var parts = gav.split(":");
var group = parts[0];
var name = parts[1];
var version = parts[2];

String classifier = null;
String extension = null;

if (parts.length > 3) {
classifier = parts[3];
var idx = classifier.indexOf('@');
if (idx != -1) {
classifier = classifier.substring(0, idx);
extension = classifier.substring(idx + 1);
}
} else {
var idx = version.indexOf('@');
if (idx != -1) {
version = version.substring(0, idx);
extension = version.substring(idx + 1);
}
}
return from(group, name, version, classifier, extension);
}

public static MavenInfo from(String artGroup, String artName, String artVersion, @Nullable String artClassifier, @Nullable String artExtension) {
if (artExtension == null)
artExtension = "jar";
Expand Down
Loading