From 239a952d892a2ef3436787702e49a9e4bf75059b Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Sat, 13 Apr 2019 04:43:40 -0700 Subject: [PATCH] Implemented parsing of semver. --- .../net/thauvin/erik/gradle/semver/Utils.kt | 72 +++++++++++++++++-- 1 file changed, 67 insertions(+), 5 deletions(-) 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 41b3aa8..1a02f77 100644 --- a/src/main/kotlin/net/thauvin/erik/gradle/semver/Utils.kt +++ b/src/main/kotlin/net/thauvin/erik/gradle/semver/Utils.kt @@ -61,11 +61,13 @@ object Utils { fun loadVersion(config: SemverConfig, version: Version, props: Properties) { props.apply { - 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.preRelease = loadProperty(this, config.preReleaseKey, Version.DEFAULT_EMPTY) - version.buildMeta = loadProperty(this, config.buildMetaKey, Version.DEFAULT_EMPTY) + 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.preRelease = loadProperty(this, config.preReleaseKey, Version.DEFAULT_EMPTY) + version.buildMeta = loadProperty(this, config.buildMetaKey, Version.DEFAULT_EMPTY) + } if (!isEmpty) { version.preReleasePrefix = @@ -77,6 +79,66 @@ object Utils { } } + fun parseSemVer(input: String?, version: Version): Boolean { + if (input == null) return false + + var semver = StringBuilder(input) + var start = semver.indexOf(version.separator) + var minor = "" + var major = "" + var patch = "" + 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 + if (start != -1) { + minor = semver.substring(0, start) + semver = semver.delete(0, start + minor.length) + start = semver.indexOf(version.preReleasePrefix) + // patch + if (start != -1) { + patch = semver.substring(0, start) + semver.delete(0, start + minor.length) + start = semver.lastIndexOf(version.buildMetaPrefix) + // pre-release + if (start != -1) { + 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 if (semver.isNotEmpty()) { + // no pre-release + patch = semver.toString() + semver.clear() + } + } + } + + if (semver.isNotEmpty()) throw GradleException("Unable to parse version: `$input`.") + + version.major = major + version.minor = minor + version.patch = patch + version.preRelease = preRelease + version.buildMeta = buildMeta + + return true + } + fun saveProperties(config: SemverConfig, version: Version) { val propsFile = File(config.properties) SortedProperties().apply {