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(
|
||||
"[$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)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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,26 +97,27 @@ 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 = ""
|
||||
|
||||
try {
|
||||
// major
|
||||
if (start != -1) {
|
||||
major = semver.substring(0, start)
|
||||
semver.delete(0, start + major.length)
|
||||
major = semver.substring(0, start).toInt()
|
||||
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)
|
||||
minor = semver.substring(0, start).toInt()
|
||||
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)
|
||||
patch = semver.substring(0, start).toInt()
|
||||
semver.delete(0, start + minor.length())
|
||||
start = semver.lastIndexOf(version.buildMetaPrefix)
|
||||
// pre-release
|
||||
if (start != -1) {
|
||||
|
@ -122,13 +136,23 @@ object Utils {
|
|||
}
|
||||
} else if (semver.isNotEmpty()) {
|
||||
// no pre-release
|
||||
patch = 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()
|
||||
}
|
||||
}
|
||||
}
|
||||
} 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)
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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") {
|
||||
|
|
|
@ -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,9 +96,13 @@ object UtilsSpec : Spek({
|
|||
Then("version should match system properties") {
|
||||
sysProps.forEach {
|
||||
System.getProperties().setProperty(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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
When("loading version") {
|
||||
Utils.loadVersion(config, version, props)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue