Skip to content

Commit

Permalink
Merge pull request #191 from nebula-plugins/publish-verification-conf…
Browse files Browse the repository at this point in the history
…ig-cache
  • Loading branch information
rpalcolea committed Nov 18, 2023
2 parents 1bf4945 + bf3ad53 commit 0bf65e2
Show file tree
Hide file tree
Showing 7 changed files with 71 additions and 38 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import org.gradle.api.artifacts.Configuration
import org.gradle.api.artifacts.Dependency
import org.gradle.api.attributes.Attribute
import org.gradle.api.plugins.JavaBasePlugin
import org.gradle.api.provider.Provider
import org.gradle.api.publish.ivy.tasks.PublishToIvyRepository
import org.gradle.api.publish.maven.tasks.PublishToMavenRepository
import org.gradle.api.tasks.SourceSet
Expand Down Expand Up @@ -44,23 +45,25 @@ class PublishVerificationPlugin implements Plugin<Project> {

@CompileDynamic
private void setupPlugin(Project project, PublishVerificationExtension extension) {
createVerificationViolationsCollector(project)
Provider<VerificationViolationsCollectorService> serviceProvider = project.getGradle().getSharedServices().registerIfAbsent("verificationViolationsCollectorService", VerificationViolationsCollectorService.class, spec -> {
})

generateStatusSchemeAttribute(project)
project.afterEvaluate {
SourceSet sourceSet = project.sourceSets.find { it.name == SourceSet.MAIN_SOURCE_SET_NAME }
if (!sourceSet) return
TaskProvider<VerifyPublicationTask> verificationTask = project.tasks.register("verifyPublication", VerifyPublicationTask)
TaskProvider<VerificationReportTask> reportTask = getOrCreateReportTask(project, verificationTask)
VerificationViolationsCollectorHolderExtension verificationViolationsCollectorHolderExtension = project.rootProject.extensions.findByType(VerificationViolationsCollectorHolderExtension)
TaskProvider<VerificationReportTask> reportTask = getOrCreateReportTask(project, verificationTask, serviceProvider)
verificationTask.configure(new Action<VerifyPublicationTask>() {
@Override
void execute(VerifyPublicationTask verifyPublicationTask) {
verifyPublicationTask.verificationViolationsCollectorService.set(serviceProvider)
verifyPublicationTask.usesService(serviceProvider)
verifyPublicationTask.projectName.set(project.name)
verifyPublicationTask.targetStatus.set(project.status.toString())
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)
verifyPublicationTask.definedDependencies.set(project.configurations.collect { Configuration configuration ->
configuration.dependencies
}.flatten().collect { Dependency dependency -> new DeclaredDependency(dependency.group, dependency.name, dependency.version) } as List<DeclaredDependency>)
Expand All @@ -72,14 +75,6 @@ class PublishVerificationPlugin implements Plugin<Project> {
}
}

void createVerificationViolationsCollector(Project project) {
//root project doesn't have to fulfil condition for plugin setup so first submodule will create extension if it not created
VerificationViolationsCollectorHolderExtension violationCollector = project.rootProject.extensions.findByType(VerificationViolationsCollectorHolderExtension)
if (violationCollector == null) {
project.rootProject.extensions.create('verificationViolationsCollectorHolderExtension', VerificationViolationsCollectorHolderExtension)
}
}

@CompileDynamic
private void generateStatusSchemeAttribute(Project p) {
if(GradleKt.versionLessThan(p.gradle, "5.0")) {
Expand All @@ -96,7 +91,7 @@ class PublishVerificationPlugin implements Plugin<Project> {
}


private TaskProvider<VerificationReportTask> getOrCreateReportTask(Project project, TaskProvider<VerifyPublicationTask> verificationTask) {
private TaskProvider<VerificationReportTask> getOrCreateReportTask(Project project, TaskProvider<VerifyPublicationTask> verificationTask, Provider<VerificationViolationsCollectorService> verificationViolationsCollectorServiceProvider) {
//root project doesn't have to fulfil condition for plugin setup so first submodule will create report task if it not created
TaskCollection verificationReports = project.rootProject.tasks.withType(VerificationReportTask)
TaskProvider<VerificationReportTask> verificationReportTask
Expand All @@ -105,12 +100,12 @@ class PublishVerificationPlugin implements Plugin<Project> {
} else {
verificationReportTask = project.rootProject.tasks.named('verifyPublicationReport', VerificationReportTask)
}
VerificationViolationsCollectorHolderExtension verificationViolationsCollectorHolderExtension = project.rootProject.extensions.findByType(VerificationViolationsCollectorHolderExtension)
verificationReportTask.configure(new Action<VerificationReportTask>() {
@Override
void execute(VerificationReportTask reportTask) {
reportTask.verificationViolationsCollectorService.set(verificationViolationsCollectorServiceProvider)
reportTask.usesService(verificationViolationsCollectorServiceProvider)
reportTask.targetStatus.set(project.status.toString())
reportTask.verificationViolationsCollectorHolderExtension.set(verificationViolationsCollectorHolderExtension)
reportTask.dependsOn(verificationTask)
}
})
Expand All @@ -125,8 +120,4 @@ class PublishVerificationPlugin implements Plugin<Project> {
task.dependsOn(reportTask)
}
}

static class VerificationViolationsCollectorHolderExtension {
Map<String, ViolationsContainer> collector = new ConcurrentHashMap<>()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,17 +13,16 @@ abstract class VerificationReportTask extends DefaultTask {

protected VerificationReportGenerator verificationReportGenerator = new VerificationReportGenerator()

@Internal
abstract Property<PublishVerificationPlugin.VerificationViolationsCollectorHolderExtension> getVerificationViolationsCollectorHolderExtension()

@Input
abstract Property<String> getTargetStatus()

@Internal
abstract Property<VerificationViolationsCollectorService> getVerificationViolationsCollectorService()

@TaskAction
void reportViolatingDependencies() {
if (project.rootProject == project) {
reportErrors(verificationViolationsCollectorHolderExtension.get().collector)
}
reportErrors(verificationViolationsCollectorService.get().collector)

}

void reportErrors(Map<String, ViolationsContainer> violationsPerProject) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package nebula.plugin.publishing.verification

import org.gradle.api.services.BuildService
import org.gradle.api.services.BuildServiceParameters

import java.util.concurrent.ConcurrentHashMap

abstract class VerificationViolationsCollectorService implements BuildService<BuildServiceParameters.None>, AutoCloseable {
private final Map<String, ViolationsContainer> collector

VerificationViolationsCollectorService() {
this.collector = new ConcurrentHashMap<>()
}

void addProject(String projectName, ViolationsContainer violationsContainer) {
collector.put(projectName, violationsContainer)
}

Map<String, ViolationsContainer> getCollector() {
return collector
}

@Override
void close() {
collector.clear()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,8 @@ abstract class VerifyPublicationTask extends DefaultTask {
abstract ListProperty<DeclaredDependency> getDefinedDependencies()

@Internal
abstract Property<PublishVerificationPlugin.VerificationViolationsCollectorHolderExtension> getVerificationViolationsCollectorHolderExtension()
abstract Property<VerificationViolationsCollectorService> getVerificationViolationsCollectorService()


@TaskAction
void verifyDependencies() {
Expand All @@ -47,7 +48,7 @@ abstract class VerifyPublicationTask extends DefaultTask {

List<VersionSelectorVerificationViolation> versionViolations = new VersionSelectorVerification(ignore.get(), ignoreGroups.get()).verify(definedDependencies.get())

verificationViolationsCollectorHolderExtension.get().collector.put(projectName.get(), new ViolationsContainer(statusViolations: violations, versionSelectorViolations: versionViolations))
verificationViolationsCollectorService.get().addProject(projectName.get(), new ViolationsContainer(statusViolations: violations, versionSelectorViolations: versionViolations))
}

private static Set<ResolvedDependencyResult> getNonProjectDependencies(ResolvedComponentResult resolvedComponentResult) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,16 @@ import netflix.nebula.dependency.recommender.DependencyRecommendationsPlugin
import spock.lang.Ignore
import spock.lang.IgnoreIf

@IgnoreIf({ jvm.isJava11Compatible() })
class PublishVerificationPluginIntegrationSpec extends IntegrationSpec {

def setup() {
settingsFile.text = '''\
rootProject.name='testhello'
'''
gradleVersion = null
// Enable configuration cache :)
new File(projectDir, 'gradle.properties') << '''org.gradle.configuration-cache=true'''.stripIndent()
}

def 'should successful pass through verification'() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import org.gradle.api.BuildCancelledException
import org.gradle.api.Project
import org.gradle.api.artifacts.Dependency
import org.gradle.api.artifacts.ModuleVersionIdentifier
import org.gradle.api.provider.Provider
import org.gradle.testfixtures.ProjectBuilder
import spock.lang.Specification

Expand All @@ -12,12 +13,14 @@ class VerificationReportTaskSpec extends Specification {
def 'build is unaffected when there is no violation'() {
given:
Project project = ProjectBuilder.builder().build()
PublishVerificationPlugin.VerificationViolationsCollectorHolderExtension extension = project.extensions.create('collectorExtension', PublishVerificationPlugin.VerificationViolationsCollectorHolderExtension)
Provider<VerificationViolationsCollectorService> verificationViolationsCollectorServiceProvider = project.getGradle().getSharedServices().registerIfAbsent("verificationViolationsCollectorService", VerificationViolationsCollectorService.class, spec -> {
})
VerificationReportTask task = project.tasks.create('report', VerificationReportTask)
def generator = Mock(VerificationReportGenerator)
task.verificationReportGenerator = generator
task.targetStatus.set(project.status.toString())
task.verificationViolationsCollectorHolderExtension.set(extension)
task.verificationViolationsCollectorService.set(verificationViolationsCollectorServiceProvider)
task.usesService(verificationViolationsCollectorServiceProvider)

when:
task.reportViolatingDependencies()
Expand All @@ -34,13 +37,15 @@ class VerificationReportTaskSpec extends Specification {
given:
Project project = ProjectBuilder.builder().build()
project.status = 'release'
def extension = project.extensions.create('collectorExtension', PublishVerificationPlugin.VerificationViolationsCollectorHolderExtension)
extension.collector.put(project, container)
Provider<VerificationViolationsCollectorService> verificationViolationsCollectorServiceProvider = project.getGradle().getSharedServices().registerIfAbsent("verificationViolationsCollectorService", VerificationViolationsCollectorService.class, spec -> {
})
verificationViolationsCollectorServiceProvider.get().addProject(project.name, container)
VerificationReportTask task = project.tasks.create('report', VerificationReportTask)
def generator = Mock(VerificationReportGenerator)
task.verificationReportGenerator = generator
task.targetStatus.set(project.status.toString())
task.verificationViolationsCollectorHolderExtension.set(extension)
task.verificationViolationsCollectorService.set(verificationViolationsCollectorServiceProvider)
task.usesService(verificationViolationsCollectorServiceProvider)

when:
task.reportViolatingDependencies()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import org.gradle.api.artifacts.Configuration
import org.gradle.api.artifacts.Dependency
import org.gradle.api.internal.artifacts.DefaultModuleIdentifier
import org.gradle.api.plugins.JavaPlugin
import org.gradle.api.provider.Provider
import org.gradle.testfixtures.ProjectBuilder
import spock.lang.Specification
import spock.lang.Unroll
Expand All @@ -29,7 +30,8 @@ class VerifyPublicationTaskSpec extends Specification {

then:
noExceptionThrown()
def holderExtension = project.extensions.findByType(PublishVerificationPlugin.VerificationViolationsCollectorHolderExtension)
def holderExtension = project.getGradle().getSharedServices().registerIfAbsent("verificationViolationsCollectorService", VerificationViolationsCollectorService.class, spec -> {
}).get()
holderExtension.collector.size() == 1
def violations = holderExtension.collector[project.name]
violations.statusViolations.size() == 0
Expand All @@ -56,7 +58,8 @@ class VerifyPublicationTaskSpec extends Specification {

then:
noExceptionThrown()
def holderExtension = project.extensions.findByType(PublishVerificationPlugin.VerificationViolationsCollectorHolderExtension)
def holderExtension = project.getGradle().getSharedServices().registerIfAbsent("verificationViolationsCollectorService", VerificationViolationsCollectorService.class, spec -> {
}).get()
holderExtension.collector.size() == 1
def violations = holderExtension.collector[project.name]
violations.statusViolations.size() == 1
Expand Down Expand Up @@ -88,7 +91,8 @@ class VerifyPublicationTaskSpec extends Specification {

then:
noExceptionThrown()
def holderExtension = project.extensions.findByType(PublishVerificationPlugin.VerificationViolationsCollectorHolderExtension)
def holderExtension = project.getGradle().getSharedServices().registerIfAbsent("verificationViolationsCollectorService", VerificationViolationsCollectorService.class, spec -> {
}).get()
holderExtension.collector.size() == 1
def violations = holderExtension.collector[project.name]
violations.statusViolations.size() == 0
Expand All @@ -111,15 +115,17 @@ class VerifyPublicationTaskSpec extends Specification {

then:
noExceptionThrown()
def holderExtension = project.extensions.findByType(PublishVerificationPlugin.VerificationViolationsCollectorHolderExtension)
def holderExtension = project.getGradle().getSharedServices().registerIfAbsent("verificationViolationsCollectorService", VerificationViolationsCollectorService.class, spec -> {
}).get()
holderExtension.collector.size() == 1
def violations = holderExtension.collector[project.name]
violations.statusViolations.size() == 0
violations.versionSelectorViolations.size() == 0
}

Task setupProjectAndTask(Project project, String libraryStatus, String projectStatus) {
def extension = project.extensions.create('collectorExtension', PublishVerificationPlugin.VerificationViolationsCollectorHolderExtension)
Provider<VerificationViolationsCollectorService> verificationViolationsCollectorServiceProvider = project.getGradle().getSharedServices().registerIfAbsent("verificationViolationsCollectorService", VerificationViolationsCollectorService.class, spec -> {
})
project.plugins.apply(JavaPlugin)
project.status = projectStatus

Expand All @@ -128,6 +134,8 @@ class VerifyPublicationTaskSpec extends Specification {

def task = project.task('verify', type: VerifyPublicationTask)
task.configure {
verificationViolationsCollectorService.set(verificationViolationsCollectorServiceProvider)
usesService(verificationViolationsCollectorServiceProvider)
ignore.set(Collections.emptySet())
ignoreGroups.set(Collections.emptySet())
resolvedComponentResultProvider = project.configurations.named(project.sourceSets.main.getRuntimeClasspathConfigurationName()).get().incoming.resolutionResult.rootComponent
Expand All @@ -136,7 +144,6 @@ class VerifyPublicationTaskSpec extends Specification {
}.flatten().collect { Dependency dependency -> new DeclaredDependency(dependency.group, dependency.name, dependency.version) } as List<DeclaredDependency>)
projectName.set(project.name)
targetStatus.set(project.status.toString())
verificationViolationsCollectorHolderExtension.set(extension)
}
}

Expand Down

0 comments on commit 0bf65e2

Please sign in to comment.