Skip to content

Commit

Permalink
Revert to hidden detached configuration (#353)
Browse files Browse the repository at this point in the history
* Format RewritePluginTest.kt

* Revert "Simplify Plugins approach to adding dependencies so that it no longer uses a hidden detached configuration. (#345)"

This reverts commit 147c7ef.
  • Loading branch information
timtebeek authored Dec 9, 2024
1 parent e675089 commit 13bbc11
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 49 deletions.
80 changes: 35 additions & 45 deletions plugin/src/main/java/org/openrewrite/gradle/RewritePlugin.java
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,7 @@
import java.io.File;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import static org.gradle.api.attributes.Bundling.BUNDLING_ATTRIBUTE;
Expand Down Expand Up @@ -72,43 +70,8 @@ public void apply(Project project) {

// Rewrite module dependencies put here will be available to all rewrite tasks
Configuration rewriteConf = project.getConfigurations().maybeCreate("rewrite");
// Defer actually evaluating the dependencies until resolution is triggered. This should allow
// the user to set the rewrite version in the extension. `addLater` doesn't work here because
// it operates on a single dependency at a time.
rewriteConf.getIncoming().beforeResolve(conf -> {
rewriteConf.getDependencies().addAll(
knownRewriteDependencies(extension, project.getDependencies())
);
});

// Because of how this Gradle has no criteria with which to select between variants of
// dependencies which expose differing capabilities. So those must be manually configured
try {
final ObjectFactory objectFactory = project.getObjects();
rewriteConf.attributes(attributes -> {
// Adapted from org.gradle.api.plugins.jvm.internal.DefaultJvmEcosystemAttributesDetails
attributes.attribute(
Category.CATEGORY_ATTRIBUTE, objectFactory.named(Category.class, Category.LIBRARY));
attributes.attribute(Usage.USAGE_ATTRIBUTE, objectFactory.named(Usage.class, Usage.JAVA_RUNTIME));
attributes.attribute(
LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE,
objectFactory.named(LibraryElements.class, LibraryElements.JAR));
attributes.attribute(BUNDLING_ATTRIBUTE, objectFactory.named(Bundling.class, Bundling.EXTERNAL));
try {
attributes.attribute(
TARGET_JVM_ENVIRONMENT_ATTRIBUTE,
objectFactory.named(TargetJvmEnvironment.class, TargetJvmEnvironment.STANDARD_JVM));
} catch (final NoClassDefFoundError ex) {
// Old versions of Gradle don't have the class TargetJvmEnvironment and that's OK, we can always
// try this attribute instead
attributes.attribute(Attribute.of("org.gradle.jvm.environment", String.class), "standard-jvm");
}
});
} catch (final NoClassDefFoundError ex) {
// Old versions of Gradle don't have all of these attributes and that's OK
}

Provider<Set<File>> resolvedDependenciesProvider = project.provider(() -> getResolvedDependencies(rewriteConf));
Provider<Set<File>> resolvedDependenciesProvider = project.provider(() -> getResolvedDependencies(project, extension, rewriteConf));

TaskProvider<RewriteRunTask> rewriteRun = project.getTasks().register("rewriteRun", RewriteRunTask.class, task -> {
task.setExtension(extension);
Expand Down Expand Up @@ -190,16 +153,43 @@ private static void configureProject(Project project, RewriteExtension extension
});
}

private Set<File> getResolvedDependencies(Configuration rewriteConf) {
if (resolvedDependencies != null) {
return resolvedDependencies;
}
private Set<File> getResolvedDependencies(Project project, RewriteExtension extension, Configuration rewriteConf) {
if (resolvedDependencies == null) {
Dependency[] dependencies = Stream.concat(
knownRewriteDependencies(extension, project.getDependencies()),
rewriteConf.getDependencies().stream()
).toArray(Dependency[]::new);
// By using a detached configuration, we separate this dependency resolution from the rest of the project's
// configuration. This also means that Gradle has no criteria with which to select between variants of
// dependencies which expose differing capabilities. So those must be manually configured
Configuration detachedConf = project.getConfigurations().detachedConfiguration(dependencies);

try {
ObjectFactory objectFactory = project.getObjects();
detachedConf.attributes(attributes -> {
// Adapted from org.gradle.api.plugins.jvm.internal.DefaultJvmEcosystemAttributesDetails
attributes.attribute(Category.CATEGORY_ATTRIBUTE, objectFactory.named(Category.class, Category.LIBRARY));
attributes.attribute(Usage.USAGE_ATTRIBUTE, objectFactory.named(Usage.class, Usage.JAVA_RUNTIME));
attributes.attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, objectFactory.named(LibraryElements.class, LibraryElements.JAR));
attributes.attribute(BUNDLING_ATTRIBUTE, objectFactory.named(Bundling.class, Bundling.EXTERNAL));
try {
attributes.attribute(TARGET_JVM_ENVIRONMENT_ATTRIBUTE, objectFactory.named(TargetJvmEnvironment.class, TargetJvmEnvironment.STANDARD_JVM));
} catch (NoClassDefFoundError e) {
// Old versions of Gradle don't have the class TargetJvmEnvironment and that's OK, we can always
// try this attribute instead
attributes.attribute(Attribute.of("org.gradle.jvm.environment", String.class), "standard-jvm");
}
});
} catch (NoClassDefFoundError e) {
// Old versions of Gradle don't have all of these attributes and that's OK
}

resolvedDependencies = rewriteConf.resolve();
resolvedDependencies = detachedConf.resolve();
}
return resolvedDependencies;
}

private static List<Dependency> knownRewriteDependencies(RewriteExtension extension, DependencyHandler deps) {
private static Stream<Dependency> knownRewriteDependencies(RewriteExtension extension, DependencyHandler deps) {
String rewriteVersion = extension.getRewriteVersion();
return Stream.of(
deps.create("org.openrewrite:rewrite-core:" + rewriteVersion),
Expand All @@ -222,6 +212,6 @@ private static List<Dependency> knownRewriteDependencies(RewriteExtension extens
deps.create("org.openrewrite.gradle.tooling:model:" + extension.getRewriteGradleModelVersion()),
deps.create("com.fasterxml.jackson.module:jackson-module-kotlin:" + extension.getJacksonModuleKotlinVersion()),
deps.create("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:" + extension.getJacksonModuleKotlinVersion())
).collect(Collectors.toList());
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,8 @@ interface RewritePluginTest {
@TempDir projectDir: File
) {
gradleProject(projectDir) {
buildGradle("""
buildGradle(
"""
plugins {
id("org.openrewrite.rewrite")
}
Expand All @@ -84,7 +85,8 @@ interface RewritePluginTest {
url = uri("https://oss.sonatype.org/content/repositories/snapshots")
}
}
""")
"""
)
}
val result = runGradle(projectDir, taskName(), "--configuration-cache")
val taskResult = result.task(":${taskName()}")!!
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1595,7 +1595,7 @@ class RewriteRunTest : RewritePluginTest {
}
apply from: 'dependencies.gradle'
"""
"""
)
otherGradleScript(
"dependencies.gradle", """
Expand All @@ -1609,7 +1609,7 @@ class RewriteRunTest : RewritePluginTest {
dependencies {
implementation("com.fasterxml.jackson.core:jackson-databind:2.15.2")
}
"""
"""
)
}
projectDir.resolve("build").mkdirs()
Expand Down

0 comments on commit 13bbc11

Please sign in to comment.