From 6316b85a094b54308d6ed25b35c022d991def0e5 Mon Sep 17 00:00:00 2001 From: littlecodedragon <253116839+littlecodedragon@users.noreply.github.com> Date: Mon, 11 May 2026 07:04:04 +0200 Subject: [PATCH] fix(release): tolerate Forgejo null body/assets in release JSON Gitea may emit null for empty release notes or assets; enable Json.coerceInputValues and defaults so update checks do not fail deserialization (unrelated to release-note workflow length). Co-authored-by: Cursor --- app/src/main/java/eu/kanade/tachiyomi/di/AppModule.kt | 2 ++ .../main/java/tachiyomi/data/release/GithubRelease.kt | 10 ++++++---- .../java/tachiyomi/data/release/ReleaseServiceImpl.kt | 8 +++++--- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/di/AppModule.kt b/app/src/main/java/eu/kanade/tachiyomi/di/AppModule.kt index 63f98f5db..1c8a18aed 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/di/AppModule.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/di/AppModule.kt @@ -128,6 +128,8 @@ class AppModule(val app: Application) : InjektModule { Json { ignoreUnknownKeys = true explicitNulls = false + // Gitea/Forgejo often uses JSON null for empty release body or assets array. + coerceInputValues = true } } addSingletonFactory { diff --git a/data/src/main/java/tachiyomi/data/release/GithubRelease.kt b/data/src/main/java/tachiyomi/data/release/GithubRelease.kt index c5ee9f708..44aa026cf 100644 --- a/data/src/main/java/tachiyomi/data/release/GithubRelease.kt +++ b/data/src/main/java/tachiyomi/data/release/GithubRelease.kt @@ -5,17 +5,19 @@ import kotlinx.serialization.Serializable /** * Contains information about the latest release from GitHub. + * Forgejo/Gitea may send JSON `null` for empty [info] or [assets]; defaults + `Json.coerceInputValues` + * keep deserialization from failing. */ @Serializable data class GithubRelease( @SerialName("tag_name") val version: String, @SerialName("body") - val info: String, + val info: String = "", @SerialName("html_url") val releaseLink: String, @SerialName("assets") - val assets: List, + val assets: List = emptyList(), // KMK --> @SerialName("prerelease") val preRelease: Boolean = false, @@ -29,7 +31,7 @@ data class GithubRelease( */ @Serializable data class GitHubAsset( - val name: String, + val name: String = "", @SerialName("browser_download_url") - val downloadLink: String, + val downloadLink: String = "", ) diff --git a/data/src/main/java/tachiyomi/data/release/ReleaseServiceImpl.kt b/data/src/main/java/tachiyomi/data/release/ReleaseServiceImpl.kt index e170f007a..ce34356d0 100644 --- a/data/src/main/java/tachiyomi/data/release/ReleaseServiceImpl.kt +++ b/data/src/main/java/tachiyomi/data/release/ReleaseServiceImpl.kt @@ -74,9 +74,11 @@ class ReleaseServiceImpl( // KMK <-- private fun getDownloadLink(release: GithubRelease, isFoss: Boolean): String? { - val map = release.assets.associate { asset -> - BUILD_TYPES.find { "-$it" in asset.name } to asset.downloadLink - } + val map = release.assets + .filter { it.name.isNotBlank() && it.downloadLink.isNotBlank() } + .associate { asset -> + BUILD_TYPES.find { "-$it" in asset.name } to asset.downloadLink + } return if (!isFoss) { map[Build.SUPPORTED_ABIS[0]] ?: map[null]