From b9ead8272e85d8446bb4d01445d7dc9d3d2906a6 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sun, 14 Apr 2019 00:34:11 -0700 Subject: [PATCH] Improvements to the version parsing. --- .../erik/gradle/semver/SemverPlugin.kt | 8 +- .../net/thauvin/erik/gradle/semver/Utils.kt | 96 ++++++++++++------- .../net/thauvin/erik/gradle/semver/Version.kt | 12 +-- .../erik/gradle/semver/SemverVersionSpec.kt | 12 +-- .../thauvin/erik/gradle/semver/UtilsSpec.kt | 12 ++- 5 files changed, 84 insertions(+), 56 deletions(-) diff --git a/src/main/kotlin/net/thauvin/erik/gradle/semver/SemverPlugin.kt b/src/main/kotlin/net/thauvin/erik/gradle/semver/SemverPlugin.kt index cc73422..0f38c8f 100644 --- a/src/main/kotlin/net/thauvin/erik/gradle/semver/SemverPlugin.kt +++ b/src/main/kotlin/net/thauvin/erik/gradle/semver/SemverPlugin.kt @@ -71,9 +71,9 @@ class SemverPlugin : Plugin { 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.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) } } diff --git a/src/main/kotlin/net/thauvin/erik/gradle/semver/Utils.kt b/src/main/kotlin/net/thauvin/erik/gradle/semver/Utils.kt index 1a02f77..9fe07b5 100644 --- a/src/main/kotlin/net/thauvin/erik/gradle/semver/Utils.kt +++ b/src/main/kotlin/net/thauvin/erik/gradle/semver/Utils.kt @@ -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) diff --git a/src/main/kotlin/net/thauvin/erik/gradle/semver/Version.kt b/src/main/kotlin/net/thauvin/erik/gradle/semver/Version.kt index b60ee6b..6cd7143 100644 --- a/src/main/kotlin/net/thauvin/erik/gradle/semver/Version.kt +++ b/src/main/kotlin/net/thauvin/erik/gradle/semver/Version.kt @@ -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 { diff --git a/src/test/kotlin/net/thauvin/erik/gradle/semver/SemverVersionSpec.kt b/src/test/kotlin/net/thauvin/erik/gradle/semver/SemverVersionSpec.kt index 7c26ddf..ab1db94 100644 --- a/src/test/kotlin/net/thauvin/erik/gradle/semver/SemverVersionSpec.kt +++ b/src/test/kotlin/net/thauvin/erik/gradle/semver/SemverVersionSpec.kt @@ -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") { diff --git a/src/test/kotlin/net/thauvin/erik/gradle/semver/UtilsSpec.kt b/src/test/kotlin/net/thauvin/erik/gradle/semver/UtilsSpec.kt index 412bdac..314d3a4 100644 --- a/src/test/kotlin/net/thauvin/erik/gradle/semver/UtilsSpec.kt +++ b/src/test/kotlin/net/thauvin/erik/gradle/semver/UtilsSpec.kt @@ -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) + } } }