buildSrc/src/main/kotlin/RepositoryChangeset.kt
author Da Risk <da_risk@geekorum.com>
Fri, 08 May 2020 21:33:19 -0400
changeset 1 831cffa9c991
child 10 9aad34f43f71
permissions -rw-r--r--
source import
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
     1
package com.geekorum.build
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
     2
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
     3
import org.gradle.api.Project
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
     4
import java.io.File
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
     5
import java.io.IOException
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
     6
import java.util.concurrent.TimeUnit
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
     7
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
     8
internal fun Project.getGitSha1(): String? = runCommand("git rev-parse HEAD", workingDir = projectDir)?.trim()
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
     9
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    10
internal fun Project.getHgSha1(): String? = runCommand("hg id --debug -i -r .", workingDir = projectDir)?.trim()
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    11
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    12
internal fun Project.getHgLocalRevisionNumber(): String? = runCommand("hg id -n -r .", workingDir = projectDir)?.trim()
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    13
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    14
fun Project.getChangeSet(): String {
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    15
    val git = rootProject.file(".git")
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    16
    val hg = rootProject.file(".hg")
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    17
    return when {
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    18
        git.exists() -> "git:${getGitSha1()}"
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    19
        hg.exists() -> "hg:${getHgSha1()}"
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    20
        else -> "unknown"
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    21
    }
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    22
}
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    23
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    24
/**
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    25
 * Compute a version code following this format : MmmPBBB
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    26
 * M is major, mm is minor, P is patch
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    27
 * BBB is build version number from hg
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    28
 */
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    29
fun Project.computeChangesetVersionCode(major: Int = 0, minor: Int = 0, patch: Int = 0): Int {
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    30
    val base = (major * 1000000) + (minor * 10000) + (patch * 1000)
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    31
    return base + (getHgLocalRevisionNumber()?.trim()?.toIntOrNull() ?: 0)
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    32
}
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    33
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    34
private fun Project.runCommand(
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    35
    command: String,
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    36
    workingDir: File = File("."),
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    37
    timeoutAmount: Long = 60,
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    38
    timeoutUnit: TimeUnit = TimeUnit.MINUTES
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    39
): String? {
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    40
    return try {
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    41
        ProcessBuilder(*command.split("\\s".toRegex()).toTypedArray())
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    42
            .directory(workingDir)
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    43
            .redirectOutput(ProcessBuilder.Redirect.PIPE)
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    44
            .redirectError(ProcessBuilder.Redirect.PIPE)
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    45
            .start().apply {
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    46
                waitFor(timeoutAmount, timeoutUnit)
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    47
            }.inputStream.bufferedReader().readText()
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    48
    } catch (e: IOException) {
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    49
        logger.info("Unable to run command", e)
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    50
        null
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    51
    }
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    52
}