Improvements to the version parsing.
This commit is contained in:
parent
e760e8fb77
commit
b9ead8272e
5 changed files with 84 additions and 56 deletions
|
@ -71,9 +71,9 @@ class SemverPlugin : Plugin<Project> {
|
||||||
project.logger.info(
|
project.logger.info(
|
||||||
"[$simpleName] Attempting to read properties from: `$absoluteFile`. [exists: $isNew, isFile: $isFile, canRead: ${propsFile.canRead()}]")
|
"[$simpleName] Attempting to read properties from: `$absoluteFile`. [exists: $isNew, isFile: $isFile, canRead: ${propsFile.canRead()}]")
|
||||||
|
|
||||||
val props = Utils.loadProperties(propsFile)
|
val props = Utils.loadProperties(this)
|
||||||
val requiredProps = setOf(config.majorKey, config.minorKey, config.patchKey, config.preReleaseKey,
|
val requiredProps = setOf(config.semverKey, config.majorKey, config.minorKey, config.patchKey,
|
||||||
config.buildMetaKey)
|
config.preReleaseKey, config.buildMetaKey)
|
||||||
val hasReqProps = !isNew && props.stringPropertyNames().containsAll(requiredProps) &&
|
val hasReqProps = !isNew && props.stringPropertyNames().containsAll(requiredProps) &&
|
||||||
Utils.isNotSystemProperty(requiredProps)
|
Utils.isNotSystemProperty(requiredProps)
|
||||||
|
|
||||||
|
@ -87,7 +87,7 @@ class SemverPlugin : Plugin<Project> {
|
||||||
project.logger.info("[$simpleName] Project version set to: ${project.version}")
|
project.logger.info("[$simpleName] Project version set to: ${project.version}")
|
||||||
|
|
||||||
if (!hasReqProps || !isFile) {
|
if (!hasReqProps || !isFile) {
|
||||||
project.logger.info("[$simpleName] Saving version properties to `${config.properties}`.")
|
project.logger.info("[$simpleName] Saving version properties to `$absoluteFile`.")
|
||||||
Utils.saveProperties(config, version)
|
Utils.saveProperties(config, version)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,6 +18,11 @@ object Utils {
|
||||||
return canRead() && isFile
|
return canRead() && isFile
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun Int.length() = when (this) {
|
||||||
|
0 -> 1
|
||||||
|
else -> Math.log10(Math.abs(toDouble())).toInt() + 1
|
||||||
|
}
|
||||||
|
|
||||||
private fun Properties.put(key: String, value: String, isValidCondition: Boolean) {
|
private fun Properties.put(key: String, value: String, isValidCondition: Boolean) {
|
||||||
if (isValidCondition) put(key, value)
|
if (isValidCondition) put(key, value)
|
||||||
}
|
}
|
||||||
|
@ -55,6 +60,14 @@ object Utils {
|
||||||
return props
|
return props
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun loadIntProperty(props: Properties, key: String, default: Int): Int {
|
||||||
|
try {
|
||||||
|
return loadProperty(props, key, default.toString()).toInt()
|
||||||
|
} catch (e: java.lang.NumberFormatException) {
|
||||||
|
throw GradleException("Unable to parse $key property. (${e.message})", e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fun loadProperty(props: Properties, key: String, default: String): String {
|
fun loadProperty(props: Properties, key: String, default: String): String {
|
||||||
return System.getProperty(key, if (props.isNotEmpty()) props.getProperty(key, default) else default)
|
return System.getProperty(key, if (props.isNotEmpty()) props.getProperty(key, default) else default)
|
||||||
}
|
}
|
||||||
|
@ -62,9 +75,9 @@ object Utils {
|
||||||
fun loadVersion(config: SemverConfig, version: Version, props: Properties) {
|
fun loadVersion(config: SemverConfig, version: Version, props: Properties) {
|
||||||
props.apply {
|
props.apply {
|
||||||
if (!parseSemVer(System.getProperty(config.semverKey), version)) {
|
if (!parseSemVer(System.getProperty(config.semverKey), version)) {
|
||||||
version.major = loadProperty(this, config.majorKey, Version.DEFAULT_MAJOR)
|
version.major = loadIntProperty(this, config.majorKey, Version.DEFAULT_MAJOR)
|
||||||
version.minor = loadProperty(this, config.minorKey, Version.DEFAULT_MINOR)
|
version.minor = loadIntProperty(this, config.minorKey, Version.DEFAULT_MINOR)
|
||||||
version.patch = loadProperty(this, config.patchKey, Version.DEFAULT_PATCH)
|
version.patch = loadIntProperty(this, config.patchKey, Version.DEFAULT_PATCH)
|
||||||
version.preRelease = loadProperty(this, config.preReleaseKey, Version.DEFAULT_EMPTY)
|
version.preRelease = loadProperty(this, config.preReleaseKey, Version.DEFAULT_EMPTY)
|
||||||
version.buildMeta = loadProperty(this, config.buildMetaKey, Version.DEFAULT_EMPTY)
|
version.buildMeta = loadProperty(this, config.buildMetaKey, Version.DEFAULT_EMPTY)
|
||||||
}
|
}
|
||||||
|
@ -84,51 +97,62 @@ object Utils {
|
||||||
|
|
||||||
var semver = StringBuilder(input)
|
var semver = StringBuilder(input)
|
||||||
var start = semver.indexOf(version.separator)
|
var start = semver.indexOf(version.separator)
|
||||||
var minor = ""
|
var minor = -1
|
||||||
var major = ""
|
var major = -1
|
||||||
var patch = ""
|
var patch = -1
|
||||||
var preRelease = ""
|
var preRelease = ""
|
||||||
var buildMeta = ""
|
var buildMeta = ""
|
||||||
|
|
||||||
// major
|
try {
|
||||||
if (start != -1) {
|
// major
|
||||||
major = semver.substring(0, start)
|
|
||||||
semver.delete(0, start + major.length)
|
|
||||||
start = semver.indexOf(version.separator)
|
|
||||||
// minor
|
|
||||||
if (start != -1) {
|
if (start != -1) {
|
||||||
minor = semver.substring(0, start)
|
major = semver.substring(0, start).toInt()
|
||||||
semver = semver.delete(0, start + minor.length)
|
semver.delete(0, start + major.length())
|
||||||
start = semver.indexOf(version.preReleasePrefix)
|
start = semver.indexOf(version.separator)
|
||||||
// patch
|
// minor
|
||||||
if (start != -1) {
|
if (start != -1) {
|
||||||
patch = semver.substring(0, start)
|
minor = semver.substring(0, start).toInt()
|
||||||
semver.delete(0, start + minor.length)
|
semver = semver.delete(0, start + minor.length())
|
||||||
start = semver.lastIndexOf(version.buildMetaPrefix)
|
start = semver.indexOf(version.preReleasePrefix)
|
||||||
// pre-release
|
// patch
|
||||||
if (start != -1) {
|
if (start != -1) {
|
||||||
preRelease = semver.substring(0, start)
|
patch = semver.substring(0, start).toInt()
|
||||||
semver.delete(0, preRelease.length)
|
semver.delete(0, start + minor.length())
|
||||||
start = semver.indexOf(version.buildMetaPrefix)
|
start = semver.lastIndexOf(version.buildMetaPrefix)
|
||||||
// build meta
|
// pre-release
|
||||||
if (start != -1) {
|
if (start != -1) {
|
||||||
buildMeta = semver.substring(version.preReleasePrefix.length)
|
preRelease = semver.substring(0, start)
|
||||||
|
semver.delete(0, preRelease.length)
|
||||||
|
start = semver.indexOf(version.buildMetaPrefix)
|
||||||
|
// build meta
|
||||||
|
if (start != -1) {
|
||||||
|
buildMeta = semver.substring(version.preReleasePrefix.length)
|
||||||
|
semver.clear()
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// no build meta
|
||||||
|
preRelease = semver.toString()
|
||||||
semver.clear()
|
semver.clear()
|
||||||
}
|
}
|
||||||
} else {
|
} else if (semver.isNotEmpty()) {
|
||||||
// no build meta
|
// no pre-release
|
||||||
preRelease = semver.toString()
|
start = semver.lastIndexOf(version.buildMetaPrefix)
|
||||||
|
if (start != -1) {
|
||||||
|
patch = semver.substring(0, start).toInt()
|
||||||
|
semver.delete(0, start + minor.length())
|
||||||
|
buildMeta = semver.toString()
|
||||||
|
} else {
|
||||||
|
patch = semver.toString().toInt()
|
||||||
|
}
|
||||||
semver.clear()
|
semver.clear()
|
||||||
}
|
}
|
||||||
} else if (semver.isNotEmpty()) {
|
|
||||||
// no pre-release
|
|
||||||
patch = semver.toString()
|
|
||||||
semver.clear()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} catch (e: NumberFormatException) {
|
||||||
|
throw GradleException("Unable to parse version: \"$input\" (${e.message})", e)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (semver.isNotEmpty()) throw GradleException("Unable to parse version: `$input`.")
|
if (semver.isNotEmpty()) throw GradleException("Unable to parse version: \"$input\".")
|
||||||
|
|
||||||
version.major = major
|
version.major = major
|
||||||
version.minor = minor
|
version.minor = minor
|
||||||
|
@ -150,9 +174,9 @@ object Utils {
|
||||||
}
|
}
|
||||||
|
|
||||||
put(config.semverKey, version.semver)
|
put(config.semverKey, version.semver)
|
||||||
put(config.majorKey, version.major)
|
put(config.majorKey, version.major.toString())
|
||||||
put(config.minorKey, version.minor)
|
put(config.minorKey, version.minor.toString())
|
||||||
put(config.patchKey, version.patch)
|
put(config.patchKey, version.patch.toString())
|
||||||
put(config.preReleaseKey, version.preRelease)
|
put(config.preReleaseKey, version.preRelease)
|
||||||
put(config.buildMetaKey, version.buildMeta)
|
put(config.buildMetaKey, version.buildMeta)
|
||||||
put(config.semverKey, version.semver)
|
put(config.semverKey, version.semver)
|
||||||
|
|
|
@ -33,9 +33,9 @@ package net.thauvin.erik.gradle.semver
|
||||||
|
|
||||||
class Version {
|
class Version {
|
||||||
companion object {
|
companion object {
|
||||||
const val DEFAULT_MAJOR: String = "1"
|
const val DEFAULT_MAJOR: Int = 1
|
||||||
const val DEFAULT_MINOR: String = "0"
|
const val DEFAULT_MINOR: Int = 0
|
||||||
const val DEFAULT_PATCH: String = "0"
|
const val DEFAULT_PATCH: Int = 0
|
||||||
const val DEFAULT_EMPTY: String = ""
|
const val DEFAULT_EMPTY: String = ""
|
||||||
const val DEFAULT_PRERELEASE_PREFIX = "-"
|
const val DEFAULT_PRERELEASE_PREFIX = "-"
|
||||||
const val DEFAULT_BUILDMETA_PREFIX = "+"
|
const val DEFAULT_BUILDMETA_PREFIX = "+"
|
||||||
|
@ -58,15 +58,15 @@ class Version {
|
||||||
|
|
||||||
fun increment(isMajor: Boolean = false, isMinor: Boolean = false, isPatch: Boolean = false) {
|
fun increment(isMajor: Boolean = false, isMinor: Boolean = false, isPatch: Boolean = false) {
|
||||||
if (isMajor) {
|
if (isMajor) {
|
||||||
major = (major.toInt() + 1).toString()
|
major++
|
||||||
minor = DEFAULT_MINOR
|
minor = DEFAULT_MINOR
|
||||||
patch = DEFAULT_PATCH
|
patch = DEFAULT_PATCH
|
||||||
}
|
}
|
||||||
if (isMinor) {
|
if (isMinor) {
|
||||||
minor = (minor.toInt() + 1).toString()
|
minor++
|
||||||
patch = DEFAULT_PATCH
|
patch = DEFAULT_PATCH
|
||||||
}
|
}
|
||||||
if (isPatch) patch = (patch.toInt() + 1).toString()
|
if (isPatch) patch++
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun toString(): String {
|
override fun toString(): String {
|
||||||
|
|
|
@ -43,15 +43,15 @@ object SemverVersionSpec : Spek({
|
||||||
When("validating default version") {}
|
When("validating default version") {}
|
||||||
|
|
||||||
Then("major should be 1") {
|
Then("major should be 1") {
|
||||||
assertEquals("1", version.major)
|
assertEquals(1, version.major)
|
||||||
}
|
}
|
||||||
|
|
||||||
Then("minor should be 1") {
|
Then("minor should be 1") {
|
||||||
assertEquals("0", version.minor)
|
assertEquals(0, version.minor)
|
||||||
}
|
}
|
||||||
|
|
||||||
Then("patch should be 0") {
|
Then("patch should be 0") {
|
||||||
assertEquals("0", version.patch)
|
assertEquals(0, version.patch)
|
||||||
}
|
}
|
||||||
|
|
||||||
Then("prerelease should be empty") {
|
Then("prerelease should be empty") {
|
||||||
|
@ -149,9 +149,9 @@ object SemverVersionSpec : Spek({
|
||||||
}
|
}
|
||||||
|
|
||||||
When("resetting version") {
|
When("resetting version") {
|
||||||
version.major = "1"
|
version.major = 1
|
||||||
version.minor = "0"
|
version.minor = 0
|
||||||
version.patch = "0"
|
version.patch = 0
|
||||||
}
|
}
|
||||||
|
|
||||||
Then("should return 1.0.0") {
|
Then("should return 1.0.0") {
|
||||||
|
|
|
@ -64,9 +64,9 @@ object UtilsSpec : Spek({
|
||||||
}
|
}
|
||||||
|
|
||||||
Then("version and properties should be the same.") {
|
Then("version and properties should be the same.") {
|
||||||
assertEquals(props.getProperty(config.majorKey), version.major, "Major")
|
assertEquals(props.getProperty(config.majorKey), version.major.toString(), "Major")
|
||||||
assertEquals(props.getProperty(config.minorKey), version.minor, "Minor")
|
assertEquals(props.getProperty(config.minorKey), version.minor.toString(), "Minor")
|
||||||
assertEquals(props.getProperty(config.patchKey), version.patch, "Patch")
|
assertEquals(props.getProperty(config.patchKey), version.patch.toString(), "Patch")
|
||||||
assertEquals(props.getProperty(config.preReleaseKey), version.preRelease, "PreRelease")
|
assertEquals(props.getProperty(config.preReleaseKey), version.preRelease, "PreRelease")
|
||||||
assertNull(props.getProperty(config.preReleasePrefixKey), "PreRelease Prefix")
|
assertNull(props.getProperty(config.preReleasePrefixKey), "PreRelease Prefix")
|
||||||
assertEquals(props.getProperty(config.buildMetaKey), version.buildMeta, "Build Meta")
|
assertEquals(props.getProperty(config.buildMetaKey), version.buildMeta, "Build Meta")
|
||||||
|
@ -96,7 +96,11 @@ object UtilsSpec : Spek({
|
||||||
Then("version should match system properties") {
|
Then("version should match system properties") {
|
||||||
sysProps.forEach {
|
sysProps.forEach {
|
||||||
System.getProperties().setProperty(it.first, it.second)
|
System.getProperties().setProperty(it.first, it.second)
|
||||||
assertEquals(Utils.loadProperty(props, it.first, ""), it.second)
|
if (it.first == config.majorKey || it.first == config.minorKey || it.first == config.patchKey) {
|
||||||
|
assertEquals(Utils.loadIntProperty(props, it.first, -1), it.second.toInt())
|
||||||
|
} else {
|
||||||
|
assertEquals(Utils.loadProperty(props, it.first, ""), it.second)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue