Skip to content

Commit 8966252

Browse files
committed
refactor: Proper tasks for muzzle reports
1 parent 827c1c7 commit 8966252

File tree

7 files changed

+139
-114
lines changed

7 files changed

+139
-114
lines changed

buildSrc/src/main/kotlin/datadog/gradle/plugin/muzzle/MuzzlePlugin.kt

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,16 @@ package datadog.gradle.plugin.muzzle
33
import datadog.gradle.plugin.muzzle.MuzzleMavenRepoUtils.inverseOf
44
import datadog.gradle.plugin.muzzle.MuzzleMavenRepoUtils.muzzleDirectiveToArtifacts
55
import datadog.gradle.plugin.muzzle.MuzzleMavenRepoUtils.resolveVersionRange
6-
import datadog.gradle.plugin.muzzle.MuzzleReportUtils.dumpVersionRanges
7-
import datadog.gradle.plugin.muzzle.MuzzleReportUtils.mergeReports
8-
import datadog.gradle.plugin.muzzle.tasks.MuzzleTask
6+
import datadog.gradle.plugin.muzzle.tasks.MuzzleGenerateReportTask
7+
import datadog.gradle.plugin.muzzle.tasks.MuzzleMergeReportsTask
98
import datadog.gradle.plugin.muzzle.tasks.MuzzlePrintReferencesTask
9+
import datadog.gradle.plugin.muzzle.tasks.MuzzleTask
1010
import org.eclipse.aether.artifact.Artifact
1111
import org.gradle.api.NamedDomainObjectProvider
1212
import org.gradle.api.Plugin
1313
import org.gradle.api.Project
1414
import org.gradle.api.Task
1515
import org.gradle.api.artifacts.Configuration
16-
import org.gradle.api.plugins.JavaBasePlugin
17-
import org.gradle.api.plugins.JavaPlugin
1816
import org.gradle.api.tasks.TaskProvider
1917
import org.gradle.kotlin.dsl.create
2018
import org.gradle.kotlin.dsl.exclude
@@ -95,20 +93,11 @@ class MuzzlePlugin : Plugin<Project> {
9593
dependsOn(compileMuzzle)
9694
}
9795

98-
project.tasks.register<MuzzleTask>("generateMuzzleReport") {
99-
description = "Print instrumentation version report"
100-
doLast {
101-
dumpVersionRanges(project)
102-
}
96+
project.tasks.register<MuzzleGenerateReportTask>("generateMuzzleReport") {
10397
dependsOn(compileMuzzle)
10498
}
10599

106-
project.tasks.register<MuzzleTask>("mergeMuzzleReports") {
107-
description = "Merge generated version reports in one unique csv"
108-
doLast {
109-
mergeReports(project)
110-
}
111-
}
100+
project.tasks.register<MuzzleMergeReportsTask>("mergeMuzzleReports")
112101

113102
val hasRelevantTask = project.gradle.startParameter.taskNames.any { taskName ->
114103
// removing leading ':' if present

buildSrc/src/main/kotlin/datadog/gradle/plugin/muzzle/MuzzleReportUtils.kt

Lines changed: 0 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -14,96 +14,8 @@ import java.util.TreeMap
1414
import java.util.function.BiFunction
1515

1616
internal object MuzzleReportUtils {
17-
private const val MUZZLE_DEPS_RESULTS = "muzzle-deps-results"
1817
private const val MUZZLE_TEST_RESULTS = "muzzle-test-results"
1918

20-
fun dumpVersionRanges(project: Project) {
21-
val system: RepositorySystem = MuzzleMavenRepoUtils.newRepositorySystem()
22-
val session: RepositorySystemSession = MuzzleMavenRepoUtils.newRepositorySystemSession(system)
23-
val versions = TreeMap<String, TestedArtifact>()
24-
25-
project.extensions.getByType<MuzzleExtension>().directives
26-
.filter { !it.isCoreJdk && !it.skipFromReport }
27-
.forEach { directive ->
28-
val range = MuzzleMavenRepoUtils.resolveVersionRange(directive, system, session)
29-
val cp = project.files(project.mainSourceSet.runtimeClasspath).map { it.toURI().toURL() }.toTypedArray()
30-
val cl = URLClassLoader(cp, null)
31-
val partials = resolveInstrumentationAndJarVersions(directive, cl, range.lowestVersion, range.highestVersion)
32-
33-
partials.forEach { (key, value) ->
34-
versions.merge(key, value, BiFunction { x, y ->
35-
TestedArtifact(
36-
x.instrumentation, x.group, x.module,
37-
lowest(x.lowVersion, y.lowVersion),
38-
highest(x.highVersion, y.highVersion)
39-
)
40-
})
41-
}
42-
}
43-
dumpVersionsToCsv(project, versions)
44-
}
45-
46-
private fun dumpVersionsToCsv(project: Project, versions: SortedMap<String, TestedArtifact>) {
47-
val filename = project.path.replaceFirst("^:".toRegex(), "").replace(":", "_")
48-
49-
val verrsionsFile = project.rootProject.layout.buildDirectory.file("$MUZZLE_DEPS_RESULTS/$filename.csv")
50-
with(project.file(verrsionsFile)) {
51-
parentFile.mkdirs()
52-
writeText("instrumentation,jarGroupId,jarArtifactId,lowestVersion,highestVersion\n")
53-
versions.values.forEach {
54-
appendText(
55-
listOf(
56-
it.instrumentation,
57-
it.group,
58-
it.module,
59-
it.lowVersion.toString(),
60-
it.highVersion.toString()
61-
).joinToString(",") + "\n"
62-
)
63-
}
64-
project.logger.info("Wrote muzzle versions report to\n $this")
65-
}
66-
}
67-
68-
/**
69-
* Merges all muzzle report CSVs in the build directory into a single map and writes the merged results to a CSV.
70-
*/
71-
fun mergeReports(project: Project) {
72-
val versionReports = project.fileTree(project.rootProject.layout.buildDirectory.dir(MUZZLE_DEPS_RESULTS)) {
73-
include("*.csv")
74-
}
75-
76-
val map = TreeMap<String, TestedArtifact>()
77-
val versionScheme = GenericVersionScheme()
78-
79-
versionReports.forEach {
80-
project.logger.info("Processing muzzle report: $it")
81-
it.useLines { lines ->
82-
lines.forEachIndexed { idx, line ->
83-
if (idx == 0) return@forEachIndexed // skip header
84-
val split = line.split(",")
85-
val parsed = TestedArtifact(
86-
split[0],
87-
split[1],
88-
split[2],
89-
versionScheme.parseVersion(split[3]),
90-
versionScheme.parseVersion(split[4])
91-
)
92-
map.merge(parsed.key(), parsed) { x, y ->
93-
TestedArtifact(
94-
x.instrumentation,
95-
x.group,
96-
x.module,
97-
MuzzleMavenRepoUtils.lowest(x.lowVersion, y.lowVersion),
98-
MuzzleMavenRepoUtils.highest(x.highVersion, y.highVersion)
99-
)
100-
}
101-
}
102-
}
103-
}
104-
105-
dumpVersionsToCsv(project, map)
106-
}
10719

10820
/**
10921
* Generates a JUnit-style XML report for muzzle results.
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package datadog.gradle.plugin.muzzle.tasks
2+
3+
import datadog.gradle.plugin.muzzle.TestedArtifact
4+
import java.util.SortedMap
5+
6+
abstract class AbstractMuzzleReportTask : AbstractMuzzleTask() {
7+
internal fun dumpVersionsToCsv(versions: SortedMap<String, TestedArtifact>) {
8+
val filename = project.path.replaceFirst("^:".toRegex(), "").replace(":", "_")
9+
10+
val versionsFile = project.rootProject.layout.buildDirectory.file("${MUZZLE_DEPS_RESULTS}/$filename.csv")
11+
with(project.file(versionsFile)) {
12+
parentFile.mkdirs()
13+
writeText("instrumentation,jarGroupId,jarArtifactId,lowestVersion,highestVersion\n")
14+
versions.values.forEach {
15+
appendText(
16+
listOf(
17+
it.instrumentation,
18+
it.group,
19+
it.module,
20+
it.lowVersion.toString(),
21+
it.highVersion.toString()
22+
).joinToString(",") + "\n"
23+
)
24+
}
25+
project.logger.info("Wrote muzzle versions report to\n $this")
26+
}
27+
}
28+
29+
companion object {
30+
internal const val MUZZLE_DEPS_RESULTS = "muzzle-deps-results"
31+
}
32+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package datadog.gradle.plugin.muzzle.tasks
2+
3+
import datadog.gradle.plugin.muzzle.MuzzleMavenRepoUtils
4+
import datadog.gradle.plugin.muzzle.TestedArtifact
5+
import org.eclipse.aether.util.version.GenericVersionScheme
6+
import org.gradle.api.tasks.TaskAction
7+
import java.util.TreeMap
8+
9+
abstract class MuzzleGenerateReportTask : AbstractMuzzleReportTask() {
10+
init {
11+
description = "Print instrumentation version report"
12+
}
13+
14+
/**
15+
* Merges all muzzle report CSVs in the build directory into a single map and writes the merged results to a CSV.
16+
*/
17+
@TaskAction
18+
fun mergeReports() {
19+
val versionReports = project.fileTree(project.rootProject.layout.buildDirectory.dir(MUZZLE_DEPS_RESULTS)) {
20+
include("*.csv")
21+
}
22+
val map = TreeMap<String, TestedArtifact>()
23+
val versionScheme = GenericVersionScheme()
24+
versionReports.forEach {
25+
project.logger.info("Processing muzzle report: $it")
26+
it.useLines { lines ->
27+
lines.forEachIndexed { idx, line ->
28+
if (idx == 0) return@forEachIndexed // skip header
29+
val split = line.split(",")
30+
val parsed = TestedArtifact(
31+
split[0],
32+
split[1],
33+
split[2],
34+
versionScheme.parseVersion(split[3]),
35+
versionScheme.parseVersion(split[4])
36+
)
37+
map.merge(parsed.key(), parsed) { x, y ->
38+
TestedArtifact(
39+
x.instrumentation,
40+
x.group,
41+
x.module,
42+
MuzzleMavenRepoUtils.lowest(x.lowVersion, y.lowVersion),
43+
MuzzleMavenRepoUtils.highest(x.highVersion, y.highVersion)
44+
)
45+
}
46+
}
47+
}
48+
}
49+
dumpVersionsToCsv(map)
50+
}
51+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package datadog.gradle.plugin.muzzle.tasks
2+
3+
import datadog.gradle.plugin.muzzle.MuzzleExtension
4+
import datadog.gradle.plugin.muzzle.MuzzleMavenRepoUtils
5+
import datadog.gradle.plugin.muzzle.MuzzleMavenRepoUtils.highest
6+
import datadog.gradle.plugin.muzzle.MuzzleMavenRepoUtils.lowest
7+
import datadog.gradle.plugin.muzzle.MuzzleMavenRepoUtils.resolveInstrumentationAndJarVersions
8+
import datadog.gradle.plugin.muzzle.TestedArtifact
9+
import datadog.gradle.plugin.muzzle.mainSourceSet
10+
import org.eclipse.aether.RepositorySystem
11+
import org.eclipse.aether.RepositorySystemSession
12+
import org.gradle.api.tasks.TaskAction
13+
import org.gradle.kotlin.dsl.getByType
14+
import java.net.URL
15+
import java.net.URLClassLoader
16+
import java.util.TreeMap
17+
import java.util.function.BiFunction
18+
19+
abstract class MuzzleMergeReportsTask : AbstractMuzzleReportTask() {
20+
init {
21+
description = "Print instrumentation version report"
22+
}
23+
24+
@TaskAction
25+
fun dumpVersionRanges() {
26+
val system: RepositorySystem = MuzzleMavenRepoUtils.newRepositorySystem()
27+
val session: RepositorySystemSession = MuzzleMavenRepoUtils.newRepositorySystemSession(system)
28+
val versions = TreeMap<String, TestedArtifact>()
29+
project.extensions.getByType<MuzzleExtension>().directives
30+
.filter { !it.isCoreJdk && !it.skipFromReport }
31+
.forEach { directive ->
32+
val range = MuzzleMavenRepoUtils.resolveVersionRange(directive, system, session)
33+
val cp = project.files(project.mainSourceSet.runtimeClasspath).map { it.toURI().toURL() }.toTypedArray<URL>()
34+
val cl = URLClassLoader(cp, null)
35+
val partials = resolveInstrumentationAndJarVersions(directive, cl, range.lowestVersion, range.highestVersion)
36+
37+
partials.forEach { (key, value) ->
38+
versions.merge(key, value, BiFunction { x, y ->
39+
TestedArtifact(
40+
x.instrumentation, x.group, x.module,
41+
lowest(x.lowVersion, y.lowVersion),
42+
highest(x.highVersion, y.highVersion)
43+
)
44+
})
45+
}
46+
}
47+
dumpVersionsToCsv(versions)
48+
}
49+
}

buildSrc/src/main/kotlin/datadog/gradle/plugin/muzzle/tasks/MuzzlePrintReferencesTask.kt

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,18 @@
11
package datadog.gradle.plugin.muzzle.tasks
22

33
import datadog.gradle.plugin.muzzle.mainSourceSet
4-
import org.gradle.api.Project
54
import org.gradle.api.tasks.TaskAction
65
import java.lang.reflect.Method
76
import java.net.URLClassLoader
8-
import javax.inject.Inject
97

10-
abstract class MuzzlePrintReferencesTask @Inject constructor(
11-
private val instrumentationProject: Project
12-
) : AbstractMuzzleTask() {
8+
abstract class MuzzlePrintReferencesTask : AbstractMuzzleTask() {
139
init {
1410
description = "Print references created by instrumentation muzzle"
1511
}
1612

1713
@TaskAction
1814
fun printMuzzle() {
19-
val cp = instrumentationProject.mainSourceSet.runtimeClasspath
15+
val cp = project.mainSourceSet.runtimeClasspath
2016
val cl = URLClassLoader(cp.map { it.toURI().toURL() }.toTypedArray(), null)
2117
val printMethod: Method = cl.loadClass("datadog.trace.agent.tooling.muzzle.MuzzleVersionScanPlugin")
2218
.getMethod(

buildSrc/src/main/kotlin/datadog/gradle/plugin/muzzle/tasks/MuzzleTask.kt

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@ package datadog.gradle.plugin.muzzle.tasks
33
import datadog.gradle.plugin.muzzle.MuzzleAction
44
import datadog.gradle.plugin.muzzle.MuzzleDirective
55
import datadog.gradle.plugin.muzzle.allMainSourceSet
6-
import datadog.gradle.plugin.muzzle.mainSourceSet
7-
import org.gradle.api.DefaultTask
86
import org.gradle.api.NamedDomainObjectProvider
97
import org.gradle.api.Project
108
import org.gradle.api.artifacts.Configuration
@@ -13,8 +11,6 @@ import org.gradle.api.invocation.BuildInvocationDetails
1311
import org.gradle.jvm.toolchain.JavaLanguageVersion
1412
import org.gradle.jvm.toolchain.JavaToolchainService
1513
import org.gradle.workers.WorkerExecutor
16-
import java.lang.reflect.Method
17-
import java.net.URLClassLoader
1814
import javax.inject.Inject
1915

2016
abstract class MuzzleTask : AbstractMuzzleTask() {

0 commit comments

Comments
 (0)