Skip to content

Commit 9b464c3

Browse files
authored
Merge pull request #8 from harryzcy/arm64-variant
Support arm64 minor variants
2 parents a413568 + 8cf0cb3 commit 9b464c3

File tree

4 files changed

+236
-3
lines changed

4 files changed

+236
-3
lines changed

compare.go

+62
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,66 @@ func platformVector(platform specs.Platform) []specs.Platform {
7272
if variant == "" {
7373
variant = "v8"
7474
}
75+
76+
majorVariant, minorVariant, hasMinor := strings.Cut(variant, ".")
77+
if armMajor, err := strconv.Atoi(strings.TrimPrefix(majorVariant, "v")); err == nil && armMajor >= 8 {
78+
armMinor := 0
79+
if len(variant) == 4 {
80+
if minor, err := strconv.Atoi(minorVariant); err == nil && hasMinor {
81+
armMinor = minor
82+
}
83+
}
84+
85+
if armMajor == 9 {
86+
for minor := armMinor - 1; minor >= 0; minor-- {
87+
arm64Variant := "v" + strconv.Itoa(armMajor) + "." + strconv.Itoa(minor)
88+
if minor == 0 {
89+
arm64Variant = "v" + strconv.Itoa(armMajor)
90+
}
91+
vector = append(vector, specs.Platform{
92+
Architecture: platform.Architecture,
93+
OS: platform.OS,
94+
OSVersion: platform.OSVersion,
95+
OSFeatures: platform.OSFeatures,
96+
Variant: arm64Variant,
97+
})
98+
}
99+
100+
// v9.0 diverged from v8.5, meaning that v9.x is compatible with v8.{x+5} until v9.4/v8.9
101+
armMinor = armMinor + 5
102+
if armMinor > 9 {
103+
armMinor = 9
104+
}
105+
armMajor = 8
106+
vector = append(vector, specs.Platform{
107+
Architecture: platform.Architecture,
108+
OS: platform.OS,
109+
OSVersion: platform.OSVersion,
110+
OSFeatures: platform.OSFeatures,
111+
Variant: "v8." + strconv.Itoa(armMinor),
112+
})
113+
}
114+
115+
for minor := armMinor - 1; minor >= 0; minor-- {
116+
arm64Variant := "v" + strconv.Itoa(armMajor) + "." + strconv.Itoa(minor)
117+
if minor == 0 {
118+
arm64Variant = "v" + strconv.Itoa(armMajor)
119+
}
120+
vector = append(vector, specs.Platform{
121+
Architecture: platform.Architecture,
122+
OS: platform.OS,
123+
OSVersion: platform.OSVersion,
124+
OSFeatures: platform.OSFeatures,
125+
Variant: arm64Variant,
126+
})
127+
}
128+
}
129+
130+
// All arm64/v8.x and arm64/v9.x are compatible with arm/v8 (32-bits) and below.
131+
// There's no arm64 v9 variant, so it's normalized to v8.
132+
if strings.HasPrefix(variant, "v8.") || strings.HasPrefix(variant, "v9.") {
133+
variant = "v8"
134+
}
75135
vector = append(vector, platformVector(specs.Platform{
76136
Architecture: "arm",
77137
OS: platform.OS,
@@ -87,6 +147,8 @@ func platformVector(platform specs.Platform) []specs.Platform {
87147
// Only returns a match comparer for a single platform
88148
// using default resolution logic for the platform.
89149
//
150+
// For arm64/v9.x, will also match arm64/v9.{0..x-1} and arm64/v8.{0..x+5}
151+
// For arm64/v8.x, will also match arm64/v8.{0..x-1}
90152
// For arm/v8, will also match arm/v7, arm/v6 and arm/v5
91153
// For arm/v7, will also match arm/v6 and arm/v5
92154
// For arm/v6, will also match arm/v5

compare_test.go

+158
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,95 @@ func TestOnly(t *testing.T) {
185185
},
186186
},
187187
},
188+
{
189+
platform: "linux/arm64/v9.6",
190+
matches: map[bool][]string{
191+
true: {
192+
"linux/arm",
193+
"linux/arm/v5",
194+
"linux/arm/v6",
195+
"linux/arm/v7",
196+
"linux/arm/v8",
197+
"linux/arm64",
198+
"linux/arm64/v8",
199+
"linux/arm64/v8.1",
200+
"linux/arm64/v8.2",
201+
"linux/arm64/v8.3",
202+
"linux/arm64/v8.4",
203+
"linux/arm64/v8.5",
204+
"linux/arm64/v8.6",
205+
"linux/arm64/v8.7",
206+
"linux/arm64/v8.8",
207+
"linux/arm64/v8.9",
208+
"linux/arm64/v9",
209+
"linux/arm64/v9.0",
210+
"linux/arm64/v9.1",
211+
"linux/arm64/v9.2",
212+
"linux/arm64/v9.3",
213+
"linux/arm64/v9.4",
214+
"linux/arm64/v9.5",
215+
"linux/arm64/v9.6",
216+
},
217+
false: {
218+
"linux/amd64",
219+
"linux/arm/v4",
220+
"windows/amd64",
221+
"windows/arm",
222+
"linux/arm64/v8.10", // there's no v8.10
223+
},
224+
},
225+
},
226+
{
227+
platform: "linux/arm64/v9",
228+
matches: map[bool][]string{
229+
true: {
230+
"linux/arm",
231+
"linux/arm/v5",
232+
"linux/arm/v6",
233+
"linux/arm/v7",
234+
"linux/arm/v8",
235+
"linux/arm64",
236+
"linux/arm64/v8",
237+
"linux/arm64/v8.1",
238+
"linux/arm64/v8.2",
239+
"linux/arm64/v8.3",
240+
"linux/arm64/v8.4",
241+
"linux/arm64/v8.5",
242+
"linux/arm64/v9",
243+
"linux/arm64/v9.0",
244+
},
245+
false: {
246+
"linux/amd64",
247+
"linux/arm/v4",
248+
"windows/amd64",
249+
"windows/arm",
250+
"linux/arm64/v8.6",
251+
},
252+
},
253+
},
254+
{
255+
platform: "linux/arm64/v8.1",
256+
matches: map[bool][]string{
257+
true: {
258+
"linux/arm",
259+
"linux/arm/v5",
260+
"linux/arm/v6",
261+
"linux/arm/v7",
262+
"linux/arm/v8",
263+
"linux/arm64",
264+
"linux/arm64/v8",
265+
"linux/arm64/v8.1",
266+
},
267+
false: {
268+
"linux/amd64",
269+
"linux/arm/v4",
270+
"linux/arm/v9",
271+
"linux/arm64/v9",
272+
"windows/amd64",
273+
"windows/arm",
274+
},
275+
},
276+
},
188277
{
189278
platform: "linux/arm64",
190279
matches: map[bool][]string{
@@ -390,6 +479,75 @@ func TestOnlyStrict(t *testing.T) {
390479
},
391480
},
392481
},
482+
{
483+
platform: "linux/arm64/v9.5",
484+
matches: map[bool][]string{
485+
true: {
486+
"linux/arm64/v9.5",
487+
},
488+
false: {
489+
"linux/arm",
490+
"linux/arm/v5",
491+
"linux/arm/v6",
492+
"linux/arm/v7",
493+
"linux/arm/v8",
494+
"linux/amd64",
495+
"linux/arm/v4",
496+
"linux/arm64/v8",
497+
"linux/arm64/v8.1",
498+
"linux/arm64/v9",
499+
"linux/arm64/v9.1",
500+
"linux/arm64/v9.4",
501+
"windows/amd64",
502+
"windows/arm",
503+
},
504+
},
505+
},
506+
{
507+
platform: "linux/arm64/v9",
508+
matches: map[bool][]string{
509+
true: {
510+
"linux/arm64/v9",
511+
"linux/arm64/v9.0",
512+
},
513+
false: {
514+
"linux/arm",
515+
"linux/arm/v5",
516+
"linux/arm/v6",
517+
"linux/arm/v7",
518+
"linux/arm/v8",
519+
"linux/amd64",
520+
"linux/arm/v4",
521+
"linux/arm/v9",
522+
"linux/arm64/v8",
523+
"linux/arm64/v8.1",
524+
"windows/amd64",
525+
"windows/arm",
526+
},
527+
},
528+
},
529+
{
530+
platform: "linux/arm64/v8.1",
531+
matches: map[bool][]string{
532+
true: {
533+
"linux/arm64/v8.1",
534+
},
535+
false: {
536+
"linux/arm",
537+
"linux/arm/v5",
538+
"linux/arm/v6",
539+
"linux/arm/v7",
540+
"linux/arm/v8",
541+
"linux/amd64",
542+
"linux/arm/v4",
543+
"linux/arm/v9",
544+
"linux/arm64/v8",
545+
"linux/arm64/v9",
546+
"windows/amd64",
547+
"windows/arm",
548+
},
549+
},
550+
},
393551
{
394552
platform: "linux/arm64",
395553
matches: map[bool][]string{

database.go

+15-2
Original file line numberDiff line numberDiff line change
@@ -86,9 +86,22 @@ func normalizeArch(arch, variant string) (string, string) {
8686
}
8787
case "aarch64", "arm64":
8888
arch = "arm64"
89-
switch variant {
90-
case "8", "v8":
89+
majorVariant, minorVariant, hasMinor := strings.Cut(variant, ".")
90+
majorVariant = strings.TrimPrefix(majorVariant, "v")
91+
if minorVariant == "0" {
92+
minorVariant = ""
93+
hasMinor = false
94+
}
95+
96+
if (majorVariant == "" || majorVariant == "8") && !hasMinor {
97+
// normalize v8 to empty string
9198
variant = ""
99+
} else {
100+
// otherwise to v8.x or v9 or v9.x
101+
variant = "v" + majorVariant
102+
if hasMinor {
103+
variant = variant + "." + minorVariant
104+
}
92105
}
93106
case "armhf":
94107
arch = "arm"

platforms.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ import (
121121
)
122122

123123
var (
124-
specifierRe = regexp.MustCompile(`^[A-Za-z0-9_-]+$`)
124+
specifierRe = regexp.MustCompile(`^[A-Za-z0-9_.-]+$`)
125125
osAndVersionRe = regexp.MustCompile(`^([A-Za-z0-9_-]+)(?:\(([A-Za-z0-9_.-]*)\))?$`)
126126
)
127127

0 commit comments

Comments
 (0)