11package `in`.hridayan.ashell.settings.domain.usecase
22
3- import `in`.hridayan.ashell.settings.domain.model.UpdateResult
43import `in`.hridayan.ashell.core.domain.repository.GithubDataRepository
4+ import `in`.hridayan.ashell.settings.domain.model.UpdateResult
55import javax.inject.Inject
66
77class CheckUpdateUseCase @Inject constructor(
88 private val repository : GithubDataRepository
99) {
10- suspend operator fun invoke (currentVersion : String , includePrerelease : Boolean , releaseType : Int ): UpdateResult {
10+ suspend operator fun invoke (
11+ currentVersion : String ,
12+ includePrerelease : Boolean ,
13+ releaseType : Int
14+ ): UpdateResult {
1115 return when (val result = repository.fetchLatestRelease(includePrerelease, releaseType)) {
1216 is UpdateResult .Success -> {
1317 val isNewer = isNewerVersion(result.release.tagName, currentVersion)
@@ -20,17 +24,51 @@ class CheckUpdateUseCase @Inject constructor(
2024 }
2125 }
2226
27+ private data class ParsedVersion (
28+ val numbers : List <Int >,
29+ val stage : Int ,
30+ val stageNumber : Int
31+ )
32+
2333 private fun isNewerVersion (latest : String , current : String ): Boolean {
24- val latestParts = latest.trimStart(' v' ).split(" ." )
25- val currentParts = current.removeSuffix(" -debug" ).trimStart(' v' ).split(" ." )
26-
27- for (i in 0 until maxOf(latestParts.size, currentParts.size)) {
28- val l = latestParts.getOrNull(i)?.toIntOrNull() ? : 0
29- val c = currentParts.getOrNull(i)?.toIntOrNull() ? : 0
30- if (l > c) return true
31- if (l < c) return false
34+ val l = parseVersion(latest)
35+ val c = parseVersion(current)
36+
37+ for (i in 0 until maxOf(l.numbers.size, c.numbers.size)) {
38+ val lv = l.numbers.getOrElse(i) { 0 }
39+ val cv = c.numbers.getOrElse(i) { 0 }
40+
41+ if (lv > cv) return true
42+ if (lv < cv) return false
3243 }
33- return false
44+
45+ if (l.stage > c.stage) return true
46+ if (l.stage < c.stage) return false
47+
48+ return l.stageNumber > c.stageNumber
49+ }
50+
51+ private fun parseVersion (version : String ): ParsedVersion {
52+ val cleaned = version.trim().trimStart(' v' )
53+
54+ val regex = Regex (""" ^(\d+(?:\.\d+)*)(?:-(alpha|beta|debug)(\d+)?)?$""" )
55+ val match = regex.matchEntire(cleaned)
56+ ? : return ParsedVersion (emptyList(), 0 , 0 )
57+
58+ val numbers = match.groupValues[1 ]
59+ .split(" ." )
60+ .map { it.toInt() }
61+
62+ val stage = when (match.groupValues[2 ]) {
63+ " debug" -> 0
64+ " alpha" -> 1
65+ " beta" -> 2
66+ else -> 3 // stable
67+ }
68+
69+ val stageNumber = match.groupValues[3 ].toIntOrNull() ? : 0
70+
71+ return ParsedVersion (numbers, stage, stageNumber)
3472 }
3573}
3674
0 commit comments