From 97d8095de5205da564ad539993efc56ba5adbfa4 Mon Sep 17 00:00:00 2001 From: Brian Amesbury Date: Tue, 12 Feb 2019 08:37:22 -0700 Subject: [PATCH] adding the config plugin to allow offsets given a certain branch or tag matches a regex --- build.local.gradle | 10 +- git-version/build.gradle.kts | 8 + .../git/version/GitVersionConfigPlugin.kt | 15 ++ .../git/version/GitVersionPlugin.kt | 17 +- .../extensions/BranchOffsetNestedExtension.kt | 14 ++ .../extensions/MoonlitDoorExtension.kt | 19 ++ .../git/version/FakeExtensionContainer.kt | 40 ++-- .../moonlitdoor/git/version/FakeGitFacade.kt | 4 +- .../version/FakeNamedDomainObjectContainer.kt | 216 ++++++++++++++++++ .../moonlitdoor/git/version/FakeProject.kt | 11 +- .../git/version/GitVersionPluginTest.kt | 28 +++ gradle/wrapper/gradle-wrapper.properties | 2 +- settings.gradle | 2 - 13 files changed, 352 insertions(+), 34 deletions(-) create mode 100644 git-version/src/main/kotlin/com/moonlitdoor/git/version/GitVersionConfigPlugin.kt create mode 100644 git-version/src/main/kotlin/com/moonlitdoor/git/version/extensions/BranchOffsetNestedExtension.kt create mode 100644 git-version/src/main/kotlin/com/moonlitdoor/git/version/extensions/MoonlitDoorExtension.kt create mode 100644 git-version/src/test/kotlin/com/moonlitdoor/git/version/FakeNamedDomainObjectContainer.kt diff --git a/build.local.gradle b/build.local.gradle index 9a57364..f5a9f14 100644 --- a/build.local.gradle +++ b/build.local.gradle @@ -4,7 +4,15 @@ buildscript { } dependencies { - classpath "com.moonlitdoor.git-version:git-version:0.0.7-1-SNAPSHOT" + classpath "com.moonlitdoor.git-version:git-version:0.0.8-8-SNAPSHOT" + } +} + +apply plugin: "com.moonlitdoor.git-version-config" + +mld.offsets { + master { + offset = 1_000_000 } } diff --git a/git-version/build.gradle.kts b/git-version/build.gradle.kts index d5947e1..c551507 100644 --- a/git-version/build.gradle.kts +++ b/git-version/build.gradle.kts @@ -21,6 +21,10 @@ gradlePlugin { id = "com.moonlitdoor.git-version" implementationClass = "com.moonlitdoor.git.version.GitVersionPlugin" } + register("git-version-config") { + id = "com.moonlitdoor.git-version-config" + implementationClass = "com.moonlitdoor.git.version.GitVersionConfigPlugin" + } } } @@ -33,5 +37,9 @@ pluginBundle { displayName = "Git Version Plugin" tags = listOf("git", "version", "android", "java") } + "git-version-config" { + displayName = "Git Version Plugin Configuration" + tags = listOf("git", "version", "android", "java") + } } } \ No newline at end of file diff --git a/git-version/src/main/kotlin/com/moonlitdoor/git/version/GitVersionConfigPlugin.kt b/git-version/src/main/kotlin/com/moonlitdoor/git/version/GitVersionConfigPlugin.kt new file mode 100644 index 0000000..30fedee --- /dev/null +++ b/git-version/src/main/kotlin/com/moonlitdoor/git/version/GitVersionConfigPlugin.kt @@ -0,0 +1,15 @@ +package com.moonlitdoor.git.version + +import com.moonlitdoor.git.version.extensions.BranchOffsetNestedExtension +import com.moonlitdoor.git.version.extensions.MoonlitDoorExtension +import org.gradle.api.Plugin +import org.gradle.api.Project + +@Suppress("Unused") +class GitVersionConfigPlugin : Plugin { + + override fun apply(project: Project) { + project.extensions.create(MoonlitDoorExtension.EXTENSION_NAME, MoonlitDoorExtension::class.java).offsets = project.container(BranchOffsetNestedExtension::class.java) + } + +} diff --git a/git-version/src/main/kotlin/com/moonlitdoor/git/version/GitVersionPlugin.kt b/git-version/src/main/kotlin/com/moonlitdoor/git/version/GitVersionPlugin.kt index 9e69c74..4a114e8 100644 --- a/git-version/src/main/kotlin/com/moonlitdoor/git/version/GitVersionPlugin.kt +++ b/git-version/src/main/kotlin/com/moonlitdoor/git/version/GitVersionPlugin.kt @@ -1,5 +1,7 @@ package com.moonlitdoor.git.version +import com.moonlitdoor.git.version.extensions.BranchOffsetNestedExtension +import com.moonlitdoor.git.version.extensions.MoonlitDoorExtension import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.internal.impldep.com.google.common.annotations.VisibleForTesting @@ -12,13 +14,24 @@ class GitVersionPlugin : Plugin { internal var git = GitFacade() override fun apply(project: Project) { - val gitCommitCount = getGitCommitCount(project.projectDir) + + if (project.extensions.findByType(MoonlitDoorExtension::class.java) == null) { + project.extensions.create(MoonlitDoorExtension.EXTENSION_NAME, MoonlitDoorExtension::class.java).offsets = project.container(BranchOffsetNestedExtension::class.java) + } + + var gitCommitCount = getGitCommitCount(project.projectDir) val gitTagCount = getGitTagCount(project.projectDir) + val gitBranchName = getGitBranchName(project.projectDir) + + val byType = project.extensions.getByType(MoonlitDoorExtension::class.java) + byType.offsets.find { Regex(it.name).matches(gitBranchName) }?.let { + gitCommitCount += it.offset + } project.extensions.add(GIT_COMMIT_COUNT, gitCommitCount) project.extensions.add(GIT_TAG_COUNT, gitTagCount) project.extensions.add(GIT_COMMIT_AND_TAG_COUNT, gitCommitCount + gitTagCount) project.extensions.add(GIT_VERSION, getGitVersion(project.projectDir)) - project.extensions.add(GIT_BRANCH_NAME, getGitBranchName(project.projectDir)) + project.extensions.add(GIT_BRANCH_NAME, gitBranchName) } private fun getGitVersion(projectDir: File): String { diff --git a/git-version/src/main/kotlin/com/moonlitdoor/git/version/extensions/BranchOffsetNestedExtension.kt b/git-version/src/main/kotlin/com/moonlitdoor/git/version/extensions/BranchOffsetNestedExtension.kt new file mode 100644 index 0000000..0c8ff73 --- /dev/null +++ b/git-version/src/main/kotlin/com/moonlitdoor/git/version/extensions/BranchOffsetNestedExtension.kt @@ -0,0 +1,14 @@ +package com.moonlitdoor.git.version.extensions + +import org.gradle.internal.impldep.com.google.common.annotations.VisibleForTesting + +open class BranchOffsetNestedExtension(var name: String) { + + @VisibleForTesting + constructor(name: String, offset: Int) : this(name) { + this.offset = offset + } + + var offset = 0 + +} \ No newline at end of file diff --git a/git-version/src/main/kotlin/com/moonlitdoor/git/version/extensions/MoonlitDoorExtension.kt b/git-version/src/main/kotlin/com/moonlitdoor/git/version/extensions/MoonlitDoorExtension.kt new file mode 100644 index 0000000..7049d97 --- /dev/null +++ b/git-version/src/main/kotlin/com/moonlitdoor/git/version/extensions/MoonlitDoorExtension.kt @@ -0,0 +1,19 @@ +package com.moonlitdoor.git.version.extensions + +import groovy.lang.Closure +import org.gradle.api.NamedDomainObjectContainer + +open class MoonlitDoorExtension { + + companion object { + const val EXTENSION_NAME = "mld" + } + + lateinit var offsets: NamedDomainObjectContainer + + @Suppress("unused") + fun offsets(action: Closure) { + offsets.configure(action) + } + +} \ No newline at end of file diff --git a/git-version/src/test/kotlin/com/moonlitdoor/git/version/FakeExtensionContainer.kt b/git-version/src/test/kotlin/com/moonlitdoor/git/version/FakeExtensionContainer.kt index e0e544d..26edc49 100644 --- a/git-version/src/test/kotlin/com/moonlitdoor/git/version/FakeExtensionContainer.kt +++ b/git-version/src/test/kotlin/com/moonlitdoor/git/version/FakeExtensionContainer.kt @@ -1,5 +1,6 @@ package com.moonlitdoor.git.version +import com.moonlitdoor.git.version.extensions.MoonlitDoorExtension import org.gradle.api.Action import org.gradle.api.plugins.ExtensionContainer import org.gradle.api.plugins.ExtensionsSchema @@ -8,12 +9,32 @@ import org.gradle.api.reflect.TypeOf class FakeExtensionContainer : ExtensionContainer { - private val container = mutableMapOf() + private val container = mutableMapOf() override fun add(name: String, extension: Any) { container[name] = extension } + override fun create(name: String, type: Class, vararg constructionArguments: Any?): T = type.newInstance().also { + if (it is MoonlitDoorExtension) { + it.offsets = FakeNamedDomainObjectContainer() + } + container[name] = it + } + + override fun getByName(name: String): Any = container[name]!! + + @Suppress("UNCHECKED_CAST") + override fun findByType(type: Class): T? = container.values.find { + type.isInstance(it) + } as T? + + @Suppress("UNCHECKED_CAST") + override fun getByType(type: Class): T = container.values.find { + type.isInstance(it) + } as T + + override fun configure(type: Class, action: Action) { TODO("not implemented") //To change body of created functions use File | Settings | File Templates. } @@ -42,15 +63,6 @@ class FakeExtensionContainer : ExtensionContainer { TODO("not implemented") //To change body of created functions use File | Settings | File Templates. } - override fun create(name: String, type: Class, vararg constructionArguments: Any?): T { - TODO("not implemented") //To change body of created functions use File | Settings | File Templates. - } - - override fun getByName(name: String): Any = container[name]!! -// { -// TODO("not implemented") //To change body of created functions use File | Settings | File Templates. -// } - override fun findByName(name: String): Any? { TODO("not implemented") //To change body of created functions use File | Settings | File Templates. } @@ -67,18 +79,10 @@ class FakeExtensionContainer : ExtensionContainer { TODO("not implemented") //To change body of created functions use File | Settings | File Templates. } - override fun getByType(type: Class): T { - TODO("not implemented") //To change body of created functions use File | Settings | File Templates. - } - override fun getByType(type: TypeOf): T { TODO("not implemented") //To change body of created functions use File | Settings | File Templates. } - override fun findByType(type: Class): T? { - TODO("not implemented") //To change body of created functions use File | Settings | File Templates. - } - override fun findByType(type: TypeOf): T? { TODO("not implemented") //To change body of created functions use File | Settings | File Templates. } diff --git a/git-version/src/test/kotlin/com/moonlitdoor/git/version/FakeGitFacade.kt b/git-version/src/test/kotlin/com/moonlitdoor/git/version/FakeGitFacade.kt index f648a09..cd932d4 100644 --- a/git-version/src/test/kotlin/com/moonlitdoor/git/version/FakeGitFacade.kt +++ b/git-version/src/test/kotlin/com/moonlitdoor/git/version/FakeGitFacade.kt @@ -10,7 +10,7 @@ open class FakeGitFacade : GitFacade() { "gittag" -> "0.1.0\n0.0.4\n0.0.3\n0.0.2\n0.0.1\n0.0.0" "gitdescribe--tags" -> getTag() "gitstatus--porcelain" -> getStatus() - "gitrev-parse--abbrev-refHEAD" -> "master" + "gitrev-parse--abbrev-refHEAD" -> getBranch() else -> "" } } @@ -18,4 +18,6 @@ open class FakeGitFacade : GitFacade() { open fun getTag(): String = "0.0.0" open fun getStatus(): String = "" + + open fun getBranch(): String = "master" } \ No newline at end of file diff --git a/git-version/src/test/kotlin/com/moonlitdoor/git/version/FakeNamedDomainObjectContainer.kt b/git-version/src/test/kotlin/com/moonlitdoor/git/version/FakeNamedDomainObjectContainer.kt new file mode 100644 index 0000000..653afc5 --- /dev/null +++ b/git-version/src/test/kotlin/com/moonlitdoor/git/version/FakeNamedDomainObjectContainer.kt @@ -0,0 +1,216 @@ +package com.moonlitdoor.git.version + +import com.moonlitdoor.git.version.extensions.BranchOffsetNestedExtension +import groovy.lang.Closure +import org.gradle.api.* +import org.gradle.api.provider.Provider +import org.gradle.api.specs.Spec +import java.util.* + +class FakeNamedDomainObjectContainer : NamedDomainObjectContainer { + + + private val container = mutableMapOf() + + override fun iterator(): MutableIterator = container.values.iterator() + + override fun add(element: T): Boolean = if (element is BranchOffsetNestedExtension) { + container[element.name] = element + true + } else { + false + } + + + override fun contains(element: T): Boolean { + TODO("not implemented1") //To change body of created functions use File | Settings | File Templates. + } + + override fun addAll(elements: Collection): Boolean { + TODO("not implemented2") //To change body of created functions use File | Settings | File Templates. + } + + override fun matching(spec: Spec): NamedDomainObjectSet { + TODO("not implemented3") //To change body of created functions use File | Settings | File Templates. + } + + override fun matching(spec: Closure<*>): NamedDomainObjectSet { + TODO("not implemented4") //To change body of created functions use File | Settings | File Templates. + } + + override fun clear() { + TODO("not implemented5") //To change body of created functions use File | Settings | File Templates. + } + + override fun addRule(rule: Rule): Rule { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun addRule(description: String, ruleAction: Closure<*>): Rule { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun addRule(description: String, ruleAction: Action): Rule { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun configure(configureClosure: Closure<*>): NamedDomainObjectContainer { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun addAllLater(provider: Provider>) { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun create(name: String): T { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun create(name: String, configureClosure: Closure<*>): T { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun create(name: String, configureAction: Action): T { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun removeAll(elements: Collection): Boolean { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun all(action: Action) { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun all(action: Closure<*>) { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun register(name: String, configurationAction: Action): NamedDomainObjectProvider { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun register(name: String): NamedDomainObjectProvider { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun named(name: String): NamedDomainObjectProvider { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun named(name: String, configurationAction: Action): NamedDomainObjectProvider { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun named(name: String, type: Class): NamedDomainObjectProvider { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun named(name: String, type: Class, configurationAction: Action): NamedDomainObjectProvider { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun getNamer(): Namer { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun getRules(): MutableList { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun getCollectionSchema(): NamedDomainObjectCollectionSchema { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun whenObjectRemoved(action: Action): Action { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun whenObjectRemoved(action: Closure<*>) { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun findAll(spec: Closure<*>): MutableSet { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun addLater(provider: Provider) { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun containsAll(elements: Collection): Boolean { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun isEmpty(): Boolean { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun getByName(name: String): T { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun getByName(name: String, configureClosure: Closure<*>): T { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun getByName(name: String, configureAction: Action): T { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun configureEach(action: Action) { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun maybeCreate(name: String): T { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun withType(type: Class): NamedDomainObjectSet { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun withType(type: Class, configureAction: Action): DomainObjectCollection { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun withType(type: Class, configureClosure: Closure<*>): DomainObjectCollection { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun findByName(name: String): T? { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun whenObjectAdded(action: Action): Action { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun whenObjectAdded(action: Closure<*>) { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun retainAll(elements: Collection): Boolean { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun getNames(): SortedSet { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun getAsMap(): SortedMap { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun getAt(name: String): T { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override val size: Int + get() = 10//TODO("not implemented") //To change initializer of created properties use File | Settings | File Templates. + + override fun remove(element: T): Boolean { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + +} \ No newline at end of file diff --git a/git-version/src/test/kotlin/com/moonlitdoor/git/version/FakeProject.kt b/git-version/src/test/kotlin/com/moonlitdoor/git/version/FakeProject.kt index aebe5b1..80ea1ad 100644 --- a/git-version/src/test/kotlin/com/moonlitdoor/git/version/FakeProject.kt +++ b/git-version/src/test/kotlin/com/moonlitdoor/git/version/FakeProject.kt @@ -15,7 +15,6 @@ import org.gradle.api.logging.Logger import org.gradle.api.logging.LoggingManager import org.gradle.api.model.ObjectFactory import org.gradle.api.plugins.* -import org.gradle.api.provider.PropertyState import org.gradle.api.provider.Provider import org.gradle.api.provider.ProviderFactory import org.gradle.api.resources.ResourceHandler @@ -37,6 +36,8 @@ class FakeProject : Project { override fun getExtensions(): ExtensionContainer = extensionContainer + override fun container(type: Class): NamedDomainObjectContainer = FakeNamedDomainObjectContainer() + override fun getGroup(): Any { TODO("not implemented") //To change body of created functions use File | Settings | File Templates. } @@ -113,10 +114,6 @@ class FakeProject : Project { TODO("not implemented") //To change body of created functions use File | Settings | File Templates. } - override fun property(clazz: Class): PropertyState { - TODO("not implemented") //To change body of created functions use File | Settings | File Templates. - } - override fun property(propertyName: String): Any? { TODO("not implemented") //To change body of created functions use File | Settings | File Templates. } @@ -157,10 +154,6 @@ class FakeProject : Project { TODO("not implemented") //To change body of created functions use File | Settings | File Templates. } - override fun container(type: Class): NamedDomainObjectContainer { - TODO("not implemented") //To change body of created functions use File | Settings | File Templates. - } - override fun container(type: Class, factory: NamedDomainObjectFactory): NamedDomainObjectContainer { TODO("not implemented") //To change body of created functions use File | Settings | File Templates. } diff --git a/git-version/src/test/kotlin/com/moonlitdoor/git/version/GitVersionPluginTest.kt b/git-version/src/test/kotlin/com/moonlitdoor/git/version/GitVersionPluginTest.kt index 0600977..8d94354 100644 --- a/git-version/src/test/kotlin/com/moonlitdoor/git/version/GitVersionPluginTest.kt +++ b/git-version/src/test/kotlin/com/moonlitdoor/git/version/GitVersionPluginTest.kt @@ -1,5 +1,7 @@ package com.moonlitdoor.git.version +import com.moonlitdoor.git.version.extensions.BranchOffsetNestedExtension +import com.moonlitdoor.git.version.extensions.MoonlitDoorExtension import org.gradle.kotlin.dsl.get import org.junit.Assert.assertEquals import org.junit.Test @@ -27,6 +29,32 @@ open class GitVersionPluginTest { assertEquals(20L, project.extensions[GitVersionPlugin.GIT_COMMIT_COUNT]) } + @Test + fun testGitCommitCountBranchAlphaAlphaOffset1000() { + val plugin = GitVersionPlugin() + val project = FakeProject() + project.extensions.create(MoonlitDoorExtension.EXTENSION_NAME, MoonlitDoorExtension::class.java).offsets.add(BranchOffsetNestedExtension("alpha", 1_000)) + plugin.git = object : FakeGitFacade() { + override fun getBranch(): String = "alpha" + } + plugin.apply(project) + + assertEquals(1020L, project.extensions[GitVersionPlugin.GIT_COMMIT_COUNT]) + } + + @Test + fun testGitCommitCountBranchMasterAlphaOffset1000() { + val plugin = GitVersionPlugin() + val project = FakeProject() + project.extensions.create(MoonlitDoorExtension.EXTENSION_NAME, MoonlitDoorExtension::class.java).offsets.add(BranchOffsetNestedExtension("alpha").also { + it.offset = 1_000 + }) + plugin.git = FakeGitFacade() + plugin.apply(project) + + assertEquals(20L, project.extensions[GitVersionPlugin.GIT_COMMIT_COUNT]) + } + @Test fun testGitTagCount() { val plugin = GitVersionPlugin() diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 4cbb2e6..363cce7 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.10-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip diff --git a/settings.gradle b/settings.gradle index 09b003b..1d6a321 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,3 +1 @@ include 'git-version' -enableFeaturePreview('STABLE_PUBLISHING') -