@@ -7,6 +7,7 @@ import org.gradle.api.logging.Logging
7
7
import org.gradle.api.model.ObjectFactory
8
8
import org.gradle.api.provider.ProviderFactory
9
9
import org.gradle.kotlin.dsl.property
10
+ import java.io.File
10
11
import javax.inject.Inject
11
12
12
13
class TracerVersionPlugin @Inject constructor(
@@ -18,10 +19,10 @@ class TracerVersionPlugin @Inject constructor(
18
19
if (targetProject.rootProject != targetProject) {
19
20
throw IllegalStateException (" Only root project can apply plugin" )
20
21
}
22
+ targetProject.extensions.create(" tracerVersion" , TracerVersionExtension ::class .java)
23
+ val extension = targetProject.extensions.getByType(TracerVersionExtension ::class .java)
21
24
22
- val extension = targetProject.extensions.create(" tracerVersion" , TracerVersionExtension ::class .java)
23
25
val versionProvider = versionProvider(targetProject, extension)
24
-
25
26
targetProject.allprojects {
26
27
version = versionProvider
27
28
}
@@ -31,27 +32,73 @@ class TracerVersionPlugin @Inject constructor(
31
32
targetProject : Project ,
32
33
extension : TracerVersionExtension
33
34
): String {
34
- val workingDirectory = targetProject.projectDir
35
+ val repoWorkingDirectory = targetProject.rootDir
35
36
36
- val buildVersion: String = if (! workingDirectory.resolve(" .git" ).exists()) {
37
+ val buildVersion: String = if (! repoWorkingDirectory.resolve(" .git" ).exists()) {
38
+ // Not a git repository
37
39
extension.defaultVersion.get()
38
40
} 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
+ }
44
56
}
45
- }.map {
46
- toTracerVersion(it.trim(), extension)
47
57
}.get()
48
58
}
49
59
50
60
logger.lifecycle(" Tracer build version: {}" , buildVersion)
51
61
return buildVersion
52
62
}
53
63
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 {
55
102
logger.info(" Git describe output: {}" , describeString)
56
103
57
104
val tagPrefix = extension.tagVersionPrefix.get()
@@ -63,7 +110,7 @@ class TracerVersionPlugin @Inject constructor(
63
110
val hasLaterCommits = describeTrailer.isNotBlank()
64
111
val version = Version .parse(lastTagVersion).let {
65
112
if (hasLaterCommits) {
66
- it.nextMinorVersion ()
113
+ it.nextVersion ()
67
114
} else {
68
115
it
69
116
}
0 commit comments