@@ -7,6 +7,7 @@ import org.gradle.api.logging.Logging
77import org.gradle.api.model.ObjectFactory
88import org.gradle.api.provider.ProviderFactory
99import org.gradle.kotlin.dsl.property
10+ import java.io.File
1011import javax.inject.Inject
1112
1213class TracerVersionPlugin @Inject constructor(
@@ -18,10 +19,10 @@ class TracerVersionPlugin @Inject constructor(
1819 if (targetProject.rootProject != targetProject) {
1920 throw IllegalStateException (" Only root project can apply plugin" )
2021 }
22+ targetProject.extensions.create(" tracerVersion" , TracerVersionExtension ::class .java)
23+ val extension = targetProject.extensions.getByType(TracerVersionExtension ::class .java)
2124
22- val extension = targetProject.extensions.create(" tracerVersion" , TracerVersionExtension ::class .java)
2325 val versionProvider = versionProvider(targetProject, extension)
24-
2526 targetProject.allprojects {
2627 version = versionProvider
2728 }
@@ -31,27 +32,73 @@ class TracerVersionPlugin @Inject constructor(
3132 targetProject : Project ,
3233 extension : TracerVersionExtension
3334 ): String {
34- val workingDirectory = targetProject.projectDir
35+ val repoWorkingDirectory = targetProject.rootDir
3536
36- val buildVersion: String = if (! workingDirectory.resolve(" .git" ).exists()) {
37+ val buildVersion: String = if (! repoWorkingDirectory.resolve(" .git" ).exists()) {
38+ // Not a git repository
3739 extension.defaultVersion.get()
3840 } else {
39- providerFactory.of(GitDescribeValueSource ::class .java) {
40- parameters {
41- this .tagVersionPrefix.set(extension.tagVersionPrefix)
42- this .showDirty.set(extension.detectDirty)
43- this .workingDirectory.set(workingDirectory)
41+ providerFactory.zip(
42+ gitDescribeProvider(extension, repoWorkingDirectory),
43+ gitCurrentBranchProvider(repoWorkingDirectory)
44+ ) { describeString, currentBranch ->
45+ toTracerVersion(describeString, extension) {
46+ when {
47+ currentBranch.startsWith(" release/v" ) -> {
48+ logger.info(" Incrementing patch because release branch : $currentBranch " )
49+ nextPatchVersion()
50+ }
51+ else -> {
52+ logger.info(" Incrementing patch" )
53+ nextMinorVersion()
54+ }
55+ }
4456 }
45- }.map {
46- toTracerVersion(it.trim(), extension)
4757 }.get()
4858 }
4959
5060 logger.lifecycle(" Tracer build version: {}" , buildVersion)
5161 return buildVersion
5262 }
5363
54- private fun toTracerVersion (describeString : String , extension : TracerVersionExtension ): String {
64+ private fun gitCurrentBranchProvider (
65+ repoWorkingDirectory : File
66+ ) = providerFactory.of(GitCommandValueSource ::class .java) {
67+ parameters {
68+ gitCommand.addAll(
69+ " git" ,
70+ " rev-parse" ,
71+ " --abbrev-ref" ,
72+ " HEAD" ,
73+ )
74+ workingDirectory.set(repoWorkingDirectory)
75+ }
76+ }
77+
78+ private fun gitDescribeProvider (
79+ extension : TracerVersionExtension ,
80+ repoWorkingDirectory : File
81+ ) = providerFactory.of(GitCommandValueSource ::class .java) {
82+ parameters {
83+ val tagPrefix = extension.tagVersionPrefix.get()
84+ gitCommand.addAll(
85+ " git" ,
86+ " describe" ,
87+ " --abbrev=8" ,
88+ " --tags" ,
89+ " --first-parent" ,
90+ " --match=$tagPrefix [0-9].[0-9]*.[0-9]" ,
91+ )
92+
93+ if (extension.detectDirty.get()) {
94+ gitCommand.add(" --dirty" )
95+ }
96+
97+ workingDirectory.set(repoWorkingDirectory)
98+ }
99+ }
100+
101+ private fun toTracerVersion (describeString : String , extension : TracerVersionExtension , nextVersion : Version .() -> Version ): String {
55102 logger.info(" Git describe output: {}" , describeString)
56103
57104 val tagPrefix = extension.tagVersionPrefix.get()
@@ -63,7 +110,7 @@ class TracerVersionPlugin @Inject constructor(
63110 val hasLaterCommits = describeTrailer.isNotBlank()
64111 val version = Version .parse(lastTagVersion).let {
65112 if (hasLaterCommits) {
66- it.nextMinorVersion ()
113+ it.nextVersion ()
67114 } else {
68115 it
69116 }
0 commit comments