From 0f7ce034f04ed42752bb14c096b1c1ced6399386 Mon Sep 17 00:00:00 2001 From: Syer10 Date: Sat, 14 Aug 2021 18:44:54 -0400 Subject: [PATCH] Use custom version codes for Tachidesk-Server versioning --- build.gradle.kts | 2 + buildSrc/src/main/kotlin/Config.kt | 1 + buildSrc/src/main/kotlin/TachideskTasks.kt | 46 +++++++++++++++++-- .../ca/gosyer/data/server/ServerService.kt | 7 +-- 4 files changed, 49 insertions(+), 7 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 4cffef54..233f40f6 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,3 +1,4 @@ +import Config.serverCode import Config.tachideskVersion import org.gradle.jvm.tasks.Jar import org.jetbrains.compose.compose @@ -189,6 +190,7 @@ buildConfig { buildConfigField("boolean", "DEBUG", project.hasProperty("debugApp").toString()) buildConfigField("String", "TACHIDESK_SP_VERSION", tachideskVersion) + buildConfigField("int", "SERVER_CODE", serverCode.toString()) } kotlinter { diff --git a/buildSrc/src/main/kotlin/Config.kt b/buildSrc/src/main/kotlin/Config.kt index c9400009..d225a696 100644 --- a/buildSrc/src/main/kotlin/Config.kt +++ b/buildSrc/src/main/kotlin/Config.kt @@ -2,6 +2,7 @@ import org.gradle.api.JavaVersion object Config { const val tachideskVersion = "v0.4.5" + const val serverCode = 1 const val preview = true const val previewCommit = "8a986383fe0550d190090f14a9ac2fa0ddace448" diff --git a/buildSrc/src/main/kotlin/TachideskTasks.kt b/buildSrc/src/main/kotlin/TachideskTasks.kt index f77d9a4f..2f017d13 100644 --- a/buildSrc/src/main/kotlin/TachideskTasks.kt +++ b/buildSrc/src/main/kotlin/TachideskTasks.kt @@ -1,5 +1,6 @@ import Config.preview import Config.previewCommit +import Config.serverCode import Config.tachideskVersion import de.undercouch.gradle.tasks.download.Download import org.gradle.api.Project @@ -12,7 +13,11 @@ import org.gradle.kotlin.dsl.TaskContainerScope import org.gradle.kotlin.dsl.register import org.gradle.nativeplatform.platform.internal.DefaultNativePlatform 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.Manifest private const val tachideskGroup = "tachidesk" private const val deleteOldTachideskTask = "deleteOldTachidesk" @@ -25,6 +30,7 @@ private const val copyTachideskJarTask = "copyTachidesk" private const val extractTachideskJar = "extractJar" private const val signTachideskJar = "signJar" private const val zipTachideskJar = "zipJar" +private const val modifyTachideskJarManifest = "modifyManifest" private const val deleteTmpFolderTask = "deleteTmp" 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) } } +private fun tachideskExists(rootDir: File) = File(rootDir, "src/main/resources/Tachidesk.jar").exists() private fun Task.onlyIfTachideskDoesntExist(rootDir: File) { - onlyIf { !File(rootDir, "src/main/resources/Tachidesk.jar").exists() } + onlyIf { !tachideskExists(rootDir) } } private fun Task.onlyIfSigning(project: Project) { with(project){ @@ -79,7 +86,7 @@ fun TaskContainerScope.registerTachideskTasks(project: Project) { val tachideskJar = file(finalJar) onlyIf { 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) @@ -88,6 +95,8 @@ fun TaskContainerScope.registerTachideskTasks(project: Project) { register(downloadTask) { group = tachideskGroup mustRunAfter(deleteOldTachideskTask) + onlyIf { !tachideskExists(rootDir) && !file(tmpTar).exists() } + onlyIfTachideskDoesntExist(rootDir) src(tarUrl) @@ -96,6 +105,8 @@ fun TaskContainerScope.registerTachideskTasks(project: Project) { register(extractTask) { group = tachideskGroup mustRunAfter(downloadTask) + onlyIf { !tachideskExists(rootDir) && !file(tmpServerFolder).exists() } + onlyIfTachideskDoesntExist(rootDir) from(tarTree(tmpTar)) @@ -104,7 +115,7 @@ fun TaskContainerScope.registerTachideskTasks(project: Project) { register(androidScriptTask) { group = tachideskGroup mustRunAfter(extractTask) - onlyIfTachideskDoesntExist(rootDir) + onlyIf { !tachideskExists(rootDir) && !file("${tmpServerFolder}AndroidCompat/lib/android.jar").exists() } val workingDir = file(tmpServerFolder) val getAndroidScript = File(workingDir, "AndroidCompat/getAndroid").absolutePath @@ -199,8 +210,34 @@ fun TaskContainerScope.registerTachideskTasks(project: Project) { archiveExtension.set("jar") destinationDirectory.set(file(destination)) } - register(deleteTmpFolderTask) { + register(modifyTachideskJarManifest) { + group = tachideskGroup 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(deleteTmpFolderTask) { + mustRunAfter(modifyTachideskJarManifest) delete(tmpPath) doFirst { @@ -221,6 +258,7 @@ fun TaskContainerScope.registerTachideskTasks(project: Project) { extractTachideskJar, signTachideskJar, zipTachideskJar, + modifyTachideskJarManifest, deleteTmpFolderTask ) } diff --git a/src/main/kotlin/ca/gosyer/data/server/ServerService.kt b/src/main/kotlin/ca/gosyer/data/server/ServerService.kt index 876879b5..50b936eb 100644 --- a/src/main/kotlin/ca/gosyer/data/server/ServerService.kt +++ b/src/main/kotlin/ca/gosyer/data/server/ServerService.kt @@ -24,6 +24,7 @@ import mu.KotlinLogging import java.io.File import java.io.IOException import java.io.Reader +import java.util.jar.Attributes import java.util.jar.JarInputStream import javax.inject.Inject import kotlin.concurrent.thread @@ -116,7 +117,7 @@ class ServerService @Inject constructor( } } GlobalScope.launch(handler) { - val jarFile = File(userDataDir, "Tachidesk.jar") + val jarFile = File(userDataDir.also { it.mkdirs() }, "Tachidesk.jar") if (!jarFile.exists()) { info { "Copying server to resources" } withIOContext { copyJar(jarFile) } @@ -124,11 +125,11 @@ class ServerService @Inject constructor( try { val jarVersion = withIOContext { 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" } withIOContext { copyJar(jarFile) } }