Created
May 30, 2024 08:56
-
-
Save lptr/32869db7db8330ea95118ab1da0c4037 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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