mirror of
https://github.com/atsunatsu/Look4Sat.git
synced 2026-10-02 03:15:37 +00:00
fix: VersionComparator parses multi-level suffixes (4.4.6-ba7opf.9.1) by comparing all numeric segments, not just the last one
This commit is contained in:
1 parent
513d50e56a
commit
07c09ec3e9
2 files changed
+31
-17
No files matched your search
+17
-13
@@ -2,11 +2,12 @@ package com.rtbishop.look4sat.core.domain.utility
|
||||
|
||||
/**
|
||||
* Compares two version strings of the form "<major>.<minor>.<patch>[-<build>]" used by the
|
||||
* BA7OPF fork releases (e.g. "4.4.6-ba7opf.6" or "v4.4.6-ba7opf.7").
|
||||
* BA7OPF fork releases (e.g. "4.4.6-ba7opf.6" or "v4.4.6-ba7opf.9.1").
|
||||
*
|
||||
* The comparison is done on the numeric version segments first; when the base versions are
|
||||
* equal, the trailing build number (if any) decides. This lets a "4.4.6-ba7opf.7" release be
|
||||
* detected as newer than "4.4.6-ba7opf.6" while "4.5.0" trumps any "4.4.x" build.
|
||||
* equal, the trailing build numbers of the suffix decide. All numeric segments of the suffix
|
||||
* are compared as a sequence, so multi-level suffixes work correctly:
|
||||
* "4.4.6-ba7opf.9.1" > "4.4.6-ba7opf.9" > "4.4.6-ba7opf.8".
|
||||
*/
|
||||
object VersionComparator {
|
||||
|
||||
@@ -20,25 +21,28 @@ object VersionComparator {
|
||||
val k = curr.first.getOrElse(i) { 0 }
|
||||
if (c != k) return c > k
|
||||
}
|
||||
return cand.second > curr.second
|
||||
val maxBuild = maxOf(cand.second.size, curr.second.size)
|
||||
for (i in 0 until maxBuild) {
|
||||
val c = cand.second.getOrElse(i) { 0 }
|
||||
val k = curr.second.getOrElse(i) { 0 }
|
||||
if (c != k) return c > k
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses a version string into (numeric base segments, trailing build number).
|
||||
* "v4.4.6-ba7opf.7" -> ([4,4,6], 7); "4.4.6" -> ([4,4,6], 0); "4.4.6-ba7opf" -> ([4,4,6], 0).
|
||||
* Parses a version string into (numeric base segments, numeric suffix segments).
|
||||
* "v4.4.6-ba7opf.9.1" -> ([4,4,6], [9,1]); "4.4.6-ba7opf.8" -> ([4,4,6], [8]);
|
||||
* "4.4.6" -> ([4,4,6], []); "4.4.6-ba7opf" -> ([4,4,6], []).
|
||||
*/
|
||||
fun parse(version: String): Pair<List<Int>, Int> {
|
||||
fun parse(version: String): Pair<List<Int>, List<Int>> {
|
||||
val cleaned = version.trim().removePrefix("v")
|
||||
val dashIndex = cleaned.indexOf('-')
|
||||
val basePart = if (dashIndex >= 0) cleaned.substring(0, dashIndex) else cleaned
|
||||
val suffixPart = if (dashIndex >= 0) cleaned.substring(dashIndex + 1) else ""
|
||||
val base = basePart.split('.').mapNotNull { it.toIntOrNull() }
|
||||
// The build number is the trailing numeric segment of the suffix (e.g. "ba7opf.7" -> 7).
|
||||
val build = suffixPart
|
||||
.split('.')
|
||||
.lastOrNull()
|
||||
?.toIntOrNull()
|
||||
?: 0
|
||||
// All numeric segments of the suffix, in order (e.g. "ba7opf.9.1" -> [9, 1]).
|
||||
val build = suffixPart.split('.').mapNotNull { it.toIntOrNull() }
|
||||
return base to build
|
||||
}
|
||||
}
|
||||
+14
-4
@@ -40,9 +40,19 @@ class VersionComparatorTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `parse extracts base and build number`() {
|
||||
assertEquals(listOf(4, 4, 6) to 7, VersionComparator.parse("v4.4.6-ba7opf.7"))
|
||||
assertEquals(listOf(4, 4, 6) to 0, VersionComparator.parse("4.4.6"))
|
||||
assertEquals(listOf(4, 4, 6) to 0, VersionComparator.parse("4.4.6-ba7opf"))
|
||||
fun `multi level suffixes compare correctly`() {
|
||||
// The .9.1 hotfix case that exposed the old single-build-number logic.
|
||||
assertTrue(VersionComparator.isNewer("4.4.6-ba7opf.9.1", "4.4.6-ba7opf.9"))
|
||||
assertTrue(VersionComparator.isNewer("v4.4.6-ba7opf.9.1", "4.4.6-ba7opf.8"))
|
||||
assertFalse(VersionComparator.isNewer("4.4.6-ba7opf.9", "4.4.6-ba7opf.9.1"))
|
||||
assertTrue(VersionComparator.isNewer("4.4.6-ba7opf.10", "4.4.6-ba7opf.9.1"))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `parse extracts base and suffix segments`() {
|
||||
assertEquals(listOf(4, 4, 6) to listOf(7), VersionComparator.parse("v4.4.6-ba7opf.7"))
|
||||
assertEquals(listOf(4, 4, 6) to listOf(9, 1), VersionComparator.parse("v4.4.6-ba7opf.9.1"))
|
||||
assertEquals(listOf(4, 4, 6) to emptyList<Int>(), VersionComparator.parse("4.4.6"))
|
||||
assertEquals(listOf(4, 4, 6) to emptyList<Int>(), VersionComparator.parse("4.4.6-ba7opf"))
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user