Use custom version codes for Tachidesk-Server versioning

This commit is contained in:
Syer10
2021-08-14 18:44:54 -04:00
parent 2ddf99a386
commit 0f7ce034f0
4 changed files with 49 additions and 7 deletions

View File

@@ -1,3 +1,4 @@
import Config.serverCode
import Config.tachideskVersion import Config.tachideskVersion
import org.gradle.jvm.tasks.Jar import org.gradle.jvm.tasks.Jar
import org.jetbrains.compose.compose import org.jetbrains.compose.compose
@@ -189,6 +190,7 @@ buildConfig {
buildConfigField("boolean", "DEBUG", project.hasProperty("debugApp").toString()) buildConfigField("boolean", "DEBUG", project.hasProperty("debugApp").toString())
buildConfigField("String", "TACHIDESK_SP_VERSION", tachideskVersion) buildConfigField("String", "TACHIDESK_SP_VERSION", tachideskVersion)
buildConfigField("int", "SERVER_CODE", serverCode.toString())
} }
kotlinter { kotlinter {

View File

@@ -2,6 +2,7 @@ import org.gradle.api.JavaVersion
object Config { object Config {
const val tachideskVersion = "v0.4.5" const val tachideskVersion = "v0.4.5"
const val serverCode = 1
const val preview = true const val preview = true
const val previewCommit = "8a986383fe0550d190090f14a9ac2fa0ddace448" const val previewCommit = "8a986383fe0550d190090f14a9ac2fa0ddace448"

View File

@@ -1,5 +1,6 @@
import Config.preview import Config.preview
import Config.previewCommit import Config.previewCommit
import Config.serverCode
import Config.tachideskVersion import Config.tachideskVersion
import de.undercouch.gradle.tasks.download.Download import de.undercouch.gradle.tasks.download.Download
import org.gradle.api.Project import org.gradle.api.Project
@@ -12,7 +13,11 @@ import org.gradle.kotlin.dsl.TaskContainerScope
import org.gradle.kotlin.dsl.register import org.gradle.kotlin.dsl.register
import org.gradle.nativeplatform.platform.internal.DefaultNativePlatform import org.gradle.nativeplatform.platform.internal.DefaultNativePlatform
import java.io.File import java.io.File
import java.nio.file.FileSystems
import java.nio.file.Files
import java.util.jar.Attributes
import java.util.jar.JarFile import java.util.jar.JarFile
import java.util.jar.Manifest
private const val tachideskGroup = "tachidesk" private const val tachideskGroup = "tachidesk"
private const val deleteOldTachideskTask = "deleteOldTachidesk" private const val deleteOldTachideskTask = "deleteOldTachidesk"
@@ -25,6 +30,7 @@ private const val copyTachideskJarTask = "copyTachidesk"
private const val extractTachideskJar = "extractJar" private const val extractTachideskJar = "extractJar"
private const val signTachideskJar = "signJar" private const val signTachideskJar = "signJar"
private const val zipTachideskJar = "zipJar" private const val zipTachideskJar = "zipJar"
private const val modifyTachideskJarManifest = "modifyManifest"
private const val deleteTmpFolderTask = "deleteTmp" private const val deleteTmpFolderTask = "deleteTmp"
private const val runAllTachideskTasks = "setupTachideskJar" private const val runAllTachideskTasks = "setupTachideskJar"
@@ -36,9 +42,10 @@ fun String?.anyEquals(vararg others: String?, ignoreCase: Boolean = false): Bool
return others.any { this.equals(it, ignoreCase) } return others.any { this.equals(it, ignoreCase) }
} }
private fun tachideskExists(rootDir: File) = File(rootDir, "src/main/resources/Tachidesk.jar").exists()
private fun Task.onlyIfTachideskDoesntExist(rootDir: File) { private fun Task.onlyIfTachideskDoesntExist(rootDir: File) {
onlyIf { !File(rootDir, "src/main/resources/Tachidesk.jar").exists() } onlyIf { !tachideskExists(rootDir) }
} }
private fun Task.onlyIfSigning(project: Project) { private fun Task.onlyIfSigning(project: Project) {
with(project){ with(project){
@@ -79,7 +86,7 @@ fun TaskContainerScope.registerTachideskTasks(project: Project) {
val tachideskJar = file(finalJar) val tachideskJar = file(finalJar)
onlyIf { onlyIf {
tachideskJar.exists() && JarFile(tachideskJar).use { jar -> tachideskJar.exists() && JarFile(tachideskJar).use { jar ->
jar.manifest?.mainAttributes?.getValue("Specification-Version") != tachideskVersion jar.manifest?.mainAttributes?.getValue(Attributes.Name.IMPLEMENTATION_VERSION)?.toIntOrNull() != serverCode
} }
} }
delete(tachideskJar) delete(tachideskJar)
@@ -88,6 +95,8 @@ fun TaskContainerScope.registerTachideskTasks(project: Project) {
register<Download>(downloadTask) { register<Download>(downloadTask) {
group = tachideskGroup group = tachideskGroup
mustRunAfter(deleteOldTachideskTask) mustRunAfter(deleteOldTachideskTask)
onlyIf { !tachideskExists(rootDir) && !file(tmpTar).exists() }
onlyIfTachideskDoesntExist(rootDir) onlyIfTachideskDoesntExist(rootDir)
src(tarUrl) src(tarUrl)
@@ -96,6 +105,8 @@ fun TaskContainerScope.registerTachideskTasks(project: Project) {
register<Copy>(extractTask) { register<Copy>(extractTask) {
group = tachideskGroup group = tachideskGroup
mustRunAfter(downloadTask) mustRunAfter(downloadTask)
onlyIf { !tachideskExists(rootDir) && !file(tmpServerFolder).exists() }
onlyIfTachideskDoesntExist(rootDir) onlyIfTachideskDoesntExist(rootDir)
from(tarTree(tmpTar)) from(tarTree(tmpTar))
@@ -104,7 +115,7 @@ fun TaskContainerScope.registerTachideskTasks(project: Project) {
register<Exec>(androidScriptTask) { register<Exec>(androidScriptTask) {
group = tachideskGroup group = tachideskGroup
mustRunAfter(extractTask) mustRunAfter(extractTask)
onlyIfTachideskDoesntExist(rootDir) onlyIf { !tachideskExists(rootDir) && !file("${tmpServerFolder}AndroidCompat/lib/android.jar").exists() }
val workingDir = file(tmpServerFolder) val workingDir = file(tmpServerFolder)
val getAndroidScript = File(workingDir, "AndroidCompat/getAndroid").absolutePath val getAndroidScript = File(workingDir, "AndroidCompat/getAndroid").absolutePath
@@ -199,8 +210,34 @@ fun TaskContainerScope.registerTachideskTasks(project: Project) {
archiveExtension.set("jar") archiveExtension.set("jar")
destinationDirectory.set(file(destination)) destinationDirectory.set(file(destination))
} }
register<Delete>(deleteTmpFolderTask) { register<Task>(modifyTachideskJarManifest) {
group = tachideskGroup
mustRunAfter(zipTachideskJar) mustRunAfter(zipTachideskJar)
val tachideskJar = file(finalJar)
onlyIf {
tachideskJar.exists() && JarFile(tachideskJar).use { jar ->
jar.manifest?.mainAttributes?.getValue(Attributes.Name.IMPLEMENTATION_VERSION)?.toIntOrNull() != serverCode
}
}
doFirst {
val manifest = JarFile(tachideskJar).use { jar ->
Manifest(jar.manifest)
}
manifest.mainAttributes[Attributes.Name.IMPLEMENTATION_VERSION] = serverCode.toString()
FileSystems.newFileSystem(tachideskJar.toPath()).use { fs ->
val manifestFile = fs.getPath("META-INF/MANIFEST.MF")
val manifestBak = fs.getPath("META-INF/MANIFEST.MF" + ".bak")
Files.deleteIfExists(manifestBak)
Files.move(manifestFile, manifestBak)
Files.newOutputStream(manifestFile).use {
manifest.write(it)
}
}
}
}
register<Delete>(deleteTmpFolderTask) {
mustRunAfter(modifyTachideskJarManifest)
delete(tmpPath) delete(tmpPath)
doFirst { doFirst {
@@ -221,6 +258,7 @@ fun TaskContainerScope.registerTachideskTasks(project: Project) {
extractTachideskJar, extractTachideskJar,
signTachideskJar, signTachideskJar,
zipTachideskJar, zipTachideskJar,
modifyTachideskJarManifest,
deleteTmpFolderTask deleteTmpFolderTask
) )
} }

View File

@@ -24,6 +24,7 @@ import mu.KotlinLogging
import java.io.File import java.io.File
import java.io.IOException import java.io.IOException
import java.io.Reader import java.io.Reader
import java.util.jar.Attributes
import java.util.jar.JarInputStream import java.util.jar.JarInputStream
import javax.inject.Inject import javax.inject.Inject
import kotlin.concurrent.thread import kotlin.concurrent.thread
@@ -116,7 +117,7 @@ class ServerService @Inject constructor(
} }
} }
GlobalScope.launch(handler) { GlobalScope.launch(handler) {
val jarFile = File(userDataDir, "Tachidesk.jar") val jarFile = File(userDataDir.also { it.mkdirs() }, "Tachidesk.jar")
if (!jarFile.exists()) { if (!jarFile.exists()) {
info { "Copying server to resources" } info { "Copying server to resources" }
withIOContext { copyJar(jarFile) } withIOContext { copyJar(jarFile) }
@@ -124,11 +125,11 @@ class ServerService @Inject constructor(
try { try {
val jarVersion = withIOContext { val jarVersion = withIOContext {
JarInputStream(jarFile.inputStream()).use { jar -> JarInputStream(jarFile.inputStream()).use { jar ->
jar.manifest?.mainAttributes?.getValue("Specification-Version") jar.manifest?.mainAttributes?.getValue(Attributes.Name.IMPLEMENTATION_VERSION)?.toIntOrNull()
} }
} }
if (jarVersion != BuildConfig.TACHIDESK_SP_VERSION) { if (jarVersion != BuildConfig.SERVER_CODE) {
info { "Updating server file from resources" } info { "Updating server file from resources" }
withIOContext { copyJar(jarFile) } withIOContext { copyJar(jarFile) }
} }