Skip to content

Commit

Permalink
Stub-based dependency resolution approach
Browse files Browse the repository at this point in the history
  • Loading branch information
lukebemish committed Oct 22, 2024
1 parent 4087c8e commit e20ed35
Show file tree
Hide file tree
Showing 9 changed files with 378 additions and 24 deletions.
13 changes: 13 additions & 0 deletions src/main/java/dev/lukebemish/crochet/CrochetProperties.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package dev.lukebemish.crochet;

public final class CrochetProperties {
private CrochetProperties() {}

public static final String TASKGRAPHRUNNER_LOG_LEVEL = "dev.lukebemish.crochet.taskgraphrunner.logging.level";
public static final String TASKGRAPHRUNNER_REMOVE_ASSET_DURATION = "dev.lukebemish.crochet.taskgraphrunner.cache.remove-assets-after";
public static final String TASKGRAPHRUNNER_REMOVE_OUTPUT_DURATION = "dev.lukebemish.crochet.taskgraphrunner.cache.remove-outputs-after";
public static final String TASKGRAPHRUNNER_REMOVE_LOCK_DURATION = "dev.lukebemish.crochet.taskgraphrunner.cache.remove-locks-after";

public static final String USE_STUB_GENERATED_MINECRAFT_DEPENDENCIES = "dev.lukebemish.crochet.dependencies.use-stub-generated-minecraft-dependencies";
public static final String ADD_LIKELY_REPOSITORIES = "dev.lukebemish.crochet.dependencies.add-likely-repositories";
}
32 changes: 11 additions & 21 deletions src/main/java/dev/lukebemish/crochet/internal/CrochetPlugin.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package dev.lukebemish.crochet.internal;

import dev.lukebemish.crochet.CrochetProperties;
import dev.lukebemish.crochet.model.CrochetExtension;
import org.gradle.api.Plugin;
import org.gradle.api.Project;
Expand Down Expand Up @@ -32,20 +33,15 @@ public class CrochetPlugin implements Plugin<Project> {
public static final String CROCHET_REMAP_TYPE_REMAP = "to-remap";
// Dependencies on other projects contents', non-remapped components
public static final String CROCHET_REMAP_TYPE_NON_REMAP = "not-to-remap";
public static final String CROCHET_REMAP_TYPE_REMAPPED = "remapped";
public static final String CROCHET_CLASSPATH_GROUPING_CATEGORY = "crochet.classpathgrouping";

private static final String PROPERTY_TASKGRAPHRUNNER_LOG_LEVEL = "dev.lukebemish.crochet.taskgraphrunner.logging.level";
private static final String PROPERTY_TASKGRAPHRUNNER_REMOVE_ASSET_DURATION = "dev.lukebemish.crochet.taskgraphrunner.cache.remove-assets-after";
private static final String PROPERTY_TASKGRAPHRUNNER_REMOVE_OUTPUT_DURATION = "dev.lukebemish.crochet.taskgraphrunner.cache.remove-outputs-after";
private static final String PROPERTY_TASKGRAPHRUNNER_REMOVE_LOCK_DURATION = "dev.lukebemish.crochet.taskgraphrunner.cache.remove-locks-after";

@Override
public void apply(@NotNull Project project) {
if (!project.getGradle().getPlugins().hasPlugin(CrochetRepositoriesPlugin.class)) {
project.getPlugins().apply(CrochetRepositoriesPlugin.class);
} else {
project.getLogger().debug("Skipping application of crochet repositories as it was applied at the settings level; you may still apply the plugin manually");
if (project.getProviders().gradleProperty(CrochetProperties.ADD_LIKELY_REPOSITORIES).map(Boolean::parseBoolean).orElse(true).get()) {
if (!project.getGradle().getPlugins().hasPlugin(CrochetRepositoriesPlugin.class)) {
project.getPlugins().apply(CrochetRepositoriesPlugin.class);
} else {
project.getLogger().debug("Skipping application of crochet repositories as it was applied at the settings level; you may still apply the plugin manually");
}
}

project.getPluginManager().apply("java-library");
Expand Down Expand Up @@ -95,19 +91,13 @@ public void apply(@NotNull Project project) {

project.getGradle().getSharedServices().registerIfAbsent("taskGraphRunnerDaemon", TaskGraphRunnerService.class, spec -> {
spec.getParameters().getHideStacktrace().convention(project.getGradle().getStartParameter().getShowStacktrace() == ShowStacktrace.INTERNAL_EXCEPTIONS);
spec.getParameters().getLogLevel().convention(project.getProviders().gradleProperty(PROPERTY_TASKGRAPHRUNNER_LOG_LEVEL).orElse("INFO"));
spec.getParameters().getRemoveUnusedAssetsAfterDays().convention(project.getProviders().gradleProperty(PROPERTY_TASKGRAPHRUNNER_REMOVE_ASSET_DURATION).map(Integer::parseInt).orElse(30));
spec.getParameters().getRemoveUnusedOutputsAfterDays().convention(project.getProviders().gradleProperty(PROPERTY_TASKGRAPHRUNNER_REMOVE_OUTPUT_DURATION).map(Integer::parseInt).orElse(30));
spec.getParameters().getRemoveUnusedLocksAfterDays().convention(project.getProviders().gradleProperty(PROPERTY_TASKGRAPHRUNNER_REMOVE_LOCK_DURATION).map(Integer::parseInt).orElse(1));
spec.getParameters().getLogLevel().convention(project.getProviders().gradleProperty(CrochetProperties.TASKGRAPHRUNNER_LOG_LEVEL).orElse("INFO"));
spec.getParameters().getRemoveUnusedAssetsAfterDays().convention(project.getProviders().gradleProperty(CrochetProperties.TASKGRAPHRUNNER_REMOVE_ASSET_DURATION).map(Integer::parseInt).orElse(30));
spec.getParameters().getRemoveUnusedOutputsAfterDays().convention(project.getProviders().gradleProperty(CrochetProperties.TASKGRAPHRUNNER_REMOVE_OUTPUT_DURATION).map(Integer::parseInt).orElse(30));
spec.getParameters().getRemoveUnusedLocksAfterDays().convention(project.getProviders().gradleProperty(CrochetProperties.TASKGRAPHRUNNER_REMOVE_LOCK_DURATION).map(Integer::parseInt).orElse(1));
});

applyDisambiguationRules(project);
applyComponentRules(project);
}

private static void applyComponentRules(Project project) {
project.getDependencies().getComponents().withModule("net.fabricmc:fabric-loader", FabricInstallerRule.class);
project.getDependencies().getComponents().withModule("org.quiltmc:quilt-loader", FabricInstallerRule.class);
}

private static void applyDisambiguationRules(Project project) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
package dev.lukebemish.crochet.internal;

import dev.lukebemish.crochet.internal.pistonmeta.PistonMetaMetadataRule;
import dev.lukebemish.crochet.internal.pistonmeta.PistonMetaVersionLister;
import dev.lukebemish.crochet.internal.pistonmeta.VersionManifest;
import org.gradle.api.GradleException;
import org.gradle.api.Plugin;
import org.gradle.api.Project;
import org.gradle.api.artifacts.dsl.ComponentMetadataHandler;
import org.gradle.api.artifacts.dsl.RepositoryHandler;
import org.gradle.api.artifacts.repositories.IvyArtifactRepository;
import org.gradle.api.artifacts.repositories.MavenArtifactRepository;
import org.gradle.api.initialization.Settings;
import org.gradle.api.invocation.Gradle;
Expand All @@ -17,14 +22,24 @@ public void apply(Object target) {
if (target instanceof Project project) {
// We allow applying this plugin at the project level if someone wants to use it settings-level but override repositories for a project.
repositories(project.getRepositories());
components(project.getDependencies().getComponents());
} else if (target instanceof Settings settings) {
repositories(settings.getDependencyResolutionManagement().getRepositories());
components(settings.getDependencyResolutionManagement().getComponents());
settings.getGradle().getPlugins().apply(CrochetRepositoriesPlugin.class);
} else if (!(target instanceof Gradle)) {
throw new GradleException("This plugin does not support being applied to " + target);
}
}

private static void components(ComponentMetadataHandler components) {
components.withModule("net.fabricmc:fabric-loader", FabricInstallerRule.class);
components.withModule("org.quiltmc:quilt-loader", FabricInstallerRule.class);

components.withModule("dev.lukebemish.crochet:"+PistonMetaMetadataRule.MINECRAFT_DEPENDENCIES, PistonMetaMetadataRule.class);
components.withModule("dev.lukebemish.crochet:"+PistonMetaMetadataRule.MINECRAFT_DEPENDENCIES_NATIVES, PistonMetaMetadataRule.class);
}

private static void repositories(RepositoryHandler repositoryHandler) {
var minecraftLibraries = repositoryHandler.maven(repo -> {
repo.setName("Minecraft Libraries");
Expand All @@ -35,6 +50,20 @@ private static void repositories(RepositoryHandler repositoryHandler) {
repositoryHandler.remove(minecraftLibraries);
repositoryHandler.addFirst(minecraftLibraries);

repositoryHandler.ivy(repo -> {
repo.setName("Piston Meta Minecraft Dependencies");
repo.setUrl(VersionManifest.PISTON_META_URL);
repo.patternLayout(layout ->
layout.artifact("mc/game/version_manifest_v2.json")
);
repo.metadataSources(IvyArtifactRepository.MetadataSources::artifact);
repo.setComponentVersionsLister(PistonMetaVersionLister.class);
repo.content(content -> {
content.includeModule("dev.lukebemish.crochet", PistonMetaMetadataRule.MINECRAFT_DEPENDENCIES);
content.includeModule("dev.lukebemish.crochet", PistonMetaMetadataRule.MINECRAFT_DEPENDENCIES_NATIVES);
});
});

// Tempted to make this an exclusive repository but decided it wasn't worth it
var neoMinecraftDependencies = repositoryHandler.maven(repo -> {
repo.setName("Neoforge Minecraft Dependencies");
Expand Down
Loading

0 comments on commit e20ed35

Please sign in to comment.