All Downloads are FREE. Search and download functionalities are using the official Maven repository.

ru.fix.gradle.release.plugin.VersionManager.kt Maven / Gradle / Ivy

package ru.fix.gradle.release.plugin

import com.github.zafarkhaja.semver.Version
import java.io.FileInputStream
import java.io.FileOutputStream
import java.nio.file.Path
import java.util.*

class InvalidMajorMinorVersion(givenVersion: String): Exception("Please specify valid version in x.y format, current is $givenVersion")

class VersionManager(
        private val git: GitRepository,
        private val userInteractor: UserInteractor) {

    fun assertValidMajorMinorVersion(version: String){
        val pattern = "(\\d+)\\.(\\d+)"
        userInteractor.info("Checking that version '$version' matches pattern '$pattern'")
        if(!Regex(pattern).matches(version)){
            throw InvalidMajorMinorVersion(version)
        }
    }


    fun supposeBranchVersion(): String {
        val versions = getExistingVersionsInDescendingOrder()
        return if (versions.isEmpty()) {
            "1.0"
        } else {
            var version = Version.valueOf(versions.first())
            version = version.incrementMinorVersion()
            "${version.majorVersion}.${version.minorVersion}"
        }
    }

    fun supposeReleaseVersion(majorVersion: String): String {
        val versions = getExistingVersionsInDescendingOrder()
                .filter { it.startsWith("$majorVersion.") }

        if (versions.isEmpty()) {
            return "$majorVersion.0"
        }
        return Version.valueOf(versions.first()).incrementPatchVersion().toString()
    }

    fun supposeReleaseVersion(): String {
        val versions = getExistingVersionsInDescendingOrder()
        if (versions.isEmpty()) {
            return "1.0.0"
        }
        return Version.valueOf(versions.first()).incrementPatchVersion().toString()
    }

    fun branchVersionExists(majorVersion: String): Boolean =
            getExistingVersionsInDescendingOrder().find { it.startsWith("$majorVersion.") } != null


    fun updateVersionInFile(filename: Path, version: String) {
        userInteractor.info("Updating file $filename to version $version")
        val props = Properties()
        props.load(FileInputStream(filename.toFile()))
        if (props.getProperty("version") != null) {
            props.setProperty("version", version)
        } else {
            userInteractor.info("There is no 'version' property in '$filename', skipping")
        }

        props.store(FileOutputStream(filename.toFile()), "")
    }

    fun extractVersionFromBranch(name: String): String = Regex(".*((\\d+)\\.(\\d+))$")
            .matchEntire(name)!!.groups[1]!!.value


    private fun getExistingVersionsInDescendingOrder(): List {
        return git.listTags()
                .filter { Regex("(\\d+)\\.(\\d+).(\\d+)").matches(it) }
                .sortedByDescending { Version.valueOf(it) }
    }


}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy