diff --git a/README.md b/README.md index 553efc79..6623fd8c 100644 --- a/README.md +++ b/README.md @@ -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. diff --git a/semver-project-gradle-plugin/api/semver-project-gradle-plugin.api b/semver-project-gradle-plugin/api/semver-project-gradle-plugin.api index e345be21..ea8b25e5 100644 --- a/semver-project-gradle-plugin/api/semver-project-gradle-plugin.api +++ b/semver-project-gradle-plugin/api/semver-project-gradle-plugin.api @@ -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 ()V public synthetic fun apply (Ljava/lang/Object;)V @@ -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 (Lorg/gradle/api/provider/Provider;)V public fun filter (Lorg/gradle/api/specs/Spec;)Lorg/gradle/api/provider/Provider; diff --git a/semver-project-gradle-plugin/main/kotlin/com/javiersc/semver/project/gradle/plugin/SemverExtension.kt b/semver-project-gradle-plugin/main/kotlin/com/javiersc/semver/project/gradle/plugin/SemverExtension.kt index 8d52db65..ef5c72fd 100644 --- a/semver-project-gradle-plugin/main/kotlin/com/javiersc/semver/project/gradle/plugin/SemverExtension.kt +++ b/semver-project-gradle-plugin/main/kotlin/com/javiersc/semver/project/gradle/plugin/SemverExtension.kt @@ -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 @@ -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" diff --git a/semver-project-gradle-plugin/main/kotlin/com/javiersc/semver/project/gradle/plugin/VersionMapper.kt b/semver-project-gradle-plugin/main/kotlin/com/javiersc/semver/project/gradle/plugin/VersionMapper.kt new file mode 100644 index 00000000..55c106d5 --- /dev/null +++ b/semver-project-gradle-plugin/main/kotlin/com/javiersc/semver/project/gradle/plugin/VersionMapper.kt @@ -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 +} diff --git a/semver-project-gradle-plugin/main/kotlin/com/javiersc/semver/project/gradle/plugin/valuesources/VersionValueSource.kt b/semver-project-gradle-plugin/main/kotlin/com/javiersc/semver/project/gradle/plugin/valuesources/VersionValueSource.kt index de634be1..aef66cd0 100644 --- a/semver-project-gradle-plugin/main/kotlin/com/javiersc/semver/project/gradle/plugin/valuesources/VersionValueSource.kt +++ b/semver-project-gradle-plugin/main/kotlin/com/javiersc/semver/project/gradle/plugin/valuesources/VersionValueSource.kt @@ -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 @@ -82,7 +82,7 @@ internal abstract class VersionValueSource : ValueSource + val versionMapper: Property val gitDir: RegularFileProperty val commitsMaxCount: Property val tagPrefixProperty: Property diff --git a/semver-settings-gradle-plugin/api/semver-settings-gradle-plugin.api b/semver-settings-gradle-plugin/api/semver-settings-gradle-plugin.api index fe1cf21e..0fea949c 100644 --- a/semver-settings-gradle-plugin/api/semver-settings-gradle-plugin.api +++ b/semver-settings-gradle-plugin/api/semver-settings-gradle-plugin.api @@ -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 (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 ()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 (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 +} + diff --git a/semver-settings-gradle-plugin/main/kotlin/com/javiersc/semver/settings/gradle/plugin/SemverSettingsExtension.kt b/semver-settings-gradle-plugin/main/kotlin/com/javiersc/semver/settings/gradle/plugin/SemverSettingsExtension.kt new file mode 100644 index 00000000..84a9099e --- /dev/null +++ b/semver-settings-gradle-plugin/main/kotlin/com/javiersc/semver/settings/gradle/plugin/SemverSettingsExtension.kt @@ -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 = objects.property().convention(true) + + public abstract val gitDir: RegularFileProperty + + public val commitsMaxCount: Property = objects.property().convention(-1) + + public val tagPrefix: Property = objects.property().convention(DefaultTagPrefix) + + internal val versionMapper: Property = + objects + .property() + .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(ExtensionName) + val gitDir = settings.providers.provider { settings.rootDir.resolve(".git") } + semver.gitDir.fileProvider(gitDir) + return semver + } + } +} diff --git a/semver-settings-gradle-plugin/main/kotlin/com/javiersc/semver/settings/gradle/plugin/SemverSettingsPlugin.kt b/semver-settings-gradle-plugin/main/kotlin/com/javiersc/semver/settings/gradle/plugin/SemverSettingsPlugin.kt index 326f4c3c..09552b49 100644 --- a/semver-settings-gradle-plugin/main/kotlin/com/javiersc/semver/settings/gradle/plugin/SemverSettingsPlugin.kt +++ b/semver-settings-gradle-plugin/main/kotlin/com/javiersc/semver/settings/gradle/plugin/SemverSettingsPlugin.kt @@ -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 { 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 { + 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) { + action.execute(extensions.getByType()) +} diff --git a/semver-settings-gradle-plugin/testFunctional/kotlin/com/javiersc/semver/settings/gradle/plugin/MultiProjectTest.kt b/semver-settings-gradle-plugin/testFunctional/kotlin/com/javiersc/semver/settings/gradle/plugin/MultiProjectTest.kt index 99f824cc..731943f3 100644 --- a/semver-settings-gradle-plugin/testFunctional/kotlin/com/javiersc/semver/settings/gradle/plugin/MultiProjectTest.kt +++ b/semver-settings-gradle-plugin/testFunctional/kotlin/com/javiersc/semver/settings/gradle/plugin/MultiProjectTest.kt @@ -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() @@ -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") + } + } } diff --git a/semver-settings-gradle-plugin/testFunctional/resources/multi-project/gradle.properties b/semver-settings-gradle-plugin/testFunctional/resources/multi-project-basic/gradle.properties similarity index 100% rename from semver-settings-gradle-plugin/testFunctional/resources/multi-project/gradle.properties rename to semver-settings-gradle-plugin/testFunctional/resources/multi-project-basic/gradle.properties diff --git a/semver-settings-gradle-plugin/testFunctional/resources/multi-project-basic/library-one/build.gradle.kts b/semver-settings-gradle-plugin/testFunctional/resources/multi-project-basic/library-one/build.gradle.kts new file mode 100644 index 00000000..3b371f30 --- /dev/null +++ b/semver-settings-gradle-plugin/testFunctional/resources/multi-project-basic/library-one/build.gradle.kts @@ -0,0 +1,3 @@ +plugins { + java +} diff --git a/semver-settings-gradle-plugin/testFunctional/resources/multi-project/library-one/gradle.properties b/semver-settings-gradle-plugin/testFunctional/resources/multi-project-basic/library-one/gradle.properties similarity index 100% rename from semver-settings-gradle-plugin/testFunctional/resources/multi-project/library-one/gradle.properties rename to semver-settings-gradle-plugin/testFunctional/resources/multi-project-basic/library-one/gradle.properties diff --git a/semver-settings-gradle-plugin/testFunctional/resources/multi-project-basic/library-two/build.gradle.kts b/semver-settings-gradle-plugin/testFunctional/resources/multi-project-basic/library-two/build.gradle.kts new file mode 100644 index 00000000..3b371f30 --- /dev/null +++ b/semver-settings-gradle-plugin/testFunctional/resources/multi-project-basic/library-two/build.gradle.kts @@ -0,0 +1,3 @@ +plugins { + java +} diff --git a/semver-settings-gradle-plugin/testFunctional/resources/multi-project/library-two/gradle.properties b/semver-settings-gradle-plugin/testFunctional/resources/multi-project-basic/library-two/gradle.properties similarity index 100% rename from semver-settings-gradle-plugin/testFunctional/resources/multi-project/library-two/gradle.properties rename to semver-settings-gradle-plugin/testFunctional/resources/multi-project-basic/library-two/gradle.properties diff --git a/semver-settings-gradle-plugin/testFunctional/resources/multi-project-basic/settings.gradle.kts b/semver-settings-gradle-plugin/testFunctional/resources/multi-project-basic/settings.gradle.kts new file mode 100644 index 00000000..c3ba21e8 --- /dev/null +++ b/semver-settings-gradle-plugin/testFunctional/resources/multi-project-basic/settings.gradle.kts @@ -0,0 +1,10 @@ +rootProject.name = "multi-project" + +plugins { + id("com.javiersc.semver") +} + +include( + ":library-one", + ":library-two", +) diff --git a/semver-settings-gradle-plugin/testFunctional/resources/multi-project/build.gradle.kts b/semver-settings-gradle-plugin/testFunctional/resources/multi-project/build.gradle.kts new file mode 100644 index 00000000..2031d83a --- /dev/null +++ b/semver-settings-gradle-plugin/testFunctional/resources/multi-project/build.gradle.kts @@ -0,0 +1,7 @@ +plugins { + java +} + +semver { + tagPrefix.set("w") +} diff --git a/semver-settings-gradle-plugin/testFunctional/resources/multi-project/library-three/build.gradle.kts b/semver-settings-gradle-plugin/testFunctional/resources/multi-project/library-three/build.gradle.kts new file mode 100644 index 00000000..72562366 --- /dev/null +++ b/semver-settings-gradle-plugin/testFunctional/resources/multi-project/library-three/build.gradle.kts @@ -0,0 +1,8 @@ +plugins { + java +} + +semver { + tagPrefix.set("t") + mapVersion { version -> "12.13.14" } +} diff --git a/semver-settings-gradle-plugin/testFunctional/resources/multi-project/library-two/build.gradle.kts b/semver-settings-gradle-plugin/testFunctional/resources/multi-project/library-two/build.gradle.kts index 3b371f30..d28935d3 100644 --- a/semver-settings-gradle-plugin/testFunctional/resources/multi-project/library-two/build.gradle.kts +++ b/semver-settings-gradle-plugin/testFunctional/resources/multi-project/library-two/build.gradle.kts @@ -1,3 +1,7 @@ plugins { java } + +semver { + tagPrefix.set("o") +} diff --git a/semver-settings-gradle-plugin/testFunctional/resources/multi-project/settings.gradle.kts b/semver-settings-gradle-plugin/testFunctional/resources/multi-project/settings.gradle.kts index c3ba21e8..0ad3461a 100644 --- a/semver-settings-gradle-plugin/testFunctional/resources/multi-project/settings.gradle.kts +++ b/semver-settings-gradle-plugin/testFunctional/resources/multi-project/settings.gradle.kts @@ -4,7 +4,12 @@ plugins { id("com.javiersc.semver") } +semver { + tagPrefix.set("v") +} + include( ":library-one", ":library-two", + ":library-three", )