Skip to content

Commit eeecb22

Browse files
committed
fix: improve semantic version sorting logic
The commit enhances version sorting to properly handle pre-release versions and follow SemVer rules. It ensures release versions take precedence over pre-releases and implements correct ordering for major.minor.patch versions. 🤖 Generated with [avante.nvim](https://github.com/yetone/avante.nvim) Co-Authored-By: avante.nvim <[email protected]> 🤖 Generated with [avante.nvim](https://github.com/yetone/avante.nvim) Co-Authored-By: avante.nvim <[email protected]> Signed-off-by: Hanchin Hsieh <[email protected]>
1 parent 9866119 commit eeecb22

File tree

3 files changed

+31
-2
lines changed

3 files changed

+31
-2
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ A lightweight Cloudflare Worker implementation that generates beautiful status b
1515

1616
## 🤔 Motivation
1717

18-
The original site for eggplants/ghcr-badge is no longer available, creating a need for a self-hosted solution. Cloudflare Workers provide an ideal serverless platform for this service, offering reliability and global distribution.
18+
The original site for eggplants/ghcr-badge is ~~no longer available~~ often stops working at the end of the month due to the free quota [#195 (comment)](https://github.com/eggplants/ghcr-badge/issues/195#issuecomment-2566003093), creating a need for a self-hosted solution. Cloudflare Workers provide an ideal serverless platform for this service, offering reliability and global distribution.
1919

2020
## 🛠️ Deployment
2121

src/apis/tags.ts

+29-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,35 @@ export const getTags = async (config: GHCRConfig) => {
2424
}
2525
const regex = new RegExp(trim_pattern)
2626
const ignore = config.ignore || ""
27-
const tags = (data.tags || []).
27+
const tags = (data.tags || []).sort((a, b) => {
28+
// Parse version strings into components
29+
const parseVersion = (v: string) => {
30+
// Remove leading 'v' if present
31+
v = v.replace(/^v/, "")
32+
const [version, prerelease] = v.split("-")
33+
const [major, minor, patch] = (version || "0.0.0").split(".").map(x => parseInt(x) || 0)
34+
return { major, minor, patch, prerelease }
35+
}
36+
37+
const va = parseVersion(a)
38+
const vb = parseVersion(b)
39+
40+
// Compare major.minor.patch
41+
if (va.major !== vb.major) return vb.major - va.major
42+
if (va.minor !== vb.minor) return vb.minor - va.minor
43+
if (va.patch !== vb.patch) return vb.patch - va.patch
44+
45+
// If one has prerelease and the other doesn't, the one without prerelease is greater
46+
if (!va.prerelease && vb.prerelease) return -1
47+
if (va.prerelease && !vb.prerelease) return 1
48+
49+
// If both have prereleases, do string comparison
50+
if (va.prerelease && vb.prerelease) {
51+
return vb.prerelease.localeCompare(va.prerelease)
52+
}
53+
54+
return b.localeCompare(a)
55+
}).
2856
filter((tag) => regex.test(tag)).
2957
filter((tag) => !fnmatch(tag, ignore))
3058
return tags

src/utils.ts

+1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ export const getBadge = (label: string, value: string, default_color = "#44cc11"
1212
const charWidths: Record<string, number> = {
1313
"i": 0.5, "l": 0.5, "j": 0.5, "I": 0.5, "f": 0.6, "r": 0.6, "t": 0.6,
1414
"m": 1.6, "w": 1.6, "M": 1.6, "W": 1.6, "G": 1.3, "O": 1.3, "Q": 1.3,
15+
".": 0.5, "|": 0.5, "=": 1.0, "-": 0.6, "_": 1.0,
1516
}
1617

1718
const width = text.split("").reduce((total, char) => {

0 commit comments

Comments
 (0)