buildSrc/src/main/kotlin/RepositoryChangeset.kt
author Da Risk <da_risk@geekorum.com>
Sun, 17 May 2020 20:20:41 -0400
changeset 11 70d9c0462f0d
parent 10 9aad34f43f71
child 19 91a3ad3b1b9c
permissions -rw-r--r--
Change root project name to avoid clash with geekdroid submodule
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
10
9aad34f43f71 More license headers
Da Risk <da_risk@geekorum.com>
parents: 1
diff changeset
     1
/*
9aad34f43f71 More license headers
Da Risk <da_risk@geekorum.com>
parents: 1
diff changeset
     2
 * Geekdroid is a utility library for development on the Android
9aad34f43f71 More license headers
Da Risk <da_risk@geekorum.com>
parents: 1
diff changeset
     3
 * Platform.
9aad34f43f71 More license headers
Da Risk <da_risk@geekorum.com>
parents: 1
diff changeset
     4
 *
9aad34f43f71 More license headers
Da Risk <da_risk@geekorum.com>
parents: 1
diff changeset
     5
 * Copyright (C) 2017-2020 by Frederic-Charles Barthelery.
9aad34f43f71 More license headers
Da Risk <da_risk@geekorum.com>
parents: 1
diff changeset
     6
 *
9aad34f43f71 More license headers
Da Risk <da_risk@geekorum.com>
parents: 1
diff changeset
     7
 * This file is part of Geekdroid.
9aad34f43f71 More license headers
Da Risk <da_risk@geekorum.com>
parents: 1
diff changeset
     8
 *
9aad34f43f71 More license headers
Da Risk <da_risk@geekorum.com>
parents: 1
diff changeset
     9
 * Geekdroid is free software: you can redistribute it and/or modify
9aad34f43f71 More license headers
Da Risk <da_risk@geekorum.com>
parents: 1
diff changeset
    10
 * it under the terms of the GNU General Public License as published by
9aad34f43f71 More license headers
Da Risk <da_risk@geekorum.com>
parents: 1
diff changeset
    11
 * the Free Software Foundation, either version 3 of the License, or
9aad34f43f71 More license headers
Da Risk <da_risk@geekorum.com>
parents: 1
diff changeset
    12
 * (at your option) any later version.
9aad34f43f71 More license headers
Da Risk <da_risk@geekorum.com>
parents: 1
diff changeset
    13
 *
9aad34f43f71 More license headers
Da Risk <da_risk@geekorum.com>
parents: 1
diff changeset
    14
 * Geekdroid is distributed in the hope that it will be useful,
9aad34f43f71 More license headers
Da Risk <da_risk@geekorum.com>
parents: 1
diff changeset
    15
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9aad34f43f71 More license headers
Da Risk <da_risk@geekorum.com>
parents: 1
diff changeset
    16
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
9aad34f43f71 More license headers
Da Risk <da_risk@geekorum.com>
parents: 1
diff changeset
    17
 * GNU General Public License for more details.
9aad34f43f71 More license headers
Da Risk <da_risk@geekorum.com>
parents: 1
diff changeset
    18
 *
9aad34f43f71 More license headers
Da Risk <da_risk@geekorum.com>
parents: 1
diff changeset
    19
 * You should have received a copy of the GNU General Public License
9aad34f43f71 More license headers
Da Risk <da_risk@geekorum.com>
parents: 1
diff changeset
    20
 * along with Geekdroid.  If not, see <http://www.gnu.org/licenses/>.
9aad34f43f71 More license headers
Da Risk <da_risk@geekorum.com>
parents: 1
diff changeset
    21
 */
1
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    22
package com.geekorum.build
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
import org.gradle.api.Project
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    25
import java.io.File
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    26
import java.io.IOException
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    27
import java.util.concurrent.TimeUnit
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
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
    30
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    31
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
    32
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    33
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
    34
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    35
fun Project.getChangeSet(): String {
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    36
    val git = rootProject.file(".git")
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    37
    val hg = rootProject.file(".hg")
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    38
    return when {
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    39
        git.exists() -> "git:${getGitSha1()}"
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    40
        hg.exists() -> "hg:${getHgSha1()}"
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    41
        else -> "unknown"
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    42
    }
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    43
}
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    44
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    45
/**
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    46
 * Compute a version code following this format : MmmPBBB
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    47
 * M is major, mm is minor, P is patch
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    48
 * BBB is build version number from hg
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    49
 */
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    50
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
    51
    val base = (major * 1000000) + (minor * 10000) + (patch * 1000)
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    52
    return base + (getHgLocalRevisionNumber()?.trim()?.toIntOrNull() ?: 0)
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    53
}
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    54
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    55
private fun Project.runCommand(
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    56
    command: String,
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    57
    workingDir: File = File("."),
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    58
    timeoutAmount: Long = 60,
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    59
    timeoutUnit: TimeUnit = TimeUnit.MINUTES
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    60
): String? {
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    61
    return try {
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    62
        ProcessBuilder(*command.split("\\s".toRegex()).toTypedArray())
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    63
            .directory(workingDir)
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    64
            .redirectOutput(ProcessBuilder.Redirect.PIPE)
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    65
            .redirectError(ProcessBuilder.Redirect.PIPE)
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    66
            .start().apply {
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    67
                waitFor(timeoutAmount, timeoutUnit)
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    68
            }.inputStream.bufferedReader().readText()
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    69
    } catch (e: IOException) {
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    70
        logger.info("Unable to run command", e)
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    71
        null
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    72
    }
831cffa9c991 source import
Da Risk <da_risk@geekorum.com>
parents:
diff changeset
    73
}