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( 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)
} }
} }

View file

@ -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)

View file

@ -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 {

View file

@ -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") {

View file

@ -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)
}
} }
} }