-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbuild.gradle.kts
202 lines (179 loc) · 7.45 KB
/
build.gradle.kts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
import org.apache.tools.ant.taskdefs.condition.Os
val gitSubmodules: List<File> by lazy {
(rootDir.listFiles()?.toList() ?: emptyList()).filter {
it.isDirectory && File(it, ".git").isFile
}
}
fun File.isNewTemplate(): Boolean {
val file = File(this, "settings.gradle.kts").takeIf { it.exists() } ?: return false
return "com.soywiz.korge.settings:com.soywiz.korge.settings.gradle.plugin" in file.readText()
}
fun File.execGetStringResult(vararg commandline: String, cmd: Boolean = true): String {
return ProcessBuilder(*buildList {
if (cmd && Os.isFamily(Os.FAMILY_WINDOWS)) {
add("cmd.exe")
add("/c")
}
addAll(commandline)
}.toTypedArray()).directory(this).start().inputStream.readBytes().toString(Charsets.UTF_8)
}
fun File.exec(vararg commandline: String, fail: Boolean = true, cmd: Boolean = true) {
println("${commandline.joinToString(" ")}")
try {
exec {
workingDir(this@exec)
commandLine(*buildList {
if (cmd && Os.isFamily(Os.FAMILY_WINDOWS)) {
add("cmd.exe")
add("/c")
}
addAll(commandline)
}.toTypedArray())
}
} catch (e: Throwable) {
if (fail) throw e
}
}
fun incrementPatchVersion(version: String): String? {
val range = Regex("(\\d+)").findAll(version).toList().lastOrNull() ?: return null
return version.replaceRange(range.range, "${range.value.toInt() + 1}")
}
fun File.findLatestGitTag(): String {
val commitId = execGetStringResult("git", "rev-list", "--tags", "--max-count=1").trim()
val tag = execGetStringResult("git", "describe", "--tags", commitId).trim()
return tag
}
fun File.numberOfCommitsSinceTag(tag: String): Int {
return execGetStringResult("git", "rev-list", "$tag..HEAD", "--count").trim().toInt()
}
fun File.git(vararg args: String, fail: Boolean = true) = exec("git", *args, fail = fail)
tasks {
val updateRepos by creating {
doLast {
for (file in gitSubmodules) {
println("FILE: $file")
file.git("pull")
}
}
}
val updateTemplates by creating {
doLast {
val templateSettingsGradleKts = File(rootDir, "_template/settings.gradle.kts.template")
val template = templateSettingsGradleKts.readText()
for (file in gitSubmodules) {
print("FILE: $file...")
val settingsGradleKts = File(file, "settings.gradle.kts")
if (File(file, "gradle/libs.versions.toml").takeIf { it.isFile }?.readText()?.contains("korge = { id = \"com.soywiz.korge\", version = \"5.0.") != true) {
println("NOT RIGHT TEMPLATE")
continue
}
if (settingsGradleKts.readText() != template) {
settingsGradleKts.writeText(template)
file.git("add", "settings.gradle.kts")
file.git("commit", "-m", "Updated settings.gradle.kts", fail = false)
file.git("push")
println("UPDATED")
} else {
println("UP-TO-DATE")
}
}
}
}
val makeGradlewExecutable by creating {
doLast {
for (file in gitSubmodules) {
print("FILE: $file...")
if (File(file, "gradlew").isFile) {
file.git("update-index", "--chmod=+x", "gradlew")
file.git("commit", "-m", "Make gradlew executable", fail = false)
file.git("push")
println("DONE")
} else {
println("DO NOT EXISTS")
}
}
}
}
val updateKorgeVersion by creating {
doLast {
for (file in gitSubmodules) {
print("FILE: $file...")
val libsVersionsToml = File(file, "gradle/libs.versions.toml")
val yarnLockFile = File(file, "kotlin-js-store/yarn.lock")
if (!libsVersionsToml.isFile) {
println("Can't find $libsVersionsToml")
continue
}
if (!file.isNewTemplate()) {
println("Not using the new template")
continue
}
val newKorgeVersion = "5.0.5"
val libsVersionsTomlText = libsVersionsToml.readText()
val regeex = Regex("^korge = \\{ id = \"com.soywiz.korge\", version = \"(.*?)\" \\}", RegexOption.MULTILINE)
val regeex2 = Regex("^#korge = \\{ id = \"com.soywiz.korge\", version = \"(.*?)\" \\}", RegexOption.MULTILINE)
val updatedText = libsVersionsTomlText
.replace(regeex, "korge = { id = \"com.soywiz.korge\", version = \"$newKorgeVersion\" }")
.replace(regeex2, "#korge = { id = \"com.soywiz.korge\", version = \"999.0.0.999\" }")
if (libsVersionsTomlText != updatedText) {
libsVersionsToml.writeText(updatedText)
if (yarnLockFile.isFile) {
file.exec("gradlew", "kotlinUpgradeYarnLock")
}
file.git("add", "gradle/libs.versions.toml")
if (yarnLockFile.isFile) file.git("add", "kotlin-js-store/yarn.lock")
file.git("commit", "-m", "Upgrade KorGE to $newKorgeVersion", fail = false)
file.git("push")
println("UPDATED")
} else {
println("ALREADY UPDATED")
}
}
}
}
val upgradeYarnLockJs by creating {
doLast {
for (file in gitSubmodules) {
print("FILE: $file...")
if (File(file, "gradlew").isFile) {
try {
file.exec("gradlew", "kotlinUpgradeYarnLock")
println("DONE")
} catch (e: Throwable) {
e.printStackTrace()
println("ERROR")
}
} else {
println("DO NOT EXISTS")
}
}
}
}
val incrementPatchAll by creating {
doLast {
for (file in gitSubmodules) {
print("FILE: $file...")
file.execGetStringResult("git", "checkout", "main")
file.execGetStringResult("git", "fetch")
file.execGetStringResult("git", "reset", "--hard", "origin/main")
file.execGetStringResult("git", "pull")
val lastTag = file.findLatestGitTag()
val nextTag = incrementPatchVersion(lastTag)
val ncommits = file.numberOfCommitsSinceTag(lastTag)
if (nextTag == null) {
println("NO TAG")
continue
}
if (ncommits == 0) {
println("ALREADY IN LATEST ($lastTag) [$ncommits]")
continue
}
println("$lastTag -> $nextTag [$ncommits]")
file.exec("gh", "release", "create", nextTag, "--generate-notes")
//gh release create v1.2.3 --generate-notes
//file.exec("git", "tag", "-a", nextTag)
//file.exec("git", "push", "origin", "--tags")
}
}
}
}