Change from tag-based versioning to commit/file based

This commit is contained in:
Jonas Herzig
2018-03-03 11:27:51 +01:00
parent 9c76f0fcc0
commit 78ad02bc84
3 changed files with 60 additions and 43 deletions

View File

@@ -1,6 +1,21 @@
import groovy.json.JsonOutput
version = gitDescribe()
def latestVersion = file('version.txt').readLines().first()
def releaseCommit = command('git', 'blame', '-p', '-l', 'version.txt').first().tokenize(' ').first()
if (latestVersion == '2.1.0') { // First version since change from tag-based
releaseCommit = '35ac26e91689ac9bdf12dbb9902c452464a75108' // git rev-parse 1.12.2-2.1.0
}
def currentCommit = command('git', 'rev-parse', 'HEAD').first()
if (releaseCommit == currentCommit) {
version = latestVersion
} else {
def diff = command('git', 'log', '--format=oneline', "$releaseCommit..$currentCommit").size()
version = "$latestVersion-$diff-g${currentCommit.substring(0, 7)}"
}
if (gitDescribe().endsWith('*')) {
version = "$version*"
}
group= "com.replaymod"
subprojects {
@@ -69,15 +84,36 @@ task setCoreVersion() {
}
}
def generateVersionsJson() {
// List all tags
def command(Object...cmd) {
def stdout = new ByteArrayOutputStream()
project.exec {
commandLine 'git', 'for-each-ref', '--sort=taggerdate', '--format=%(refname:short)', 'refs/tags'
exec {
commandLine cmd
standardOutput = stdout
}
def versions = stdout.toString().tokenize('\n').reverse()
def mcVersions = versions.collect {it.substring(0, it.indexOf('-'))}.unique().reverse()
return stdout.toString().tokenize('\n')
}
def generateVersionsJson() {
// Find all tag-style releases by listing all tags
def tagVersions = command 'git', 'for-each-ref', '--sort=taggerdate', '--format=%(refname:short)', 'refs/tags'
// Find all commit-style releases
// List all commits
def releaseCommits =
command 'git', 'log', '--format=%H', '--date-order', '-E',
'--grep', /Pre-release [0-9]+ of [0-9]+\.[0-9]+\.[0-9]+/,
'--grep', /Release [0-9]+\.[0-9]+\.[0-9]+/
// Find version string and MC versions for each commit hash
def commitVersions = releaseCommits.collect { commit ->
def version = command('git', 'show', "$commit:version.txt").first()
def mcVersions = command 'git', 'ls-tree', '-d', '--name-only', "$commit:versions"
mcVersions.remove('core')
return mcVersions.collect { "$it-$version" }
}.flatten()
def versions = commitVersions + tagVersions.reverse()
def mcVersions = versions.collect {it.substring(0, it.indexOf('-'))}.unique()
mcVersions.sort(new OrderBy([0, 1, 2].collect { i -> { it -> (it.tokenize('.')[i] ?: '0') as int } }))
def root = [
homepage: 'https://www.replaymod.com/download/',
@@ -90,7 +126,9 @@ def generateVersionsJson() {
versions.forEach {
def (thisMcVersion, modVersion, preVersion) = it.tokenize('-')
if (thisMcVersion == mcVersion) {
mcVersionRoot[it] = "See https://github.com/ReplayMod/ReplayMod/releases/$it"
mcVersionRoot[it] = tagVersions.contains(it) ?
"See https://github.com/ReplayMod/ReplayMod/releases/$it" :
'See https://www.replaymod.com/forum/thread/100'
if (latest == null) latest = it
if (preVersion == null) {
if (recommended == null) recommended = it
@@ -110,34 +148,27 @@ task doRelease() {
doLast {
// Parse version
def version = project.releaseVersion as String
if (project.version.endsWith('*')) {
if (gitDescribe().endsWith('*')) {
throw new InvalidUserDataException('Git working tree is dirty. Make sure to commit all changes.')
}
def (mcVersion, modVersion, preVersion) = version.tokenize('-')
def (modVersion, preVersion) = version.tokenize('-')
preVersion = preVersion != null && preVersion.startsWith('b') ? preVersion.substring(1) : null
// Create new tag
if (preVersion != null) {
project.exec {
commandLine 'git', 'tag',
'-m', "Pre-release $preVersion of $modVersion for Minecraft $mcVersion",
"$mcVersion-$modVersion-b$preVersion"
}
} else {
project.exec {
commandLine 'git', 'tag',
'-m', "Release $modVersion for Minecraft $mcVersion",
"$mcVersion-$modVersion"
}
}
// Switch to master branch to update versions.json
project.exec { commandLine 'git', 'checkout', 'master' }
// Create new commit
def commitMessage = preVersion != null ?
"Pre-release $preVersion of $modVersion" :
"Release $modVersion"
file('version.txt').write("$version\n")
command 'git', 'add', 'version.txt'
command 'git', 'commit', '-m', commitMessage
// Generate versions.json content
def versionsRoot = generateVersionsJson()
def versionsJson = JsonOutput.prettyPrint(JsonOutput.toJson(versionsRoot))
// Switch to master branch to update versions.json
command 'git', 'checkout', 'master'
// Write versions.json
new File('versions.json').write(versionsJson)

1
version.txt Normal file
View File

@@ -0,0 +1 @@
2.1.0

View File

@@ -24,9 +24,7 @@ sourceCompatibility = 1.8
targetCompatibility = 1.8
afterEvaluate {
def gitVer = gitDescribe()
if (gitVer.startsWith('1.12.2-')) gitVer = gitVer.substring('1.12.2-'.length()) // until the first proper version
version = project.minecraft.version + '-' + gitVer
version = project.minecraft.version + '-' + rootProject.version
}
group= "com.replaymod"
archivesBaseName = "replaymod"
@@ -204,19 +202,6 @@ jar {
}
}
def gitDescribe() {
try {
def stdout = new ByteArrayOutputStream()
exec {
commandLine 'git', 'describe', '--always', '--dirty=*'
standardOutput = stdout
}
return stdout.toString().trim()
} catch (e) {
return "unknown"
}
}
processResources
{
// this will ensure that this task is redone when the versions change.