@@ -87,14 +87,14 @@ class DesktopUpdateManager : UpdateManager {
8787 scope.launch {
8888 _status .value = UpdateStatus .Checking
8989 try {
90- val releases = fetchReleases(includePrerelease )
90+ val releases = fetchReleases()
9191
9292 if (releases.isEmpty()) {
9393 handleNoReleasesFound()
9494 return @launch
9595 }
9696
97- val bestReleaseInfo = findBestRelease(releases)
97+ val bestReleaseInfo = findBestRelease(releases, includePrerelease )
9898 if (bestReleaseInfo != null ) {
9999 processUpdateInfo(bestReleaseInfo, isManual, autoDownload, proxyUrl)
100100 } else {
@@ -107,12 +107,8 @@ class DesktopUpdateManager : UpdateManager {
107107 }
108108 }
109109
110- private suspend fun fetchReleases (includePrerelease : Boolean ): List <GitHubRelease > {
111- return if (includePrerelease) {
112- fetchReleasesWithPagination()
113- } else {
114- fetchLatestRelease()
115- }
110+ private suspend fun fetchReleases (): List <GitHubRelease > {
111+ return fetchReleasesWithPagination()
116112 }
117113
118114 private suspend fun fetchReleasesWithPagination (): List <GitHubRelease > {
@@ -167,17 +163,6 @@ class DesktopUpdateManager : UpdateManager {
167163 }
168164 }
169165
170- private suspend fun fetchLatestRelease (): List <GitHubRelease > {
171- val targetUrl = " https://api.github.com/repos/FNOSP/fntv-client-multiplatform/releases/latest"
172- logger.i(" Checking update from: $targetUrl " )
173- val response = client.get(targetUrl)
174- return if (response.status == HttpStatusCode .NotFound ) {
175- emptyList()
176- } else {
177- listOf (response.body<GitHubRelease >())
178- }
179- }
180-
181166 private fun handleNoReleasesFound () {
182167 logger.i(" No releases found" )
183168 _status .value = UpdateStatus .UpToDate
@@ -190,7 +175,7 @@ class DesktopUpdateManager : UpdateManager {
190175 _latestVersion .value = null
191176 }
192177
193- private fun findBestRelease (releases : List <GitHubRelease >): UpdateInfo ? {
178+ private fun findBestRelease (releases : List <GitHubRelease >, includePrerelease : Boolean ): UpdateInfo ? {
194179 val currentVersion = BuildConfig .VERSION_NAME
195180 val arch = getSystemArch()
196181 val osName = getSystemOS()
@@ -202,44 +187,66 @@ class DesktopUpdateManager : UpdateManager {
202187 asset.name.contains(arch, ignoreCase = true ) &&
203188 (targetExtension == null || asset.name.endsWith(targetExtension, ignoreCase = true ))
204189 }
205- }
206-
207- if (validReleases.isEmpty()) return null
208-
209- val sortedReleases = validReleases.sortedWith { r1, r2 ->
190+ }.sortedWith { r1, r2 ->
210191 val v1 = r1.name.removePrefix(" v" ).trim()
211192 val v2 = r2.name.removePrefix(" v" ).trim()
212193 compareVersions(v2, v1) // Descending
213194 }
214195
196+ if (validReleases.isEmpty()) return null
197+
215198 val skippedVersions = AppSettingsStore .skippedVersions
216- var bestRelease : GitHubRelease ? = null
217- var remoteVersion = " "
199+ var targetRelease : GitHubRelease ? = null
200+ var targetVersionString = " "
218201
219- for (release in sortedReleases ) {
202+ for (release in validReleases ) {
220203 val v = release.name.removePrefix(" v" ).trim()
204+
221205 if (skippedVersions.contains(v)) {
222206 logger.i(" Skipping version: $v " )
223207 continue
224208 }
225- if (compareVersions(v, currentVersion) > 0 ) {
226- bestRelease = release
227- remoteVersion = v
209+
210+ if (compareVersions(v, currentVersion) <= 0 ) {
228211 break
229212 }
213+
214+ if (! includePrerelease && release.prerelease) {
215+ continue
216+ }
217+
218+ targetRelease = release
219+ targetVersionString = v
220+ break
221+ }
222+
223+ if (targetRelease == null ) return null
224+
225+ val notesBuilder = StringBuilder ()
226+ var addedCount = 0
227+ for (release in validReleases) {
228+ val v = release.name.removePrefix(" v" ).trim()
229+ if (compareVersions(v, targetVersionString) <= 0 && compareVersions(v, currentVersion) > 0 ) {
230+ if (addedCount > 0 ) {
231+ notesBuilder.append(" \n\n " )
232+ }
233+ notesBuilder.append(" #### ${release.name} \n " )
234+ notesBuilder.append(release.body)
235+ addedCount++
236+ }
230237 }
231238
232- return bestRelease? .let { release ->
233- logger.i(" Current version: $currentVersion , Best remote version: $remoteVersion " )
239+ return targetRelease .let { release ->
240+ logger.i(" Current version: $currentVersion , Target version: $targetVersionString " )
234241 val asset = release.assets.find {
235242 it.name.contains(osName, ignoreCase = true ) &&
236243 it.name.contains(arch, ignoreCase = true ) &&
237244 (targetExtension == null || it.name.endsWith(targetExtension, ignoreCase = true ))
238245 }
239246 asset?.let {
240247 UpdateInfo (
241- version = remoteVersion ,
242- releaseNotes = release.body ,
248+ version = targetVersionString ,
249+ releaseNotes = notesBuilder.toString() ,
243250 downloadUrl = it.browserDownloadUrl,
244251 hash = it.digest?.removePrefix(" sha256:" ),
245252 fileName = it.name,
0 commit comments