-
-
Notifications
You must be signed in to change notification settings - Fork 5.8k
Only show the latest version in the Arch index #33262
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 3 commits
ddea32e
0fca43e
1dbf859
08b3967
3b55815
cae7f0b
8570827
0aae7c4
a8b043a
d9c9b6b
ccfda05
97ed2e7
220f23a
39efb64
8dba8a5
7f98d5f
fa496e5
9fa32ae
c869dc5
e7bbefb
5d25559
d98ceb1
ffab002
de4db89
219d872
fb0e0de
2667111
718fc19
fed5aac
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,111 @@ | ||
package arch | ||
|
||
import ( | ||
"strings" | ||
"unicode" | ||
) | ||
|
||
// https://gitlab.archlinux.org/pacman/pacman/-/blob/d55b47e5512808b67bc944feb20c2bcc6c1a4c45/lib/libalpm/version.c | ||
|
||
import ( | ||
"strconv" | ||
) | ||
|
||
func parseEVR(evr string) (epoch, version, release string) { | ||
if before, after, f := strings.Cut(evr, ":"); f { | ||
epoch = before | ||
evr = after | ||
} else { | ||
epoch = "0" | ||
} | ||
|
||
if before, after, f := strings.Cut(evr, "-"); f { | ||
version = before | ||
release = after | ||
} else { | ||
version = evr | ||
release = "1" | ||
} | ||
return epoch, version, release | ||
} | ||
|
||
func compareSegments(a, b []string) int { | ||
lenA, lenB := len(a), len(b) | ||
var l int | ||
if lenA > lenB { | ||
l = lenB | ||
} else { | ||
l = lenA | ||
} | ||
for i := 0; i < l; i++ { | ||
if r := compare(a[i], b[i]); r != 0 { | ||
return r | ||
} | ||
} | ||
if lenA == lenB { | ||
return 0 | ||
} else if l == lenA { | ||
return -1 | ||
} else { | ||
Check failure on line 49 in services/packages/arch/vercmp.go
|
||
return 1 | ||
} | ||
} | ||
|
||
func compare(a, b string) int { | ||
if a == b { | ||
return 0 | ||
} | ||
|
||
aNumeric := isNumeric(a) | ||
bNumeric := isNumeric(b) | ||
|
||
if aNumeric && bNumeric { | ||
aInt, _ := strconv.Atoi(a) | ||
bInt, _ := strconv.Atoi(b) | ||
switch { | ||
case aInt < bInt: | ||
return -1 | ||
case aInt > bInt: | ||
return 1 | ||
default: | ||
return 0 | ||
} | ||
} | ||
|
||
if aNumeric { | ||
return 1 | ||
} | ||
if bNumeric { | ||
return -1 | ||
} | ||
|
||
return strings.Compare(a, b) | ||
} | ||
|
||
func isNumeric(s string) bool { | ||
for _, c := range s { | ||
if !unicode.IsDigit(c) { | ||
return false | ||
} | ||
} | ||
return true | ||
} | ||
|
||
func compareVersions(a, b string) int { | ||
if a == b { | ||
return 0 | ||
} | ||
|
||
epochA, versionA, releaseA := parseEVR(a) | ||
epochB, versionB, releaseB := parseEVR(b) | ||
|
||
if res := compareSegments([]string{epochA}, []string{epochB}); res != 0 { | ||
return res | ||
} | ||
|
||
if res := compareSegments(strings.Split(versionA, "."), strings.Split(versionB, ".")); res != 0 { | ||
return res | ||
} | ||
|
||
return compareSegments([]string{releaseA}, []string{releaseB}) | ||
} | ||
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
package arch | ||
|
||
import ( | ||
"fmt" | ||
"testing" | ||
|
||
"github.com/stretchr/testify/require" | ||
) | ||
|
||
func TestCompareVersions(t *testing.T) { | ||
// https://man.archlinux.org/man/vercmp.8.en | ||
checks := [][]string{ | ||
{"1.0a", "1.0b", "1.0beta", "1.0p", "1.0pre", "1.0rc", "1.0", "1.0.a", "1.0.1"}, | ||
{"1", "1.0", "1.1", "1.1.1", "1.2", "2.0", "3.0.0"}, | ||
} | ||
for _, check := range checks { | ||
for i := 0; i < len(check)-1; i++ { | ||
require.Equal(t, -1, compareVersions(check[i], check[i+1]), fmt.Sprintf("%s > %s", check[i], check[i+1])) | ||
Check failure on line 18 in services/packages/arch/vercmp_test.go
|
||
require.Equal(t, 1, compareVersions(check[i+1], check[i]), fmt.Sprintf("%s > %s", check[i], check[i+1])) | ||
Check failure on line 19 in services/packages/arch/vercmp_test.go
|
||
} | ||
} | ||
require.Equal(t, 1, compareVersions("1.0-2", "1.0")) | ||
require.Equal(t, 0, compareVersions("0:1.0-1", "1.0")) | ||
require.Equal(t, 1, compareVersions("1:1.0-1", "2.0")) | ||
} |
Uh oh!
There was an error while loading. Please reload this page.