From 421faeeeaf551cacbc5d703645066bae2651e555 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20Segovia=20C=C3=B3rdoba?= Date: Mon, 12 Aug 2024 17:32:32 +0200 Subject: [PATCH] Add being able to log the version only on the root project --- CHANGELOG.md | 2 + README.md | 14 ++++--- .../gradle/plugin/internal/SemverProperty.kt | 7 ++++ .../gradle/plugin/tasks/PrintSemverTask.kt | 15 ++++++- .../project/gradle/plugin/AssertVersion.kt | 8 ++-- .../semver/project/gradle/plugin/Sandbox.kt | 12 +++--- .../project/gradle/plugin/PropertiesTest.kt | 41 ++++++++++++++++--- .../log-on-all-projects/build.gradle.kts | 7 ++++ .../log-on-all-projects/expect-version.txt | 2 + .../log-on-all-projects/last-tag.txt | 1 + .../library-one/build.gradle.kts | 7 ++++ .../library-two/build.gradle.kts | 7 ++++ .../log-on-all-projects/settings.gradle.kts | 4 ++ .../log-only-on-root-project/build.gradle.kts | 7 ++++ .../expect-version.txt | 2 + .../log-only-on-root-project/last-tag.txt | 1 + .../library-one/build.gradle.kts | 7 ++++ .../library-two/build.gradle.kts | 7 ++++ .../settings.gradle.kts | 4 ++ 19 files changed, 133 insertions(+), 22 deletions(-) create mode 100644 semver-project-gradle-plugin/testFunctional/resources/properties/log-on-all-projects/build.gradle.kts create mode 100644 semver-project-gradle-plugin/testFunctional/resources/properties/log-on-all-projects/expect-version.txt create mode 100644 semver-project-gradle-plugin/testFunctional/resources/properties/log-on-all-projects/last-tag.txt create mode 100644 semver-project-gradle-plugin/testFunctional/resources/properties/log-on-all-projects/library-one/build.gradle.kts create mode 100644 semver-project-gradle-plugin/testFunctional/resources/properties/log-on-all-projects/library-two/build.gradle.kts create mode 100644 semver-project-gradle-plugin/testFunctional/resources/properties/log-on-all-projects/settings.gradle.kts create mode 100644 semver-project-gradle-plugin/testFunctional/resources/properties/log-only-on-root-project/build.gradle.kts create mode 100644 semver-project-gradle-plugin/testFunctional/resources/properties/log-only-on-root-project/expect-version.txt create mode 100644 semver-project-gradle-plugin/testFunctional/resources/properties/log-only-on-root-project/last-tag.txt create mode 100644 semver-project-gradle-plugin/testFunctional/resources/properties/log-only-on-root-project/library-one/build.gradle.kts create mode 100644 semver-project-gradle-plugin/testFunctional/resources/properties/log-only-on-root-project/library-two/build.gradle.kts create mode 100644 semver-project-gradle-plugin/testFunctional/resources/properties/log-only-on-root-project/settings.gradle.kts diff --git a/CHANGELOG.md b/CHANGELOG.md index edb9ce7d..568a598a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ ### Added +- Log the version only on the root project via `semver.logOnlyOnRootProject` property + ### Changed ### Deprecated diff --git a/README.md b/README.md index 549abcb7..e1d53433 100644 --- a/README.md +++ b/README.md @@ -58,14 +58,18 @@ They can be set via CLI, for example: - `semver.tagPrefix` is used to know which version is going to be changed based on the tag prefix, for example `v`. If the projects have different tag prefix, it is necessary to disambiguate which version is going to be bumped. +- `semver.logOnlyOnRootProject` is used to log the version in the CLI only on the root project, by + default it is `false`. It can be useful to avoid the version log in multi-project builds. It can + be added to the root `gradle.properties` file to avoid passing it constantly via CLI. Default values: -| | **default value** | **Optional** | -|-----------|-------------------|--------------| -| stage | `auto` | Yes* | -| scope | `auto` | Yes* | -| tagPrefix | `auto` | Yes* | +| | **default value** | **Optional** | +|----------------------|-------------------|--------------| +| stage | `auto` | Yes* | +| scope | `auto` | Yes* | +| tagPrefix | `auto` | Yes* | +| logOnlyOnRootProject | `false` | Yes* | > Depends on the use case* diff --git a/semver-project-gradle-plugin/main/kotlin/com/javiersc/semver/project/gradle/plugin/internal/SemverProperty.kt b/semver-project-gradle-plugin/main/kotlin/com/javiersc/semver/project/gradle/plugin/internal/SemverProperty.kt index 6c6523c5..71fa7acf 100644 --- a/semver-project-gradle-plugin/main/kotlin/com/javiersc/semver/project/gradle/plugin/internal/SemverProperty.kt +++ b/semver-project-gradle-plugin/main/kotlin/com/javiersc/semver/project/gradle/plugin/internal/SemverProperty.kt @@ -33,6 +33,12 @@ internal val Project.checkCleanProperty: Provider internal val Project.commitsMaxCount: Provider get() = getSemverProperty(SemverProperty.CommitsMaxCount).map(String::toInt) +internal val Project.logOnlyOnRootProject: Provider + get() = + providers.provider { + getSemverProperty(SemverProperty.LogOnlyOnRootProject).orNull?.toBoolean() ?: false + } + internal enum class SemverProperty(val key: String) { ProjectTagPrefix("semver.project.tagPrefix"), TagPrefix("semver.tagPrefix"), @@ -41,6 +47,7 @@ internal enum class SemverProperty(val key: String) { Remote("semver.remote"), CheckClean("semver.checkClean"), CommitsMaxCount("semver.commitsMaxCount"), + LogOnlyOnRootProject("semver.logOnlyOnRootProject"), } internal enum class Stage(private val value: String) { diff --git a/semver-project-gradle-plugin/main/kotlin/com/javiersc/semver/project/gradle/plugin/tasks/PrintSemverTask.kt b/semver-project-gradle-plugin/main/kotlin/com/javiersc/semver/project/gradle/plugin/tasks/PrintSemverTask.kt index 4175584a..b09f7a34 100644 --- a/semver-project-gradle-plugin/main/kotlin/com/javiersc/semver/project/gradle/plugin/tasks/PrintSemverTask.kt +++ b/semver-project-gradle-plugin/main/kotlin/com/javiersc/semver/project/gradle/plugin/tasks/PrintSemverTask.kt @@ -1,6 +1,7 @@ package com.javiersc.semver.project.gradle.plugin.tasks import com.javiersc.gradle.project.extensions.isRootProject +import com.javiersc.semver.project.gradle.plugin.internal.logOnlyOnRootProject import com.javiersc.semver.project.gradle.plugin.internal.projectTagPrefix import com.javiersc.semver.project.gradle.plugin.internal.semverMessage import java.io.File @@ -10,6 +11,7 @@ import org.gradle.api.Project import org.gradle.api.Task import org.gradle.api.model.ObjectFactory import org.gradle.api.provider.Property +import org.gradle.api.provider.Provider import org.gradle.api.tasks.Input import org.gradle.api.tasks.TaskAction import org.gradle.api.tasks.TaskProvider @@ -86,12 +88,15 @@ constructor( "Set the version as `semver-subproject-name` output of the GitHub Actions `semver` step ID") public val githubOutput: Property = objects.property().convention(false) + @get:Input public abstract val shouldLogMessage: Property + @get:Input public abstract val tagPrefix: Property @get:Input public abstract val version: Property @TaskAction public fun run() { + val shouldLogMessage: Boolean = shouldLogMessage.get() val semver: String = version.get() val prefix: String = tagPrefix.get() val semverWithPrefix = "$prefix$semver" @@ -99,7 +104,7 @@ constructor( val name: String = if (projectName.isBlank() || projectName == ":") "the root project" else projectName - semverMessage("semver for $name: $semverWithPrefix") + if (shouldLogMessage) semverMessage("semver for $name: $semverWithPrefix") val onlyRoot: Boolean = githubOnlyRoot.orNull ?: false val allProjects: Boolean = !onlyRoot @@ -146,6 +151,7 @@ constructor( public const val NAME: String = "printSemver" internal fun register(project: Project): TaskProvider { + val isRootProject: Boolean = project.isRootProject val prepareKotlinIdeaImportTask: Task = project.tasks.maybeCreate("prepareKotlinIdeaImport") @@ -156,6 +162,13 @@ constructor( printSemverTask.configure { task -> task.dependsOn(WriteSemverTask.NAME) + + val shouldLogMessage: Provider = + project.logOnlyOnRootProject.map { logOnlyOnRoot -> + (logOnlyOnRoot && isRootProject) || !logOnlyOnRoot + } + task.shouldLogMessage.set(shouldLogMessage) + task.tagPrefix.set(project.projectTagPrefix) task.version.set(project.version.toString()) } diff --git a/semver-project-gradle-plugin/testFixtures/kotlin/com/javiersc/semver/project/gradle/plugin/AssertVersion.kt b/semver-project-gradle-plugin/testFixtures/kotlin/com/javiersc/semver/project/gradle/plugin/AssertVersion.kt index a631597c..18141623 100644 --- a/semver-project-gradle-plugin/testFixtures/kotlin/com/javiersc/semver/project/gradle/plugin/AssertVersion.kt +++ b/semver-project-gradle-plugin/testFixtures/kotlin/com/javiersc/semver/project/gradle/plugin/AssertVersion.kt @@ -15,7 +15,7 @@ import io.kotest.matchers.string.shouldContain import java.io.File import java.util.Locale -internal fun File.assertVersionFromExpectVersionFiles() { +fun File.assertVersionFromExpectVersionFiles() { walkTopDown() .filter { it.name == "expect-version.txt" } .map { it.parentFile } @@ -24,7 +24,7 @@ internal fun File.assertVersionFromExpectVersionFiles() { .forEach(::assertVersionFromExpectVersionFile) } -internal fun assertVersionFromExpectVersionFile(file: File) { +fun assertVersionFromExpectVersionFile(file: File) { val expectedVersionFile = file.resolve("expect-version.txt") val lines: List = expectedVersionFile.readLines() val (version: String, tagPrefixVersion: String) = lines @@ -45,7 +45,7 @@ internal fun assertVersionFromExpectVersionFile(file: File) { file.assertVersion(tagPrefix, sanitizeVersion, insignificant) } -internal fun File.assertVersion( +fun File.assertVersion( prefix: String, version: String, insignificant: Insignificant? = null @@ -102,7 +102,7 @@ private fun printExpectedAndActualVersions( println("----------------------------------------".ansiColor(Purple)) } -internal enum class Insignificant { +enum class Insignificant { Hash, Dirty; diff --git a/semver-project-gradle-plugin/testFixtures/kotlin/com/javiersc/semver/project/gradle/plugin/Sandbox.kt b/semver-project-gradle-plugin/testFixtures/kotlin/com/javiersc/semver/project/gradle/plugin/Sandbox.kt index 9c366483..d8599eeb 100644 --- a/semver-project-gradle-plugin/testFixtures/kotlin/com/javiersc/semver/project/gradle/plugin/Sandbox.kt +++ b/semver-project-gradle-plugin/testFixtures/kotlin/com/javiersc/semver/project/gradle/plugin/Sandbox.kt @@ -9,9 +9,9 @@ import org.eclipse.jgit.api.Git import org.eclipse.jgit.storage.file.FileRepositoryBuilder import org.gradle.testkit.runner.GradleRunner -internal val sandboxPath: Path = Paths.get("build/sandbox").apply { toFile().mkdirs() } +val sandboxPath: Path = Paths.get("build/sandbox").apply { toFile().mkdirs() } -internal val GradleRunner.git: Git +val GradleRunner.git: Git get() = Git( FileRepositoryBuilder() @@ -29,14 +29,14 @@ val File.git: Git .findGitDir() .build()) -internal fun getResource(resource: String): File = +fun getResource(resource: String): File = File(Thread.currentThread().contextClassLoader?.getResource(resource)?.toURI()!!) -internal fun createSandboxFile(prefix: String): File = +fun createSandboxFile(prefix: String): File = Files.createTempDirectory(sandboxPath, "$prefix - ").toFile() // `this` is `projectDir` -internal fun File.generateInitialCommitAddVersionTagAndAddNewCommit( +fun File.generateInitialCommitAddVersionTagAndAddNewCommit( doBefore: Git.() -> Unit = {}, doAfter: Git.() -> Unit = {}, ): List { @@ -81,7 +81,7 @@ internal fun File.generateInitialCommitAddVersionTagAndAddNewCommit( ))) } -internal fun File.createGitIgnore() { +fun File.createGitIgnore() { resolve(".gitignore").apply { createNewFile() writeText( diff --git a/semver-project-gradle-plugin/testFunctional/kotlin/com/javiersc/semver/project/gradle/plugin/PropertiesTest.kt b/semver-project-gradle-plugin/testFunctional/kotlin/com/javiersc/semver/project/gradle/plugin/PropertiesTest.kt index bd3eea40..954fd59b 100644 --- a/semver-project-gradle-plugin/testFunctional/kotlin/com/javiersc/semver/project/gradle/plugin/PropertiesTest.kt +++ b/semver-project-gradle-plugin/testFunctional/kotlin/com/javiersc/semver/project/gradle/plugin/PropertiesTest.kt @@ -3,6 +3,8 @@ package com.javiersc.semver.project.gradle.plugin import com.javiersc.gradle.testkit.test.extensions.GradleTestKitTest import com.javiersc.kotlin.stdlib.AnsiColor import com.javiersc.kotlin.stdlib.ansiColor +import io.kotest.matchers.string.shouldContain +import io.kotest.matchers.string.shouldNotContain import java.io.File import kotlin.test.Test @@ -10,11 +12,14 @@ internal class PropertiesTest : GradleTestKitTest() { @Test fun empty() { - runPropertyTestsBasedOnResourceDirectory("empty") { - resolve("empty.txt").createNewFile() - git.add().addFilepattern(".").call() - if (name.endsWith("hash")) git.commit().setMessage("Add empty.txt").call() - } + runPropertyTestsBasedOnResourceDirectory( + resourcePath = "empty", + beforeTest = { + resolve("empty.txt").createNewFile() + git.add().addFilepattern(".").call() + if (name.endsWith("hash")) git.commit().setMessage("Add empty.txt").call() + }, + ) } @Test @@ -32,9 +37,33 @@ internal class PropertiesTest : GradleTestKitTest() { runPropertyTestsBasedOnResourceDirectory("stage+scope") } + @Test + fun `log on all projects`() { + gradleTestKitTest("properties/log-on-all-projects") { + projectDir.generateInitialCommitAddVersionTagAndAddNewCommit() + gradlew("printSemver") + .output + .shouldContain("semver for sandbox-project: v1.") + .shouldContain("semver for library-one: v1.") + .shouldContain("semver for library-two: v1.") + } + } + + @Test + fun `log only on root project`() { + gradleTestKitTest("properties/log-only-on-root-project") { + projectDir.generateInitialCommitAddVersionTagAndAddNewCommit() + gradlew("printSemver", "-Psemver.logOnlyOnRootProject=true") + .output + .shouldContain("semver for sandbox-project: v1.") + .shouldNotContain("semver for library-one: v1.") + .shouldNotContain("semver for library-two: v1.") + } + } + private fun runPropertyTestsBasedOnResourceDirectory( resourcePath: String, - beforeTest: File.() -> Unit = {} + beforeTest: File.() -> Unit = {}, ) { val projects = getResource("properties/$resourcePath") diff --git a/semver-project-gradle-plugin/testFunctional/resources/properties/log-on-all-projects/build.gradle.kts b/semver-project-gradle-plugin/testFunctional/resources/properties/log-on-all-projects/build.gradle.kts new file mode 100644 index 00000000..bc802b47 --- /dev/null +++ b/semver-project-gradle-plugin/testFunctional/resources/properties/log-on-all-projects/build.gradle.kts @@ -0,0 +1,7 @@ +plugins { + id("com.javiersc.semver.project") +} + +semver { + tagPrefix.set("v") +} diff --git a/semver-project-gradle-plugin/testFunctional/resources/properties/log-on-all-projects/expect-version.txt b/semver-project-gradle-plugin/testFunctional/resources/properties/log-on-all-projects/expect-version.txt new file mode 100644 index 00000000..513b9f29 --- /dev/null +++ b/semver-project-gradle-plugin/testFunctional/resources/properties/log-on-all-projects/expect-version.txt @@ -0,0 +1,2 @@ +1.0.1 +v1.0.1 diff --git a/semver-project-gradle-plugin/testFunctional/resources/properties/log-on-all-projects/last-tag.txt b/semver-project-gradle-plugin/testFunctional/resources/properties/log-on-all-projects/last-tag.txt new file mode 100644 index 00000000..0ec25f75 --- /dev/null +++ b/semver-project-gradle-plugin/testFunctional/resources/properties/log-on-all-projects/last-tag.txt @@ -0,0 +1 @@ +v1.0.0 diff --git a/semver-project-gradle-plugin/testFunctional/resources/properties/log-on-all-projects/library-one/build.gradle.kts b/semver-project-gradle-plugin/testFunctional/resources/properties/log-on-all-projects/library-one/build.gradle.kts new file mode 100644 index 00000000..bc802b47 --- /dev/null +++ b/semver-project-gradle-plugin/testFunctional/resources/properties/log-on-all-projects/library-one/build.gradle.kts @@ -0,0 +1,7 @@ +plugins { + id("com.javiersc.semver.project") +} + +semver { + tagPrefix.set("v") +} diff --git a/semver-project-gradle-plugin/testFunctional/resources/properties/log-on-all-projects/library-two/build.gradle.kts b/semver-project-gradle-plugin/testFunctional/resources/properties/log-on-all-projects/library-two/build.gradle.kts new file mode 100644 index 00000000..bc802b47 --- /dev/null +++ b/semver-project-gradle-plugin/testFunctional/resources/properties/log-on-all-projects/library-two/build.gradle.kts @@ -0,0 +1,7 @@ +plugins { + id("com.javiersc.semver.project") +} + +semver { + tagPrefix.set("v") +} diff --git a/semver-project-gradle-plugin/testFunctional/resources/properties/log-on-all-projects/settings.gradle.kts b/semver-project-gradle-plugin/testFunctional/resources/properties/log-on-all-projects/settings.gradle.kts new file mode 100644 index 00000000..532e6799 --- /dev/null +++ b/semver-project-gradle-plugin/testFunctional/resources/properties/log-on-all-projects/settings.gradle.kts @@ -0,0 +1,4 @@ +rootProject.name = "sandbox-project" + +include(":library-one") +include(":library-two") diff --git a/semver-project-gradle-plugin/testFunctional/resources/properties/log-only-on-root-project/build.gradle.kts b/semver-project-gradle-plugin/testFunctional/resources/properties/log-only-on-root-project/build.gradle.kts new file mode 100644 index 00000000..bc802b47 --- /dev/null +++ b/semver-project-gradle-plugin/testFunctional/resources/properties/log-only-on-root-project/build.gradle.kts @@ -0,0 +1,7 @@ +plugins { + id("com.javiersc.semver.project") +} + +semver { + tagPrefix.set("v") +} diff --git a/semver-project-gradle-plugin/testFunctional/resources/properties/log-only-on-root-project/expect-version.txt b/semver-project-gradle-plugin/testFunctional/resources/properties/log-only-on-root-project/expect-version.txt new file mode 100644 index 00000000..513b9f29 --- /dev/null +++ b/semver-project-gradle-plugin/testFunctional/resources/properties/log-only-on-root-project/expect-version.txt @@ -0,0 +1,2 @@ +1.0.1 +v1.0.1 diff --git a/semver-project-gradle-plugin/testFunctional/resources/properties/log-only-on-root-project/last-tag.txt b/semver-project-gradle-plugin/testFunctional/resources/properties/log-only-on-root-project/last-tag.txt new file mode 100644 index 00000000..0ec25f75 --- /dev/null +++ b/semver-project-gradle-plugin/testFunctional/resources/properties/log-only-on-root-project/last-tag.txt @@ -0,0 +1 @@ +v1.0.0 diff --git a/semver-project-gradle-plugin/testFunctional/resources/properties/log-only-on-root-project/library-one/build.gradle.kts b/semver-project-gradle-plugin/testFunctional/resources/properties/log-only-on-root-project/library-one/build.gradle.kts new file mode 100644 index 00000000..bc802b47 --- /dev/null +++ b/semver-project-gradle-plugin/testFunctional/resources/properties/log-only-on-root-project/library-one/build.gradle.kts @@ -0,0 +1,7 @@ +plugins { + id("com.javiersc.semver.project") +} + +semver { + tagPrefix.set("v") +} diff --git a/semver-project-gradle-plugin/testFunctional/resources/properties/log-only-on-root-project/library-two/build.gradle.kts b/semver-project-gradle-plugin/testFunctional/resources/properties/log-only-on-root-project/library-two/build.gradle.kts new file mode 100644 index 00000000..bc802b47 --- /dev/null +++ b/semver-project-gradle-plugin/testFunctional/resources/properties/log-only-on-root-project/library-two/build.gradle.kts @@ -0,0 +1,7 @@ +plugins { + id("com.javiersc.semver.project") +} + +semver { + tagPrefix.set("v") +} diff --git a/semver-project-gradle-plugin/testFunctional/resources/properties/log-only-on-root-project/settings.gradle.kts b/semver-project-gradle-plugin/testFunctional/resources/properties/log-only-on-root-project/settings.gradle.kts new file mode 100644 index 00000000..532e6799 --- /dev/null +++ b/semver-project-gradle-plugin/testFunctional/resources/properties/log-only-on-root-project/settings.gradle.kts @@ -0,0 +1,4 @@ +rootProject.name = "sandbox-project" + +include(":library-one") +include(":library-two")