Improvements to the version parsing.

This commit is contained in:
Erik C. Thauvin 2019-04-14 00:34:11 -07:00
parent e760e8fb77
commit b9ead8272e
5 changed files with 84 additions and 56 deletions

View file

@ -71,9 +71,9 @@ class SemverPlugin : Plugin<Project> {
project.logger.info(
"[$simpleName] Attempting to read properties from: `$absoluteFile`. [exists: $isNew, isFile: $isFile, canRead: ${propsFile.canRead()}]")
val props = Utils.loadProperties(propsFile)
val requiredProps = setOf(config.majorKey, config.minorKey, config.patchKey, config.preReleaseKey,
config.buildMetaKey)
val props = Utils.loadProperties(this)
val requiredProps = setOf(config.semverKey, config.majorKey, config.minorKey, config.patchKey,
config.preReleaseKey, config.buildMetaKey)
val hasReqProps = !isNew && props.stringPropertyNames().containsAll(requiredProps) &&
Utils.isNotSystemProperty(requiredProps)
@ -87,7 +87,7 @@ class SemverPlugin : Plugin<Project> {
project.logger.info("[$simpleName] Project version set to: ${project.version}")
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)
}
}

View file

@ -18,6 +18,11 @@ object Utils {
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) {
if (isValidCondition) put(key, value)
}
@ -55,6 +60,14 @@ object Utils {
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 {
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) {
props.apply {
if (!parseSemVer(System.getProperty(config.semverKey), version)) {
version.major = loadProperty(this, config.majorKey, Version.DEFAULT_MAJOR)
version.minor = loadProperty(this, config.minorKey, Version.DEFAULT_MINOR)
version.patch = loadProperty(this, config.patchKey, Version.DEFAULT_PATCH)
version.major = loadIntProperty(this, config.majorKey, Version.DEFAULT_MAJOR)
version.minor = loadIntProperty(this, config.minorKey, Version.DEFAULT_MINOR)
version.patch = loadIntProperty(this, config.patchKey, Version.DEFAULT_PATCH)
version.preRelease = loadProperty(this, config.preReleaseKey, Version.DEFAULT_EMPTY)
version.buildMeta = loadProperty(this, config.buildMetaKey, Version.DEFAULT_EMPTY)
}
@ -84,51 +97,62 @@ object Utils {
var semver = StringBuilder(input)
var start = semver.indexOf(version.separator)
var minor = ""
var major = ""
var patch = ""
var minor = -1
var major = -1
var patch = -1
var preRelease = ""
var buildMeta = ""
// major
if (start != -1) {
major = semver.substring(0, start)
semver.delete(0, start + major.length)
start = semver.indexOf(version.separator)
// minor
try {
// major
if (start != -1) {
minor = semver.substring(0, start)
semver = semver.delete(0, start + minor.length)
start = semver.indexOf(version.preReleasePrefix)
// patch
major = semver.substring(0, start).toInt()
semver.delete(0, start + major.length())
start = semver.indexOf(version.separator)
// minor
if (start != -1) {
patch = semver.substring(0, start)
semver.delete(0, start + minor.length)
start = semver.lastIndexOf(version.buildMetaPrefix)
// pre-release
minor = semver.substring(0, start).toInt()
semver = semver.delete(0, start + minor.length())
start = semver.indexOf(version.preReleasePrefix)
// patch
if (start != -1) {
preRelease = semver.substring(0, start)
semver.delete(0, preRelease.length)
start = semver.indexOf(version.buildMetaPrefix)
// build meta
patch = semver.substring(0, start).toInt()
semver.delete(0, start + minor.length())
start = semver.lastIndexOf(version.buildMetaPrefix)
// pre-release
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()
}
} else {
// no build meta
preRelease = semver.toString()
} else if (semver.isNotEmpty()) {
// no pre-release
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()
}
} 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.minor = minor
@ -150,9 +174,9 @@ object Utils {
}
put(config.semverKey, version.semver)
put(config.majorKey, version.major)
put(config.minorKey, version.minor)
put(config.patchKey, version.patch)
put(config.majorKey, version.major.toString())
put(config.minorKey, version.minor.toString())
put(config.patchKey, version.patch.toString())
put(config.preReleaseKey, version.preRelease)
put(config.buildMetaKey, version.buildMeta)
put(config.semverKey, version.semver)

View file

@ -33,9 +33,9 @@ package net.thauvin.erik.gradle.semver
class Version {
companion object {
const val DEFAULT_MAJOR: String = "1"
const val DEFAULT_MINOR: String = "0"
const val DEFAULT_PATCH: String = "0"
const val DEFAULT_MAJOR: Int = 1
const val DEFAULT_MINOR: Int = 0
const val DEFAULT_PATCH: Int = 0
const val DEFAULT_EMPTY: String = ""
const val DEFAULT_PRERELEASE_PREFIX = "-"
const val DEFAULT_BUILDMETA_PREFIX = "+"
@ -58,15 +58,15 @@ class Version {
fun increment(isMajor: Boolean = false, isMinor: Boolean = false, isPatch: Boolean = false) {
if (isMajor) {
major = (major.toInt() + 1).toString()
major++
minor = DEFAULT_MINOR
patch = DEFAULT_PATCH
}
if (isMinor) {
minor = (minor.toInt() + 1).toString()
minor++
patch = DEFAULT_PATCH
}
if (isPatch) patch = (patch.toInt() + 1).toString()
if (isPatch) patch++
}
override fun toString(): String {

View file

@ -43,15 +43,15 @@ object SemverVersionSpec : Spek({
When("validating default version") {}
Then("major should be 1") {
assertEquals("1", version.major)
assertEquals(1, version.major)
}
Then("minor should be 1") {
assertEquals("0", version.minor)
assertEquals(0, version.minor)
}
Then("patch should be 0") {
assertEquals("0", version.patch)
assertEquals(0, version.patch)
}
Then("prerelease should be empty") {
@ -149,9 +149,9 @@ object SemverVersionSpec : Spek({
}
When("resetting version") {
version.major = "1"
version.minor = "0"
version.patch = "0"
version.major = 1
version.minor = 0
version.patch = 0
}
Then("should return 1.0.0") {

View file

@ -64,9 +64,9 @@ object UtilsSpec : Spek({
}
Then("version and properties should be the same.") {
assertEquals(props.getProperty(config.majorKey), version.major, "Major")
assertEquals(props.getProperty(config.minorKey), version.minor, "Minor")
assertEquals(props.getProperty(config.patchKey), version.patch, "Patch")
assertEquals(props.getProperty(config.majorKey), version.major.toString(), "Major")
assertEquals(props.getProperty(config.minorKey), version.minor.toString(), "Minor")
assertEquals(props.getProperty(config.patchKey), version.patch.toString(), "Patch")
assertEquals(props.getProperty(config.preReleaseKey), version.preRelease, "PreRelease")
assertNull(props.getProperty(config.preReleasePrefixKey), "PreRelease Prefix")
assertEquals(props.getProperty(config.buildMetaKey), version.buildMeta, "Build Meta")
@ -96,7 +96,11 @@ object UtilsSpec : Spek({
Then("version should match system properties") {
sysProps.forEach {
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)
}
}
}