fix: admin/home: list of available updates could be not in version order

Massimo Melina committed Oct 13, 2024 at 17:34 UTC 21cee9078d34a43844fa84590a8c044652b01f16
1 file changed +9 -11
src/update.ts
+9 -11
@@ -48,27 +48,25 @@ export type Release = { // not using interface, as it will not work with kvstora
48 name: string,
49 body: string,
50 assets: { name: string, browser_download_url: string }[],
51 - isNewer: boolean // introduced by us
51 + // fields introduced by us
52 + isNewer: boolean
53 + versionScalar: number
54 }
53 -const ReleaseKeys = ['prerelease', 'tag_name', 'name', 'body', 'assets', 'isNewer'] satisfies (keyof Release)[]
55 +const ReleaseKeys = ['prerelease', 'tag_name', 'name', 'body', 'assets', 'isNewer', 'versionScalar'] satisfies (keyof Release)[]
56 const ReleaseAssetKeys = ['name', 'browser_download_url'] satisfies (keyof Release['assets'][0])[]
57
58 export async function getUpdates(strict=false) {
59 getProjectInfo() // check for alerts
60 const stable: Release = await getRepoInfo(HFS_REPO + '/releases/latest')
59 - const verStable = ver(stable)
60 - const ret = await getBetas()
61 stable.isNewer = currentVersion.olderThan(stable.tag_name)
62 + stable.versionScalar = versionToScalar(stable.name)
63 + const ret = await getBetas()
64 if (stable.isNewer || RUNNING_BETA)
65 ret.push(stable)
66 // prune a bit, as it will be serialized, but it has a lot of unused data
65 - return ret.filter(x => !strict || x.isNewer).map(x =>
67 + return _.sortBy(ret, x => -x.versionScalar).filter(x => !strict || x.isNewer).map(x =>
68 Object.assign(_.pick(x, ReleaseKeys), { assets: x.assets.map(a => _.pick(a, ReleaseAssetKeys)) }))
69
68 - function ver(x: any) {
69 - return versionToScalar(x.name)
70 - }
71 -
70 async function getBetas() {
71 if (!updateToBeta.get() && !RUNNING_BETA) return []
72 let page = 1
@@ -80,8 +78,8 @@ export async function getUpdates(strict=false) {
78 const curV = currentVersion.getScalar()
79 for (const x of res) {
80 if (!x.prerelease || x.name.endsWith('-ignore')) continue
83 - const v = ver(x)
84 - if (v < verStable) // we don't consider betas before stable
81 + const v = x.versionScalar = versionToScalar(x.name)
82 + if (v < stable.versionScalar) // we don't consider betas before stable
83 return ret
84 if (v === curV) continue // skip current
85 x.isNewer = v > curV // make easy to know what's newer