Skip to content

Commit

Permalink
Add being able to log the version only on the root project
Browse files Browse the repository at this point in the history
  • Loading branch information
JavierSegoviaCordoba committed Aug 12, 2024
1 parent 0ba9c86 commit 4adbba5
Show file tree
Hide file tree
Showing 20 changed files with 140 additions and 23 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@

### Added

- Log the version only on the root project via `semver.logOnlyOnRootProject` property

### Changed

### Deprecated
Expand Down
14 changes: 9 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,7 @@ public abstract class com/javiersc/semver/project/gradle/plugin/tasks/PrintSemve
public final fun getGithubOutput ()Lorg/gradle/api/provider/Property;
public final fun getGithubOutputTag ()Lorg/gradle/api/provider/Property;
public final fun getGithubOutputVersion ()Lorg/gradle/api/provider/Property;
public abstract fun getShouldLogMessage ()Lorg/gradle/api/provider/Property;
public abstract fun getTagPrefix ()Lorg/gradle/api/provider/Property;
public abstract fun getVersion ()Lorg/gradle/api/provider/Property;
public final fun run ()V
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,12 @@ internal val Project.checkCleanProperty: Provider<Boolean>
internal val Project.commitsMaxCount: Provider<Int>
get() = getSemverProperty(SemverProperty.CommitsMaxCount).map(String::toInt)

internal val Project.logOnlyOnRootProject: Provider<Boolean>
get() =
providers.provider {
getSemverProperty(SemverProperty.LogOnlyOnRootProject).orNull?.toBoolean() ?: false
}

internal enum class SemverProperty(val key: String) {
ProjectTagPrefix("semver.project.tagPrefix"),
TagPrefix("semver.tagPrefix"),
Expand All @@ -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) {
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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
Expand Down Expand Up @@ -86,20 +88,23 @@ constructor(
"Set the version as `semver-subproject-name` output of the GitHub Actions `semver` step ID")
public val githubOutput: Property<Boolean> = objects.property<Boolean>().convention(false)

@get:Input public abstract val shouldLogMessage: Property<Boolean>

@get:Input public abstract val tagPrefix: Property<String>

@get:Input public abstract val version: Property<String>

@TaskAction
public fun run() {
val shouldLogMessage: Boolean = shouldLogMessage.get()
val semver: String = version.get()
val prefix: String = tagPrefix.get()
val semverWithPrefix = "$prefix$semver"

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
Expand Down Expand Up @@ -146,6 +151,7 @@ constructor(
public const val NAME: String = "printSemver"

internal fun register(project: Project): TaskProvider<PrintSemverTask> {
val isRootProject: Boolean = project.isRootProject
val prepareKotlinIdeaImportTask: Task =
project.tasks.maybeCreate("prepareKotlinIdeaImport")

Expand All @@ -156,6 +162,13 @@ constructor(

printSemverTask.configure { task ->
task.dependsOn(WriteSemverTask.NAME)

val shouldLogMessage: Provider<Boolean> =
project.logOnlyOnRootProject.map { logOnlyOnRoot ->
(logOnlyOnRoot && isRootProject) || !logOnlyOnRoot
}
task.shouldLogMessage.set(shouldLogMessage)

task.tagPrefix.set(project.projectTagPrefix)
task.version.set(project.version.toString())
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 }
Expand All @@ -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<String> = expectedVersionFile.readLines()
val (version: String, tagPrefixVersion: String) = lines
Expand All @@ -45,10 +45,10 @@ internal fun assertVersionFromExpectVersionFile(file: File) {
file.assertVersion(tagPrefix, sanitizeVersion, insignificant)
}

internal fun File.assertVersion(
fun File.assertVersion(
prefix: String,
version: String,
insignificant: Insignificant? = null
insignificant: Insignificant? = null,
) {
val buildVersionFile = resolve("build/semver/version.txt")
val buildVersion = buildVersionFile.readLines().first()
Expand Down Expand Up @@ -102,7 +102,7 @@ private fun printExpectedAndActualVersions(
println("----------------------------------------".ansiColor(Purple))
}

internal enum class Insignificant {
enum class Insignificant {
Hash,
Dirty;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand All @@ -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<Commit> {
Expand Down Expand Up @@ -81,7 +81,7 @@ internal fun File.generateInitialCommitAddVersionTagAndAddNewCommit(
)))
}

internal fun File.createGitIgnore() {
fun File.createGitIgnore() {
resolve(".gitignore").apply {
createNewFile()
writeText(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,23 @@ 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

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
Expand All @@ -32,9 +37,38 @@ internal class PropertiesTest : GradleTestKitTest() {
runPropertyTestsBasedOnResourceDirectory("stage+scope")
}

@Test
fun `log on all projects`() {
gradleTestKitTest("properties/log-on-all-projects") {
projectDir.generateInitialCommitAddVersionTagAndAddNewCommit()
gradlew("printSemver", "-Psemver.logOnlyOnRootProject=false")
.output
.shouldContain("semver for sandbox-project: v1.")
.shouldContain("semver for library-one: v1.")
.shouldContain("semver for library-two: v1.")
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")
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
plugins {
id("com.javiersc.semver.project")
}

semver {
tagPrefix.set("v")
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
1.0.1
v1.0.1
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
v1.0.0
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
plugins {
id("com.javiersc.semver.project")
}

semver {
tagPrefix.set("v")
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
plugins {
id("com.javiersc.semver.project")
}

semver {
tagPrefix.set("v")
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
rootProject.name = "sandbox-project"

include(":library-one")
include(":library-two")
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
plugins {
id("com.javiersc.semver.project")
}

semver {
tagPrefix.set("v")
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
1.0.1
v1.0.1
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
v1.0.0
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
plugins {
id("com.javiersc.semver.project")
}

semver {
tagPrefix.set("v")
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
plugins {
id("com.javiersc.semver.project")
}

semver {
tagPrefix.set("v")
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
rootProject.name = "sandbox-project"

include(":library-one")
include(":library-two")

0 comments on commit 4adbba5

Please sign in to comment.