diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index f265ee366e3a..1481966fcf6a 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -63,6 +63,7 @@ openTestReporting-events = { module = "org.opentest4j.reporting:open-test-report openTestReporting-tooling-core = { module = "org.opentest4j.reporting:open-test-reporting-tooling-core", version.ref = "openTestReporting" } openTestReporting-tooling-spi = { module = "org.opentest4j.reporting:open-test-reporting-tooling-spi", version.ref = "openTestReporting" } picocli = { module = "info.picocli:picocli", version = "4.7.7" } +roseau-cli = { module = "io.github.alien-tools:roseau-cli", version = "0.3.0" } slf4j-julBinding = { module = "org.slf4j:slf4j-jdk14", version = "2.0.17" } snapshotTests-junit5 = { module = "de.skuzzle.test:snapshot-tests-junit5", version.ref = "snapshotTests" } snapshotTests-xml = { module = "de.skuzzle.test:snapshot-tests-xml", version.ref = "snapshotTests" } diff --git a/gradle/plugins/japicmp/build.gradle.kts b/gradle/plugins/backward-compatibility/build.gradle.kts similarity index 100% rename from gradle/plugins/japicmp/build.gradle.kts rename to gradle/plugins/backward-compatibility/build.gradle.kts diff --git a/gradle/plugins/japicmp/src/main/kotlin/junitbuild.japicmp.gradle.kts b/gradle/plugins/backward-compatibility/src/main/kotlin/junitbuild.backward-compatibility.gradle.kts similarity index 55% rename from gradle/plugins/japicmp/src/main/kotlin/junitbuild.japicmp.gradle.kts rename to gradle/plugins/backward-compatibility/src/main/kotlin/junitbuild.backward-compatibility.gradle.kts index fc6c3c5ab08d..a7f29f6d9269 100644 --- a/gradle/plugins/japicmp/src/main/kotlin/junitbuild.japicmp.gradle.kts +++ b/gradle/plugins/backward-compatibility/src/main/kotlin/junitbuild.backward-compatibility.gradle.kts @@ -1,11 +1,13 @@ + import de.undercouch.gradle.tasks.download.Download +import junitbuild.compatibility.BackwardCompatibilityChecksExtension +import junitbuild.compatibility.japicmp.AcceptedViolationSuppressor +import junitbuild.compatibility.japicmp.AcceptedViolationsPostProcessRule +import junitbuild.compatibility.japicmp.BreakingSuperClassChangeRule +import junitbuild.compatibility.japicmp.InternalApiFilter +import junitbuild.compatibility.japicmp.SourceIncompatibleRule +import junitbuild.extensions.dependencyFromLibs import junitbuild.extensions.javaModuleName -import junitbuild.japicmp.AcceptedViolationSuppressor -import junitbuild.japicmp.AcceptedViolationsPostProcessRule -import junitbuild.japicmp.BreakingSuperClassChangeRule -import junitbuild.japicmp.InternalApiFilter -import junitbuild.japicmp.JApiCmpExtension -import junitbuild.japicmp.SourceIncompatibleRule import me.champeau.gradle.japicmp.JapicmpTask import me.champeau.gradle.japicmp.report.stdrules.BinaryIncompatibleRule import me.champeau.gradle.japicmp.report.stdrules.RecordSeenMembersSetup @@ -16,7 +18,15 @@ plugins { id("me.champeau.gradle.japicmp") } -val extension = extensions.create("japicmp").apply { +val roseauDependencies = configurations.dependencyScope("roseau") +val roseauClasspath = configurations.resolvable("roseauClasspath") { + extendsFrom(roseauDependencies.get()) +} +dependencies { + roseauDependencies(dependencyFromLibs("roseau-cli")) +} + +val extension = extensions.create("backwardCompatibilityChecks").apply { enabled.convention(true) acceptedIncompatibilities.apply { val acceptedBreakingChangesFile = rootProject.layout.projectDirectory.file("gradle/config/japicmp/accepted-breaking-changes.txt") @@ -48,11 +58,58 @@ val downloadPreviousReleaseJar by tasks.registering(Download::class) { outputs.cacheIf { true } } -val checkBackwardCompatibility by tasks.registering(JapicmpTask::class) { +val roseauCsvFile = layout.buildDirectory.file("reports/roseau/breaking-changes.csv") + +val roseau by tasks.registering(JavaExec::class) { + if (gradle.startParameter.isOffline) { + enabled = false + } + onlyIf { extension.enabled.get() } + + mainClass = "io.github.alien.roseau.cli.RoseauCLI" + classpath = files(roseauClasspath) + + inputs.files(configurations.compileClasspath) + .withNormalizer(CompileClasspathNormalizer::class) + .withPropertyName("apiClasspath") + + val v1Jar = downloadPreviousReleaseJar.map { it.outputFiles.single() } + inputs.file(v1Jar) + .withNormalizer(CompileClasspathNormalizer::class) + .withPropertyName("v1") + + val v2Jar = tasks.jar.flatMap { it.archiveFile }.map { it.asFile } + inputs.file(v2Jar) + .withNormalizer(CompileClasspathNormalizer::class) + .withPropertyName("v2") + + outputs.file(roseauCsvFile) + .withPropertyName("report") + + argumentProviders.add(CommandLineArgumentProvider { + val args = listOf( + "--classpath", configurations.compileClasspath.get().asPath, + "--v1", v1Jar.get().absolutePath, + "--v2", v2Jar.get().absolutePath, + "--diff", + "--report", roseauCsvFile.get().asFile.absolutePath, + ) + println(args) + args + }) + + doFirst { + roseauCsvFile.get().asFile.parentFile.mkdirs() + } +} + +val japicmp by tasks.registering(JapicmpTask::class) { if (gradle.startParameter.isOffline) { enabled = false } onlyIf { extension.enabled.get() } + shouldRunAfter(roseau) + oldClasspath.from(downloadPreviousReleaseJar.map { it.outputFiles }) newClasspath.from(tasks.jar) onlyModified = true @@ -72,6 +129,10 @@ val checkBackwardCompatibility by tasks.registering(JapicmpTask::class) { } } +val checkBackwardCompatibility by tasks.registering { + dependsOn(roseau, japicmp) +} + tasks.check { dependsOn(checkBackwardCompatibility) } @@ -80,7 +141,7 @@ afterEvaluate { val params = mapOf( "acceptedIncompatibilities" to extension.acceptedIncompatibilities.get().joinToString(",") ) - checkBackwardCompatibility { + japicmp { richReport { addViolationTransformer(AcceptedViolationSuppressor::class.java, params) addPostProcessRule(AcceptedViolationsPostProcessRule::class.java, params) diff --git a/gradle/plugins/japicmp/src/main/kotlin/junitbuild/japicmp/JApiCmpExtension.kt b/gradle/plugins/backward-compatibility/src/main/kotlin/junitbuild/compatibility/BackwardCompatibilityChecksExtension.kt similarity index 74% rename from gradle/plugins/japicmp/src/main/kotlin/junitbuild/japicmp/JApiCmpExtension.kt rename to gradle/plugins/backward-compatibility/src/main/kotlin/junitbuild/compatibility/BackwardCompatibilityChecksExtension.kt index 549af27e9dd5..a75512920b05 100644 --- a/gradle/plugins/japicmp/src/main/kotlin/junitbuild/japicmp/JApiCmpExtension.kt +++ b/gradle/plugins/backward-compatibility/src/main/kotlin/junitbuild/compatibility/BackwardCompatibilityChecksExtension.kt @@ -1,9 +1,9 @@ -package junitbuild.japicmp +package junitbuild.compatibility import org.gradle.api.provider.Property import org.gradle.api.provider.SetProperty -abstract class JApiCmpExtension { +abstract class BackwardCompatibilityChecksExtension { abstract val enabled: Property diff --git a/gradle/plugins/japicmp/src/main/kotlin/junitbuild/japicmp/AcceptedViolationSuppressor.kt b/gradle/plugins/backward-compatibility/src/main/kotlin/junitbuild/compatibility/japicmp/AcceptedViolationSuppressor.kt similarity index 97% rename from gradle/plugins/japicmp/src/main/kotlin/junitbuild/japicmp/AcceptedViolationSuppressor.kt rename to gradle/plugins/backward-compatibility/src/main/kotlin/junitbuild/compatibility/japicmp/AcceptedViolationSuppressor.kt index e6e26b4b7f25..ca19ecfda2f6 100644 --- a/gradle/plugins/japicmp/src/main/kotlin/junitbuild/japicmp/AcceptedViolationSuppressor.kt +++ b/gradle/plugins/backward-compatibility/src/main/kotlin/junitbuild/compatibility/japicmp/AcceptedViolationSuppressor.kt @@ -1,4 +1,4 @@ -package junitbuild.japicmp +package junitbuild.compatibility.japicmp import japicmp.model.JApiBehavior import japicmp.model.JApiClass diff --git a/gradle/plugins/japicmp/src/main/kotlin/junitbuild/japicmp/AcceptedViolationsPostProcessRule.kt b/gradle/plugins/backward-compatibility/src/main/kotlin/junitbuild/compatibility/japicmp/AcceptedViolationsPostProcessRule.kt similarity index 96% rename from gradle/plugins/japicmp/src/main/kotlin/junitbuild/japicmp/AcceptedViolationsPostProcessRule.kt rename to gradle/plugins/backward-compatibility/src/main/kotlin/junitbuild/compatibility/japicmp/AcceptedViolationsPostProcessRule.kt index b1a34552305c..6f44e04dc69e 100644 --- a/gradle/plugins/japicmp/src/main/kotlin/junitbuild/japicmp/AcceptedViolationsPostProcessRule.kt +++ b/gradle/plugins/backward-compatibility/src/main/kotlin/junitbuild/compatibility/japicmp/AcceptedViolationsPostProcessRule.kt @@ -1,4 +1,4 @@ -package junitbuild.japicmp +package junitbuild.compatibility.japicmp import me.champeau.gradle.japicmp.report.PostProcessViolationsRule import me.champeau.gradle.japicmp.report.Severity.accepted diff --git a/gradle/plugins/japicmp/src/main/kotlin/junitbuild/japicmp/BreakingSuperClassChangeRule.kt b/gradle/plugins/backward-compatibility/src/main/kotlin/junitbuild/compatibility/japicmp/BreakingSuperClassChangeRule.kt similarity index 93% rename from gradle/plugins/japicmp/src/main/kotlin/junitbuild/japicmp/BreakingSuperClassChangeRule.kt rename to gradle/plugins/backward-compatibility/src/main/kotlin/junitbuild/compatibility/japicmp/BreakingSuperClassChangeRule.kt index 5500c7d5f49a..02fd1d77d24a 100644 --- a/gradle/plugins/japicmp/src/main/kotlin/junitbuild/japicmp/BreakingSuperClassChangeRule.kt +++ b/gradle/plugins/backward-compatibility/src/main/kotlin/junitbuild/compatibility/japicmp/BreakingSuperClassChangeRule.kt @@ -1,4 +1,4 @@ -package junitbuild.japicmp +package junitbuild.compatibility.japicmp import japicmp.model.JApiCompatibility import me.champeau.gradle.japicmp.report.Violation diff --git a/gradle/plugins/japicmp/src/main/kotlin/junitbuild/japicmp/InternalApiFilter.kt b/gradle/plugins/backward-compatibility/src/main/kotlin/junitbuild/compatibility/japicmp/InternalApiFilter.kt similarity index 97% rename from gradle/plugins/japicmp/src/main/kotlin/junitbuild/japicmp/InternalApiFilter.kt rename to gradle/plugins/backward-compatibility/src/main/kotlin/junitbuild/compatibility/japicmp/InternalApiFilter.kt index 81ca985e020a..63866548f390 100644 --- a/gradle/plugins/japicmp/src/main/kotlin/junitbuild/japicmp/InternalApiFilter.kt +++ b/gradle/plugins/backward-compatibility/src/main/kotlin/junitbuild/compatibility/japicmp/InternalApiFilter.kt @@ -1,4 +1,4 @@ -package junitbuild.japicmp +package junitbuild.compatibility.japicmp import japicmp.filter.BehaviorFilter import japicmp.filter.ClassFilter diff --git a/gradle/plugins/japicmp/src/main/kotlin/junitbuild/japicmp/JApiCompatibilityExtensions.kt b/gradle/plugins/backward-compatibility/src/main/kotlin/junitbuild/compatibility/japicmp/JApiCompatibilityExtensions.kt similarity index 96% rename from gradle/plugins/japicmp/src/main/kotlin/junitbuild/japicmp/JApiCompatibilityExtensions.kt rename to gradle/plugins/backward-compatibility/src/main/kotlin/junitbuild/compatibility/japicmp/JApiCompatibilityExtensions.kt index 5b65a4c2a41d..b72ae2d68380 100644 --- a/gradle/plugins/japicmp/src/main/kotlin/junitbuild/japicmp/JApiCompatibilityExtensions.kt +++ b/gradle/plugins/backward-compatibility/src/main/kotlin/junitbuild/compatibility/japicmp/JApiCompatibilityExtensions.kt @@ -1,4 +1,4 @@ -package junitbuild.japicmp +package junitbuild.compatibility.japicmp import japicmp.model.JApiBehavior import japicmp.model.JApiClass diff --git a/gradle/plugins/japicmp/src/main/kotlin/junitbuild/japicmp/SourceIncompatibleRule.kt b/gradle/plugins/backward-compatibility/src/main/kotlin/junitbuild/compatibility/japicmp/SourceIncompatibleRule.kt similarity index 91% rename from gradle/plugins/japicmp/src/main/kotlin/junitbuild/japicmp/SourceIncompatibleRule.kt rename to gradle/plugins/backward-compatibility/src/main/kotlin/junitbuild/compatibility/japicmp/SourceIncompatibleRule.kt index 472dd13c0fcd..b9f537f65f92 100644 --- a/gradle/plugins/japicmp/src/main/kotlin/junitbuild/japicmp/SourceIncompatibleRule.kt +++ b/gradle/plugins/backward-compatibility/src/main/kotlin/junitbuild/compatibility/japicmp/SourceIncompatibleRule.kt @@ -1,4 +1,4 @@ -package junitbuild.japicmp +package junitbuild.compatibility.japicmp import japicmp.model.JApiCompatibility import me.champeau.gradle.japicmp.report.Violation diff --git a/gradle/plugins/common/build.gradle.kts b/gradle/plugins/common/build.gradle.kts index 012d3c713210..3e05ad907f86 100644 --- a/gradle/plugins/common/build.gradle.kts +++ b/gradle/plugins/common/build.gradle.kts @@ -8,7 +8,7 @@ plugins { dependencies { implementation("junitbuild.base:dsl-extensions") implementation(projects.buildParameters) - implementation(projects.japicmp) + implementation(projects.backwardCompatibility) implementation(libs.plugins.kotlin.markerCoordinates) implementation(libs.plugins.bnd.markerCoordinates) implementation(libs.plugins.commonCustomUserData.markerCoordinates) diff --git a/gradle/plugins/common/src/main/kotlin/junitbuild.java-aggregator-conventions.gradle.kts b/gradle/plugins/common/src/main/kotlin/junitbuild.java-aggregator-conventions.gradle.kts index 44609ddc18e3..a038740f8534 100644 --- a/gradle/plugins/common/src/main/kotlin/junitbuild.java-aggregator-conventions.gradle.kts +++ b/gradle/plugins/common/src/main/kotlin/junitbuild.java-aggregator-conventions.gradle.kts @@ -1,4 +1,4 @@ -import junitbuild.japicmp.JApiCmpExtension +import junitbuild.compatibility.BackwardCompatibilityChecksExtension plugins { id("junitbuild.java-library-conventions") @@ -10,6 +10,6 @@ tasks.javadoc { enabled = false } -the().apply { +the().apply { enabled = false // already checked by individual projects } diff --git a/gradle/plugins/common/src/main/kotlin/junitbuild.java-library-conventions.gradle.kts b/gradle/plugins/common/src/main/kotlin/junitbuild.java-library-conventions.gradle.kts index 8a5804688a05..4aa988406271 100644 --- a/gradle/plugins/common/src/main/kotlin/junitbuild.java-library-conventions.gradle.kts +++ b/gradle/plugins/common/src/main/kotlin/junitbuild.java-library-conventions.gradle.kts @@ -26,7 +26,7 @@ if (project in mavenizedProjects) { apply(plugin = "junitbuild.javadoc-conventions") apply(plugin = "junitbuild.publishing-conventions") apply(plugin = "junitbuild.osgi-conventions") - apply(plugin = "junitbuild.japicmp") + apply(plugin = "junitbuild.backward-compatibility") java { withSourcesJar() diff --git a/gradle/plugins/settings.gradle.kts b/gradle/plugins/settings.gradle.kts index a5ee476e33e4..b2ae97139041 100644 --- a/gradle/plugins/settings.gradle.kts +++ b/gradle/plugins/settings.gradle.kts @@ -19,10 +19,10 @@ dependencyResolutionManagement { rootProject.name = "plugins" +include("backward-compatibility") include("build-parameters") include("common") include("code-generator") -include("japicmp") include("publishing") enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") diff --git a/junit-jupiter-api/junit-jupiter-api.gradle.kts b/junit-jupiter-api/junit-jupiter-api.gradle.kts index bd409930f19b..2c9ff8decb62 100644 --- a/junit-jupiter-api/junit-jupiter-api.gradle.kts +++ b/junit-jupiter-api/junit-jupiter-api.gradle.kts @@ -36,7 +36,7 @@ tasks { compileJava { options.compilerArgs.add("-Xlint:-module") // due to qualified exports } - checkBackwardCompatibility { + japicmp { classExcludes.addAll($$"*.AssertionsKt$assert*", $$"*.AssertionsKt$evaluate*") } jar { diff --git a/junit-platform-console-standalone/junit-platform-console-standalone.gradle.kts b/junit-platform-console-standalone/junit-platform-console-standalone.gradle.kts index 35e02cc643bd..a5f7634b87d4 100644 --- a/junit-platform-console-standalone/junit-platform-console-standalone.gradle.kts +++ b/junit-platform-console-standalone/junit-platform-console-standalone.gradle.kts @@ -22,7 +22,7 @@ dependencies { osgiVerification(libs.openTestReporting.tooling.spi) } -japicmp { +backwardCompatibilityChecks { enabled = false // already checked by individual projects }