Skip to content

Commit f9f6c22

Browse files
committed
Replace arm64 minor variant logic with lookup table
Signed-off-by: Chongyi Zheng <[email protected]>
1 parent 9b464c3 commit f9f6c22

File tree

2 files changed

+43
-59
lines changed

2 files changed

+43
-59
lines changed

compare.go

+39-44
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,34 @@ type MatchComparer interface {
3131
Less(specs.Platform, specs.Platform) bool
3232
}
3333

34+
type platformVersions struct {
35+
major []int
36+
minor []int
37+
}
38+
39+
var arm64variantToVersion = map[string]platformVersions{
40+
"v8": platformVersions{[]int{8}, []int{0}},
41+
"v8.0": platformVersions{[]int{8}, []int{0}},
42+
"v8.1": platformVersions{[]int{8}, []int{1}},
43+
"v8.2": platformVersions{[]int{8}, []int{2}},
44+
"v8.3": platformVersions{[]int{8}, []int{3}},
45+
"v8.4": platformVersions{[]int{8}, []int{4}},
46+
"v8.5": platformVersions{[]int{8}, []int{5}},
47+
"v8.6": platformVersions{[]int{8}, []int{6}},
48+
"v8.7": platformVersions{[]int{8}, []int{7}},
49+
"v8.8": platformVersions{[]int{8}, []int{8}},
50+
"v8.9": platformVersions{[]int{8}, []int{9}},
51+
"v9": platformVersions{[]int{9, 8}, []int{0, 5}},
52+
"v9.0": platformVersions{[]int{9, 8}, []int{0, 5}},
53+
"v9.1": platformVersions{[]int{9, 8}, []int{1, 6}},
54+
"v9.2": platformVersions{[]int{9, 8}, []int{2, 7}},
55+
"v9.3": platformVersions{[]int{9, 8}, []int{3, 8}},
56+
"v9.4": platformVersions{[]int{9, 8}, []int{4, 9}},
57+
"v9.5": platformVersions{[]int{9, 8}, []int{5, 9}},
58+
"v9.6": platformVersions{[]int{9, 8}, []int{6, 9}},
59+
"v9.7": platformVersions{[]int{9, 8}, []int{7, 9}},
60+
}
61+
3462
// platformVector returns an (ordered) vector of appropriate specs.Platform
3563
// objects to try matching for the given platform object (see platforms.Only).
3664
func platformVector(platform specs.Platform) []specs.Platform {
@@ -73,52 +101,19 @@ func platformVector(platform specs.Platform) []specs.Platform {
73101
variant = "v8"
74102
}
75103

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)
104+
vector = []specs.Platform{} // Reset vector, the first variant will be added in loop.
105+
arm64Versions, ok := arm64variantToVersion[variant]
106+
if !ok {
107+
break
108+
}
109+
for i, major := range arm64Versions.major {
110+
for minor := arm64Versions.minor[i]; minor >= 0; minor-- {
111+
arm64Variant := "v" + strconv.Itoa(major) + "." + strconv.Itoa(minor)
117112
if minor == 0 {
118-
arm64Variant = "v" + strconv.Itoa(armMajor)
113+
arm64Variant = "v" + strconv.Itoa(major)
119114
}
120115
vector = append(vector, specs.Platform{
121-
Architecture: platform.Architecture,
116+
Architecture: "arm64",
122117
OS: platform.OS,
123118
OSVersion: platform.OSVersion,
124119
OSFeatures: platform.OSFeatures,
@@ -129,7 +124,7 @@ func platformVector(platform specs.Platform) []specs.Platform {
129124

130125
// All arm64/v8.x and arm64/v9.x are compatible with arm/v8 (32-bits) and below.
131126
// There's no arm64 v9 variant, so it's normalized to v8.
132-
if strings.HasPrefix(variant, "v8.") || strings.HasPrefix(variant, "v9.") {
127+
if strings.HasPrefix(variant, "v8") || strings.HasPrefix(variant, "v9") {
133128
variant = "v8"
134129
}
135130
vector = append(vector, platformVector(specs.Platform{

database.go

+4-15
Original file line numberDiff line numberDiff line change
@@ -86,22 +86,11 @@ func normalizeArch(arch, variant string) (string, string) {
8686
}
8787
case "aarch64", "arm64":
8888
arch = "arm64"
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
89+
switch variant {
90+
case "8", "v8", "v8.0":
9891
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-
}
92+
case "9", "9.0", "v9.0":
93+
variant = "v9"
10594
}
10695
case "armhf":
10796
arch = "arm"

0 commit comments

Comments
 (0)