Skip to content

Commit

Permalink
Add SemverSettingsExtension
Browse files Browse the repository at this point in the history
  • Loading branch information
JavierSegoviaCordoba committed Oct 8, 2024
1 parent 854a65c commit d9c3dab
Show file tree
Hide file tree
Showing 19 changed files with 172 additions and 30 deletions.
20 changes: 7 additions & 13 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -82,23 +82,17 @@ semver {
commitsMaxCount.set(-1)
gitDir.set(rootDir.resolve(".git"))
}

tasks.register("printLastCommitHash") {
doLast {
println(semver.commits.get().last().hash)
}
}
```

- Default values:

| | **default value** |
|---------------------|---------------------------------------------------------------|
| **isEnabled** | `true` |
| **tagPrefix** | ` `, empty string |
| **commitsMaxCount** | `-1` |
| **gitDir** | `rootDir.resolve(".git")` |
| **version** | calculated version based on the last git tag and other inputs |
| | **default value** |
|-------------------------|---------------------------|
| **isEnabled** | `true` |
| **tagPrefix** | ` `, empty string |
| **commitsMaxCount** | `-1` |
| **gitDir** | `rootDir.resolve(".git")` |
| **mapVersion** function | _calculated version_ |

`tagPrefix` is used to asociate a project version with a tag prefix, and it allows having different
versions in multi-project builds.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,16 +26,12 @@ public abstract class com/javiersc/semver/project/gradle/plugin/SemverExtension
public abstract fun getGitDir ()Lorg/gradle/api/file/RegularFileProperty;
public final fun getTagPrefix ()Lorg/gradle/api/provider/Property;
public final fun isEnabled ()Lorg/gradle/api/provider/Property;
public final fun mapVersion (Lcom/javiersc/semver/project/gradle/plugin/SemverExtension$VersionMapper;)V
public final fun mapVersion (Lcom/javiersc/semver/project/gradle/plugin/VersionMapper;)V
}

public final class com/javiersc/semver/project/gradle/plugin/SemverExtension$Companion {
}

public abstract interface class com/javiersc/semver/project/gradle/plugin/SemverExtension$VersionMapper : java/io/Serializable {
public abstract fun map (Lcom/javiersc/gradle/version/GradleVersion;)Ljava/lang/String;
}

public final class com/javiersc/semver/project/gradle/plugin/SemverProjectPlugin : org/gradle/api/Plugin {
public fun <init> ()V
public synthetic fun apply (Ljava/lang/Object;)V
Expand All @@ -55,6 +51,10 @@ public final class com/javiersc/semver/project/gradle/plugin/Tag {
public fun toString ()Ljava/lang/String;
}

public abstract interface class com/javiersc/semver/project/gradle/plugin/VersionMapper : java/io/Serializable {
public abstract fun map (Lcom/javiersc/gradle/version/GradleVersion;)Ljava/lang/String;
}

public final class com/javiersc/semver/project/gradle/plugin/VersionProperty : org/gradle/api/provider/Provider {
public fun <init> (Lorg/gradle/api/provider/Provider;)V
public fun filter (Lorg/gradle/api/specs/Spec;)Lorg/gradle/api/provider/Provider;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
package com.javiersc.semver.project.gradle.plugin

import com.javiersc.gradle.version.GradleVersion
import com.javiersc.semver.project.gradle.plugin.SemverExtension.VersionMapper
import com.javiersc.semver.project.gradle.plugin.internal.DefaultTagPrefix
import com.javiersc.semver.project.gradle.plugin.internal.git.GitCache
import java.io.Serializable
import javax.inject.Inject
import org.gradle.api.Project
import org.gradle.api.file.RegularFileProperty
Expand Down Expand Up @@ -43,11 +40,6 @@ constructor(objects: ObjectFactory, providers: ProviderFactory) {
versionMapper.set(transform)
}

public fun interface VersionMapper : Serializable {

public fun map(version: GradleVersion): String
}

public companion object {

public const val ExtensionName: String = "semver"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.javiersc.semver.project.gradle.plugin

import com.javiersc.gradle.version.GradleVersion
import java.io.Serializable

public fun interface VersionMapper : Serializable {

public fun map(version: GradleVersion): String
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@ package com.javiersc.semver.project.gradle.plugin.valuesources

import com.javiersc.gradle.version.GradleVersion
import com.javiersc.semver.project.gradle.plugin.SemverExtension
import com.javiersc.semver.project.gradle.plugin.VersionMapper
import com.javiersc.semver.project.gradle.plugin.internal.calculatedVersion
import com.javiersc.semver.project.gradle.plugin.internal.checkCleanProperty
import com.javiersc.semver.project.gradle.plugin.internal.checkVersionIsHigherOrSame
import com.javiersc.semver.project.gradle.plugin.internal.commitsMaxCount
import com.javiersc.semver.project.gradle.plugin.internal.git.GitCache
import com.javiersc.semver.project.gradle.plugin.internal.git.GitRef
import com.javiersc.semver.project.gradle.plugin.internal.git.headCommit
import com.javiersc.semver.project.gradle.plugin.internal.projectTagPrefix
import com.javiersc.semver.project.gradle.plugin.internal.scopeProperty
import com.javiersc.semver.project.gradle.plugin.internal.stageProperty
Expand Down Expand Up @@ -82,7 +82,7 @@ internal abstract class VersionValueSource : ValueSource<String, VersionValueSou
}

internal interface Params : ValueSourceParameters {
val versionMapper: Property<SemverExtension.VersionMapper>
val versionMapper: Property<VersionMapper>
val gitDir: RegularFileProperty
val commitsMaxCount: Property<Int>
val tagPrefixProperty: Property<String>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,29 @@
public abstract class com/javiersc/semver/settings/gradle/plugin/SemverSettingsExtension {
public static final field Companion Lcom/javiersc/semver/settings/gradle/plugin/SemverSettingsExtension$Companion;
public static final field ExtensionName Ljava/lang/String;
public fun <init> (Lorg/gradle/api/model/ObjectFactory;)V
public final fun getCommitsMaxCount ()Lorg/gradle/api/provider/Property;
public abstract fun getGitDir ()Lorg/gradle/api/file/RegularFileProperty;
public final fun getTagPrefix ()Lorg/gradle/api/provider/Property;
public final fun isEnabled ()Lorg/gradle/api/provider/Property;
public final fun mapVersion (Lcom/javiersc/semver/project/gradle/plugin/VersionMapper;)V
}

public final class com/javiersc/semver/settings/gradle/plugin/SemverSettingsExtension$Companion {
}

public final class com/javiersc/semver/settings/gradle/plugin/SemverSettingsPlugin : org/gradle/api/Plugin {
public fun <init> ()V
public synthetic fun apply (Ljava/lang/Object;)V
public fun apply (Lorg/gradle/api/initialization/Settings;)V
}

public final class com/javiersc/semver/settings/gradle/plugin/SemverSettingsPlugin$inlined$sam$i$org_gradle_api_Action$0 : org/gradle/api/Action {
public fun <init> (Lkotlin/jvm/functions/Function1;)V
public final synthetic fun execute (Ljava/lang/Object;)V
}

public final class com/javiersc/semver/settings/gradle/plugin/SemverSettingsPluginKt {
public static final fun semver (Lorg/gradle/api/initialization/Settings;Lorg/gradle/api/Action;)V
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
@file:Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE")

package com.javiersc.semver.settings.gradle.plugin

import com.javiersc.semver.project.gradle.plugin.VersionMapper
import com.javiersc.semver.project.gradle.plugin.internal.DefaultTagPrefix
import javax.inject.Inject
import org.gradle.api.file.RegularFileProperty
import org.gradle.api.initialization.Settings
import org.gradle.api.model.ObjectFactory
import org.gradle.api.provider.Property
import org.gradle.kotlin.dsl.create
import org.gradle.kotlin.dsl.property

public abstract class SemverSettingsExtension @Inject constructor(objects: ObjectFactory) {

public val isEnabled: Property<Boolean> = objects.property<Boolean>().convention(true)

public abstract val gitDir: RegularFileProperty

public val commitsMaxCount: Property<Int> = objects.property<Int>().convention(-1)

public val tagPrefix: Property<String> = objects.property<String>().convention(DefaultTagPrefix)

internal val versionMapper: Property<VersionMapper> =
objects
.property<VersionMapper>()
.convention(VersionMapper { version -> version.toString() })

public fun mapVersion(transform: VersionMapper) {
versionMapper.set(transform)
}

public companion object {

public const val ExtensionName: String = "semver"

internal fun register(settings: Settings): SemverSettingsExtension {
val semver = settings.extensions.create<SemverSettingsExtension>(ExtensionName)
val gitDir = settings.providers.provider { settings.rootDir.resolve(".git") }
semver.gitDir.fileProvider(gitDir)
return semver
}
}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,33 @@
@file:Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE")

package com.javiersc.semver.settings.gradle.plugin

import com.javiersc.semver.project.gradle.plugin.SemverExtension
import org.gradle.api.Action
import org.gradle.api.Plugin
import org.gradle.api.initialization.Settings
import org.gradle.kotlin.dsl.configure
import org.gradle.kotlin.dsl.getByType

public class SemverSettingsPlugin : Plugin<Settings> {

override fun apply(target: Settings) {
val semver: SemverSettingsExtension = SemverSettingsExtension.register(target)
target.gradle.beforeProject { project ->
project.pluginManager.apply("com.javiersc.semver")
project.pluginManager.withPlugin("com.javiersc.semver") {
project.configure<SemverExtension> {
this.isEnabled.set(semver.isEnabled)
this.gitDir.set(semver.gitDir)
this.commitsMaxCount.set(semver.commitsMaxCount)
this.tagPrefix.set(semver.tagPrefix)
this.versionMapper.set(semver.versionMapper)
}
}
}
}
}

public fun Settings.semver(action: Action<SemverSettingsExtension>) {
action.execute(extensions.getByType())
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ import org.eclipse.jgit.api.Git
internal class MultiProjectTest : GradleTestKitTest() {

@Test
fun `multi project test`() {
gradleTestKitTest("multi-project") {
fun `multi project basic`() {
gradleTestKitTest("multi-project-basic") {
val git = Git.init().setDirectory(projectDir).call()
git.add().addFilepattern(".").call()
git.commit().setMessage("Initial commit").call()
Expand All @@ -23,4 +23,23 @@ internal class MultiProjectTest : GradleTestKitTest() {
.shouldContain("semver for library-two: t4.7.5")
}
}

@Test
fun `multi project`() {
gradleTestKitTest("multi-project") {
val git = Git.init().setDirectory(projectDir).call()
git.add().addFilepattern(".").call()
git.commit().setMessage("Initial commit").call()
git.tag().setName("v1.0.0").call()
git.tag().setName("w3.1.2").call()
git.tag().setName("o2.0.3").call()
git.tag().setName("t4.7.5").call()
gradlew("printSemver", stacktrace())
.output
.shouldContain("semver for multi-project: w3.1.2")
.shouldContain("semver for library-one: v1.0.0")
.shouldContain("semver for library-two: o2.0.3")
.shouldContain("semver for library-three: t12.13.14")
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
plugins {
java
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
plugins {
java
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
rootProject.name = "multi-project"

plugins {
id("com.javiersc.semver")
}

include(
":library-one",
":library-two",
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
plugins {
java
}

semver {
tagPrefix.set("w")
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
plugins {
java
}

semver {
tagPrefix.set("t")
mapVersion { version -> "12.13.14" }
}
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
plugins {
java
}

semver {
tagPrefix.set("o")
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,12 @@ plugins {
id("com.javiersc.semver")
}

semver {
tagPrefix.set("v")
}

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

0 comments on commit d9c3dab

Please sign in to comment.