From a455d5590697c38bc4d00666b0b699bf2af28fbb Mon Sep 17 00:00:00 2001 From: Roberto Perez Alcolea Date: Tue, 21 Mar 2023 14:56:31 -0700 Subject: [PATCH 1/2] VerifyPublicationTask: use Provider instead of runtimeClasspath --- .../verification/PublishVerificationPlugin.groovy | 2 +- .../verification/VerifyPublicationTask.groovy | 15 ++++++++------- .../verification/VerifyPublicationTaskSpec.groovy | 2 +- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/main/groovy/nebula/plugin/publishing/verification/PublishVerificationPlugin.groovy b/src/main/groovy/nebula/plugin/publishing/verification/PublishVerificationPlugin.groovy index 075511c..6e45259 100644 --- a/src/main/groovy/nebula/plugin/publishing/verification/PublishVerificationPlugin.groovy +++ b/src/main/groovy/nebula/plugin/publishing/verification/PublishVerificationPlugin.groovy @@ -57,7 +57,7 @@ class PublishVerificationPlugin implements Plugin { void execute(VerifyPublicationTask verifyPublicationTask) { verifyPublicationTask.projectName.set(project.name) verifyPublicationTask.targetStatus.set(project.status.toString()) - verifyPublicationTask.runtimeClasspath.set(project.configurations.named(sourceSet.getRuntimeClasspathConfigurationName())) + verifyPublicationTask.resolvedComponentResultProvider = project.configurations.named(sourceSet.getRuntimeClasspathConfigurationName()).get().incoming.resolutionResult.rootComponent verifyPublicationTask.ignore.set(extension.ignore) verifyPublicationTask.ignoreGroups.set(extension.ignoreGroups) verifyPublicationTask.verificationViolationsCollectorHolderExtension.set(verificationViolationsCollectorHolderExtension) diff --git a/src/main/groovy/nebula/plugin/publishing/verification/VerifyPublicationTask.groovy b/src/main/groovy/nebula/plugin/publishing/verification/VerifyPublicationTask.groovy index 889b1ea..d3642f9 100644 --- a/src/main/groovy/nebula/plugin/publishing/verification/VerifyPublicationTask.groovy +++ b/src/main/groovy/nebula/plugin/publishing/verification/VerifyPublicationTask.groovy @@ -4,10 +4,12 @@ import org.gradle.api.DefaultTask import org.gradle.api.artifacts.* import org.gradle.api.artifacts.component.ProjectComponentIdentifier import org.gradle.api.artifacts.result.DependencyResult +import org.gradle.api.artifacts.result.ResolvedComponentResult import org.gradle.api.artifacts.result.ResolvedDependencyResult import org.gradle.api.artifacts.result.UnresolvedDependencyResult import org.gradle.api.provider.ListProperty import org.gradle.api.provider.Property +import org.gradle.api.provider.Provider import org.gradle.api.provider.SetProperty import org.gradle.api.tasks.Classpath import org.gradle.api.tasks.Input @@ -28,13 +30,12 @@ abstract class VerifyPublicationTask extends DefaultTask { @Input abstract Property getTargetStatus() - @InputFiles - @Classpath - abstract Property getRuntimeClasspath() - @Input abstract Property getProjectName() + @Internal + Provider resolvedComponentResultProvider + @Input abstract ListProperty getDefinedDependencies() @@ -47,7 +48,7 @@ abstract class VerifyPublicationTask extends DefaultTask { @TaskAction void verifyDependencies() { - Set firstLevel = getNonProjectDependencies(runtimeClasspath.get()) + Set firstLevel = getNonProjectDependencies(resolvedComponentResultProvider.get()) List violations = new StatusVerification(ignore.get(), ignoreGroups.get(), targetStatus.get()).verify(firstLevel) List versionViolations = new VersionSelectorVerification(ignore.get(), ignoreGroups.get()).verify(definedDependencies.get()) @@ -55,8 +56,8 @@ abstract class VerifyPublicationTask extends DefaultTask { verificationViolationsCollectorHolderExtension.get().collector.put(projectName.get(), new ViolationsContainer(statusViolations: violations, versionSelectorViolations: versionViolations)) } - private static Set getNonProjectDependencies(Configuration runtimeClasspath) { - Set firstLevelDependencies = runtimeClasspath.incoming.resolutionResult.root.getDependencies() + private static Set getNonProjectDependencies(ResolvedComponentResult resolvedComponentResult) { + Set firstLevelDependencies = resolvedComponentResult.dependencies .findAll { !it.constraint } List unresolvedDependencies = firstLevelDependencies.findAll { it instanceof UnresolvedDependencyResult } as List if (! unresolvedDependencies.isEmpty()) { diff --git a/src/test/groovy/nebula/plugin/publishing/verification/VerifyPublicationTaskSpec.groovy b/src/test/groovy/nebula/plugin/publishing/verification/VerifyPublicationTaskSpec.groovy index 4dbe4f9..d120362 100644 --- a/src/test/groovy/nebula/plugin/publishing/verification/VerifyPublicationTaskSpec.groovy +++ b/src/test/groovy/nebula/plugin/publishing/verification/VerifyPublicationTaskSpec.groovy @@ -130,7 +130,7 @@ class VerifyPublicationTaskSpec extends Specification { task.configure { ignore.set(Collections.emptySet()) ignoreGroups.set(Collections.emptySet()) - runtimeClasspath.set(project.configurations.getByName(project.sourceSets.main.getRuntimeClasspathConfigurationName())) + resolvedComponentResultProvider = project.configurations.named(project.sourceSets.main.getRuntimeClasspathConfigurationName()).get().incoming.resolutionResult.rootComponent definedDependencies.set(project.configurations.collect { Configuration configuration -> configuration.dependencies }.flatten() as List) From 111c4ad34e4b974c4f4de8ec328aac73c17aea1d Mon Sep 17 00:00:00 2001 From: Roberto Perez Alcolea Date: Tue, 21 Mar 2023 15:18:57 -0700 Subject: [PATCH 2/2] Modify VerifyPublicationTask to support configuration cache --- .../verification/DeclaredDependency.groovy | 14 ++++++++++++++ .../verification/PublishVerificationPlugin.groovy | 2 +- .../verification/VerifyPublicationTask.groovy | 9 ++------- .../VersionSelectorVerification.groovy | 4 ++-- .../VersionSelectorVerificationViolation.groovy | 4 +--- .../VerificationReportGeneratorSpec.groovy | 6 +----- .../verification/VerificationReportTaskSpec.groovy | 2 +- .../verification/VerifyPublicationTaskSpec.groovy | 2 +- 8 files changed, 23 insertions(+), 20 deletions(-) create mode 100644 src/main/groovy/nebula/plugin/publishing/verification/DeclaredDependency.groovy diff --git a/src/main/groovy/nebula/plugin/publishing/verification/DeclaredDependency.groovy b/src/main/groovy/nebula/plugin/publishing/verification/DeclaredDependency.groovy new file mode 100644 index 0000000..8ead524 --- /dev/null +++ b/src/main/groovy/nebula/plugin/publishing/verification/DeclaredDependency.groovy @@ -0,0 +1,14 @@ +package nebula.plugin.publishing.verification + +import groovy.transform.Canonical +import groovy.transform.Immutable +import groovy.transform.ToString + +@Canonical +@Immutable +@ToString +class DeclaredDependency implements Serializable { + String group + String name + String version +} diff --git a/src/main/groovy/nebula/plugin/publishing/verification/PublishVerificationPlugin.groovy b/src/main/groovy/nebula/plugin/publishing/verification/PublishVerificationPlugin.groovy index 6e45259..935fd12 100644 --- a/src/main/groovy/nebula/plugin/publishing/verification/PublishVerificationPlugin.groovy +++ b/src/main/groovy/nebula/plugin/publishing/verification/PublishVerificationPlugin.groovy @@ -63,7 +63,7 @@ class PublishVerificationPlugin implements Plugin { verifyPublicationTask.verificationViolationsCollectorHolderExtension.set(verificationViolationsCollectorHolderExtension) verifyPublicationTask.definedDependencies.set(project.configurations.collect { Configuration configuration -> configuration.dependencies - }.flatten() as List) + }.flatten().collect { Dependency dependency -> new DeclaredDependency(dependency.group, dependency.name, dependency.version) } as List) } }) diff --git a/src/main/groovy/nebula/plugin/publishing/verification/VerifyPublicationTask.groovy b/src/main/groovy/nebula/plugin/publishing/verification/VerifyPublicationTask.groovy index d3642f9..8028ee9 100644 --- a/src/main/groovy/nebula/plugin/publishing/verification/VerifyPublicationTask.groovy +++ b/src/main/groovy/nebula/plugin/publishing/verification/VerifyPublicationTask.groovy @@ -11,9 +11,7 @@ import org.gradle.api.provider.ListProperty import org.gradle.api.provider.Property import org.gradle.api.provider.Provider import org.gradle.api.provider.SetProperty -import org.gradle.api.tasks.Classpath import org.gradle.api.tasks.Input -import org.gradle.api.tasks.InputFiles import org.gradle.api.tasks.Internal import org.gradle.api.tasks.TaskAction import org.gradle.work.DisableCachingByDefault @@ -37,15 +35,11 @@ abstract class VerifyPublicationTask extends DefaultTask { Provider resolvedComponentResultProvider @Input - abstract ListProperty getDefinedDependencies() + abstract ListProperty getDefinedDependencies() @Internal abstract Property getVerificationViolationsCollectorHolderExtension() - VerifyPublicationTask() { - this.notCompatibleWithConfigurationCache("VerifyPublicationTask uses disallowed types") - } - @TaskAction void verifyDependencies() { Set firstLevel = getNonProjectDependencies(resolvedComponentResultProvider.get()) @@ -59,6 +53,7 @@ abstract class VerifyPublicationTask extends DefaultTask { private static Set getNonProjectDependencies(ResolvedComponentResult resolvedComponentResult) { Set firstLevelDependencies = resolvedComponentResult.dependencies .findAll { !it.constraint } + List unresolvedDependencies = firstLevelDependencies.findAll { it instanceof UnresolvedDependencyResult } as List if (! unresolvedDependencies.isEmpty()) { UnresolvedDependencyResult unresolvedDependencyResult = (UnresolvedDependencyResult) unresolvedDependencies.first() diff --git a/src/main/groovy/nebula/plugin/publishing/verification/VersionSelectorVerification.groovy b/src/main/groovy/nebula/plugin/publishing/verification/VersionSelectorVerification.groovy index 43c258b..1ac16c2 100644 --- a/src/main/groovy/nebula/plugin/publishing/verification/VersionSelectorVerification.groovy +++ b/src/main/groovy/nebula/plugin/publishing/verification/VersionSelectorVerification.groovy @@ -19,7 +19,7 @@ class VersionSelectorVerification { this.ignore = ignore } - List verify(List dependencies) { + List verify(List dependencies) { dependencies.findAll { it.version != null } .findAll { ! ignoreGroups.contains(it.group) } .findAll { ! ignore.contains(DefaultModuleIdentifier.newId(it.group, it.name)) } @@ -27,7 +27,7 @@ class VersionSelectorVerification { .collect { dependency -> new VersionSelectorVerificationViolation(dependency: dependency) } } - private boolean verifySubVersion(Dependency dependency) { + private boolean verifySubVersion(DeclaredDependency dependency) { VersionSelector selector = parseSelector(dependency.version) selector instanceof SubVersionSelector && !selector.selector.endsWith(".+") } diff --git a/src/main/groovy/nebula/plugin/publishing/verification/VersionSelectorVerificationViolation.groovy b/src/main/groovy/nebula/plugin/publishing/verification/VersionSelectorVerificationViolation.groovy index a680b1d..4941873 100644 --- a/src/main/groovy/nebula/plugin/publishing/verification/VersionSelectorVerificationViolation.groovy +++ b/src/main/groovy/nebula/plugin/publishing/verification/VersionSelectorVerificationViolation.groovy @@ -1,7 +1,5 @@ package nebula.plugin.publishing.verification -import org.gradle.api.artifacts.Dependency - class VersionSelectorVerificationViolation { - Dependency dependency + DeclaredDependency dependency } diff --git a/src/test/groovy/nebula/plugin/publishing/verification/VerificationReportGeneratorSpec.groovy b/src/test/groovy/nebula/plugin/publishing/verification/VerificationReportGeneratorSpec.groovy index d936fba..7ff5972 100644 --- a/src/test/groovy/nebula/plugin/publishing/verification/VerificationReportGeneratorSpec.groovy +++ b/src/test/groovy/nebula/plugin/publishing/verification/VerificationReportGeneratorSpec.groovy @@ -122,11 +122,7 @@ class VerificationReportGeneratorSpec extends Specification { } VersionSelectorVerificationViolation createVersionViolation(String group, String name, String version) { - new VersionSelectorVerificationViolation(dependency: Mock(Dependency) { - getName() >> name - getGroup() >> group - getVersion() >> version - }) + new VersionSelectorVerificationViolation(dependency: new DeclaredDependency(group, name, version)) } void assertStatusViolationsForProjects(String report, Map violationsPerProject, String targetStatus) { diff --git a/src/test/groovy/nebula/plugin/publishing/verification/VerificationReportTaskSpec.groovy b/src/test/groovy/nebula/plugin/publishing/verification/VerificationReportTaskSpec.groovy index 03b887b..f077456 100644 --- a/src/test/groovy/nebula/plugin/publishing/verification/VerificationReportTaskSpec.groovy +++ b/src/test/groovy/nebula/plugin/publishing/verification/VerificationReportTaskSpec.groovy @@ -63,7 +63,7 @@ class VerificationReportTaskSpec extends Specification { ]), new ViolationsContainer( versionSelectorViolations: [ - new VersionSelectorVerificationViolation(dependency: Mock(Dependency)) + new VersionSelectorVerificationViolation(dependency: GroovyMock(DeclaredDependency)) ]) ] } diff --git a/src/test/groovy/nebula/plugin/publishing/verification/VerifyPublicationTaskSpec.groovy b/src/test/groovy/nebula/plugin/publishing/verification/VerifyPublicationTaskSpec.groovy index d120362..e982579 100644 --- a/src/test/groovy/nebula/plugin/publishing/verification/VerifyPublicationTaskSpec.groovy +++ b/src/test/groovy/nebula/plugin/publishing/verification/VerifyPublicationTaskSpec.groovy @@ -133,7 +133,7 @@ class VerifyPublicationTaskSpec extends Specification { resolvedComponentResultProvider = project.configurations.named(project.sourceSets.main.getRuntimeClasspathConfigurationName()).get().incoming.resolutionResult.rootComponent definedDependencies.set(project.configurations.collect { Configuration configuration -> configuration.dependencies - }.flatten() as List) + }.flatten().collect { Dependency dependency -> new DeclaredDependency(dependency.group, dependency.name, dependency.version) } as List) projectName.set(project.name) targetStatus.set(project.status.toString()) verificationViolationsCollectorHolderExtension.set(extension)