From c69f4c0ff9557b6f2971b0d63cdb0668ec0fb276 Mon Sep 17 00:00:00 2001 From: NgoQuocViet2001 Date: Tue, 21 Jul 2026 09:13:18 +0700 Subject: [PATCH] fix: compare ZIM catalog versions numerically --- admin/app/utils/zim_download_resolution.ts | 20 ++++++++++++++++++- .../unit/zim_download_resolution.spec.ts | 19 ++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/admin/app/utils/zim_download_resolution.ts b/admin/app/utils/zim_download_resolution.ts index d78051f..9817453 100644 --- a/admin/app/utils/zim_download_resolution.ts +++ b/admin/app/utils/zim_download_resolution.ts @@ -7,13 +7,31 @@ export type ResolvedZimDownload = { sizeBytes: number | undefined } +function compareZimVersions(left: string, right: string): number { + const parse = (value: string): [number, number] | null => { + const match = /^(\d{4})-(\d{1,2})$/.exec(value) + if (!match) return null + + const month = Number.parseInt(match[2], 10) + if (month < 1 || month > 12) return null + + return [Number.parseInt(match[1], 10), month] + } + + const leftParts = parse(left) + const rightParts = parse(right) + if (!leftParts || !rightParts) return left.localeCompare(right) + + return leftParts[0] - rightParts[0] || leftParts[1] - rightParts[1] +} + export function resolveZimDownload( resource: SpecResource, latest: CatalogResult | null ): ResolvedZimDownload { const manifestSizeBytes = resource.size_mb > 0 ? resource.size_mb * 1024 * 1024 : undefined - if (!latest || latest.version < resource.version) { + if (!latest || compareZimVersions(latest.version, resource.version) < 0) { return { url: resource.url, version: resource.version, diff --git a/admin/tests/unit/zim_download_resolution.spec.ts b/admin/tests/unit/zim_download_resolution.spec.ts index cc076b7..11f55ce 100644 --- a/admin/tests/unit/zim_download_resolution.spec.ts +++ b/admin/tests/unit/zim_download_resolution.spec.ts @@ -54,3 +54,22 @@ test('older catalog result does not replace newer manifest metadata', () => { assert.equal(resolved.url, manifestResource.url) assert.equal(resolved.version, manifestResource.version) }) + +test('non-padded catalog months are compared numerically', () => { + const resource = { + ...manifestResource, + version: '2026-2', + url: 'https://download.kiwix.org/zim/wikipedia/wikipedia_en_all_mini_2026-2.zim', + } + const resolved = resolveZimDownload(resource, { + version: '2026-10', + download_url: 'https://download.kiwix.org/zim/wikipedia/wikipedia_en_all_mini_2026-10.zim', + size_bytes: 13_000, + }) + + assert.equal( + resolved.url, + 'https://download.kiwix.org/zim/wikipedia/wikipedia_en_all_mini_2026-10.zim' + ) + assert.equal(resolved.version, '2026-10') +})