Skip to content

Instantly share code, notes, and snippets.

@lptr
Created May 30, 2024 08:56
Show Gist options
  • Save lptr/32869db7db8330ea95118ab1da0c4037 to your computer and use it in GitHub Desktop.
Save lptr/32869db7db8330ea95118ab1da0c4037 to your computer and use it in GitHub Desktop.
diff --git a/subprojects/diagnostics/src/integTest/groovy/org/gradle/api/tasks/diagnostics/DependencyReportTaskIntegrationTest.groovy b/subprojects/diagnostics/src/integTest/groovy/org/gradle/api/tasks/diagnostics/DependencyReportTaskIntegrationTest.groovy
index cc0dc29df19..82d0d2b71e6 100644
--- a/subprojects/diagnostics/src/integTest/groovy/org/gradle/api/tasks/diagnostics/DependencyReportTaskIntegrationTest.groovy
+++ b/subprojects/diagnostics/src/integTest/groovy/org/gradle/api/tasks/diagnostics/DependencyReportTaskIntegrationTest.groovy
@@ -116,7 +116,7 @@ conf
when:
executer.noExtraLogging()
- run "dependencies"
+ run "dependencies", "--stacktrace"
then:
output.contains """
diff --git a/subprojects/diagnostics/src/main/java/org/gradle/api/tasks/diagnostics/AbstractDependencyReportTask.java b/subprojects/diagnostics/src/main/java/org/gradle/api/tasks/diagnostics/AbstractDependencyReportTask.java
index 9e3c96cf16d..f9ab0357315 100644
--- a/subprojects/diagnostics/src/main/java/org/gradle/api/tasks/diagnostics/AbstractDependencyReportTask.java
+++ b/subprojects/diagnostics/src/main/java/org/gradle/api/tasks/diagnostics/AbstractDependencyReportTask.java
@@ -15,11 +15,15 @@
*/
package org.gradle.api.tasks.diagnostics;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
import org.gradle.api.Incubating;
import org.gradle.api.Project;
import org.gradle.api.artifacts.Configuration;
import org.gradle.api.artifacts.ConfigurationContainer;
import org.gradle.api.internal.artifacts.configurations.ConfigurationInternal;
+import org.gradle.api.provider.Property;
+import org.gradle.api.provider.SetProperty;
import org.gradle.api.tasks.Internal;
import org.gradle.api.tasks.diagnostics.internal.ConfigurationDetails;
import org.gradle.api.tasks.diagnostics.internal.ConfigurationFinder;
@@ -28,16 +32,21 @@
import org.gradle.api.tasks.diagnostics.internal.ReportRenderer;
import org.gradle.api.tasks.diagnostics.internal.dependencies.AsciiDependencyReportRenderer;
import org.gradle.api.tasks.options.Option;
+import org.gradle.internal.instrumentation.api.annotations.InterceptCalls;
+import org.gradle.internal.instrumentation.api.annotations.InterceptInherited;
+import org.gradle.internal.instrumentation.api.annotations.ReplacedAccessor;
+import org.gradle.internal.instrumentation.api.annotations.ReplacesEagerProperty;
+import org.gradle.internal.instrumentation.api.annotations.SpecificGroovyCallInterceptors;
+import org.gradle.internal.instrumentation.api.annotations.SpecificJvmCallInterceptors;
+import org.gradle.internal.instrumentation.api.declarations.InterceptorDeclaration;
+import org.gradle.internal.instrumentation.api.types.BytecodeInterceptorType;
import org.gradle.work.DisableCachingByDefault;
-import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
-import java.util.SortedSet;
-import java.util.TreeSet;
/**
* Displays the dependency tree for a configuration.
@@ -47,7 +56,12 @@ public abstract class AbstractDependencyReportTask extends AbstractProjectBasedR
private DependencyReportRenderer renderer = new AsciiDependencyReportRenderer();
- private transient Set<Configuration> configurations;
+ public AbstractDependencyReportTask() {
+ getConfigurations().convention(getConfiguration()
+ .map(Collections::singleton)
+ .orElse(getProject().provider(this::getNonDeprecatedTaskConfigurations))
+ );
+ }
@Override
public ReportRenderer getRenderer() {
@@ -61,7 +75,6 @@ public void setRenderer(DependencyReportRenderer renderer) {
this.renderer = renderer;
}
-
/**
* Report model.
*
@@ -78,13 +91,11 @@ private DependencyReportModel(List<ConfigurationDetails> configurations) {
@Override
protected DependencyReportModel calculateReportModelFor(Project project) {
- SortedSet<Configuration> sortedConfigurations = new TreeSet<>(Comparator.comparing(Configuration::getName));
- sortedConfigurations.addAll(getReportConfigurations());
- List<ConfigurationDetails> configurationDetails = new ArrayList<>(sortedConfigurations.size());
- for (Configuration configuration : sortedConfigurations) {
- configurationDetails.add(ConfigurationDetails.of(configuration));
- }
- return new DependencyReportModel(configurationDetails);
+ return new DependencyReportModel(getConfigurations().get().stream()
+ .sorted(Comparator.naturalOrder())
+ .map(configurationName -> ConfigurationFinder.find(project.getConfigurations(), configurationName))
+ .map(ConfigurationDetails::of)
+ .collect(ImmutableList.toImmutableList()));
}
@Override
@@ -96,45 +107,86 @@ protected void generateReportFor(ProjectDetails project, DependencyReportModel m
}
}
- private Set<Configuration> getReportConfigurations() {
- return configurations != null ? configurations : getNonDeprecatedTaskConfigurations();
- }
-
/**
- * Returns the configurations to generate the report for. Defaults to all configurations of this task's containing
+ * Returns the configurations (by name) to generate the report for. Defaults to all configurations of this task's containing
* project.
*
* @return the configurations.
*/
@Internal
- public Set<Configuration> getConfigurations() {
- return configurations;
+ @ReplacesEagerProperty(
+ adaptor = ConfigurationInterceptors.class
+ )
+ abstract public SetProperty<String> getConfigurations();
+
+ @SuppressWarnings("NewMethodNamingConvention")
+ @SpecificJvmCallInterceptors(generatedClassName = InterceptorDeclaration.JVM_BYTECODE_GENERATED_CLASS_NAME_FOR_PROPERTY_UPGRADES, type = BytecodeInterceptorType.BYTECODE_UPGRADE)
+ @SpecificGroovyCallInterceptors(generatedClassName = InterceptorDeclaration.GROOVY_INTERCEPTORS_GENERATED_CLASS_NAME_FOR_CONFIG_CACHE, type = BytecodeInterceptorType.BYTECODE_UPGRADE)
+ public static class ConfigurationInterceptors {
+ @InterceptCalls
+ @InterceptInherited
+ static Set<Configuration> intercept_getConfigurations(
+ AbstractDependencyReportTask thiz
+ ) {
+ return thiz.getConfigurations()
+ .map(configurations -> configurations.stream()
+ .map(configurationName -> ConfigurationFinder.find(thiz.getProject().getConfigurations(), configurationName))
+ .collect(ImmutableSet.toImmutableSet()))
+ .get();
+ }
+
+ @InterceptCalls
+ @InterceptInherited
+ static void intercept_setConfigurations(
+ AbstractDependencyReportTask thiz,
+ Set<Configuration> configurations
+ ) {
+ thiz.getConfigurations().set(configurations.stream()
+ .map(Configuration::getName)
+ .collect(ImmutableSet.toImmutableSet()));
+ }
}
- /**
- * Sets the configurations to generate the report for.
- *
- * @param configurations The configuration. Must not be null.
- */
- public void setConfigurations(Set<Configuration> configurations) {
- this.configurations = configurations;
+ @BytecodeUpgradeAdaptor
+ public static class AbstractDependencyReportTaskAdaptor {
+ @BytecodeUpgrade
+ static Set<Configuration> getConfigurations(
+ AbstractDependencyReportTask thiz
+ ) {
+ return thiz.getConfigurations()
+ .map(configurations -> configurations.stream()
+ .map(configurationName -> ConfigurationFinder.find(thiz.getProject().getConfigurations(), configurationName))
+ .collect(ImmutableSet.toImmutableSet()))
+ .get();
+ }
+
+ @InterceptCalls
+ @InterceptInherited
+ static void intercept_setConfigurations(
+ AbstractDependencyReportTask thiz,
+ Set<Configuration> configurations
+ ) {
+ thiz.getConfigurations().set(configurations.stream()
+ .map(Configuration::getName)
+ .collect(ImmutableSet.toImmutableSet()));
+ }
}
+
+
/**
* Sets the single configuration (by name) to generate the report for.
- *
- * @param configurationName name of the configuration to generate the report for
*/
@Option(option = "configuration", description = "The configuration to generate the report for.")
- public void setConfiguration(String configurationName) {
- this.configurations = Collections.singleton(ConfigurationFinder.find(getTaskConfigurations(), configurationName));
- }
+ @Internal
+ @ReplacesEagerProperty(replacedAccessors = @ReplacedAccessor(name = "setConfiguration", value = ReplacedAccessor.AccessorType.SETTER))
+ abstract public Property<String> getConfiguration();
- private Set<Configuration> getNonDeprecatedTaskConfigurations() {
- Set<Configuration> filteredConfigurations = new HashSet<>();
+ private Set<String> getNonDeprecatedTaskConfigurations() {
+ Set<String> filteredConfigurations = new HashSet<>();
for (Configuration configuration : getTaskConfigurations()) {
- if (((ConfigurationInternal)configuration).isDeclarableByExtension()) {
- filteredConfigurations.add(configuration);
+ if (((ConfigurationInternal) configuration).isDeclarableByExtension()) {
+ filteredConfigurations.add(configuration.getName());
}
}
return filteredConfigurations;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment