Skip to content

Commit f679eaf

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

File tree

2 files changed

+63
-59
lines changed

2 files changed

+63
-59
lines changed

compare.go

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

34+
// arm64PlatformVector returns an (order) vector of platforms
35+
// for v[major].[minor] down to v[major].0.
36+
func arm64PlatformVector(platform specs.Platform, major, minor int) []specs.Platform {
37+
vector := make([]specs.Platform, 0)
38+
for ; minor >= 0; minor-- {
39+
arm64Variant := "v" + strconv.Itoa(major) + "." + strconv.Itoa(minor)
40+
if minor == 0 {
41+
arm64Variant = "v" + strconv.Itoa(major)
42+
}
43+
vector = append(vector, specs.Platform{
44+
Architecture: "arm64",
45+
OS: platform.OS,
46+
OSVersion: platform.OSVersion,
47+
OSFeatures: platform.OSFeatures,
48+
Variant: arm64Variant,
49+
})
50+
}
51+
return vector
52+
}
53+
54+
type platformVersions struct {
55+
major []int
56+
minor []int
57+
}
58+
59+
var arm64variantToVersion = map[string]platformVersions{
60+
"v8": platformVersions{[]int{8}, []int{0}},
61+
"v8.0": platformVersions{[]int{8}, []int{0}},
62+
"v8.1": platformVersions{[]int{8}, []int{1}},
63+
"v8.2": platformVersions{[]int{8}, []int{2}},
64+
"v8.3": platformVersions{[]int{8}, []int{3}},
65+
"v8.4": platformVersions{[]int{8}, []int{4}},
66+
"v8.5": platformVersions{[]int{8}, []int{5}},
67+
"v8.6": platformVersions{[]int{8}, []int{6}},
68+
"v8.7": platformVersions{[]int{8}, []int{7}},
69+
"v8.8": platformVersions{[]int{8}, []int{8}},
70+
"v8.9": platformVersions{[]int{8}, []int{9}},
71+
"v9": platformVersions{[]int{9, 8}, []int{0, 5}},
72+
"v9.0": platformVersions{[]int{9, 8}, []int{0, 5}},
73+
"v9.1": platformVersions{[]int{9, 8}, []int{1, 6}},
74+
"v9.2": platformVersions{[]int{9, 8}, []int{2, 7}},
75+
"v9.3": platformVersions{[]int{9, 8}, []int{3, 8}},
76+
"v9.4": platformVersions{[]int{9, 8}, []int{4, 9}},
77+
"v9.5": platformVersions{[]int{9, 8}, []int{5, 9}},
78+
"v9.6": platformVersions{[]int{9, 8}, []int{6, 9}},
79+
"v9.7": platformVersions{[]int{9, 8}, []int{7, 9}},
80+
}
81+
3482
// platformVector returns an (ordered) vector of appropriate specs.Platform
3583
// objects to try matching for the given platform object (see platforms.Only).
3684
func platformVector(platform specs.Platform) []specs.Platform {
@@ -73,52 +121,19 @@ func platformVector(platform specs.Platform) []specs.Platform {
73121
variant = "v8"
74122
}
75123

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)
124+
vector = []specs.Platform{} // Reset vector, the first variant will be added in loop.
125+
arm64Versions, ok := arm64variantToVersion[variant]
126+
if !ok {
127+
break
128+
}
129+
for i, major := range arm64Versions.major {
130+
for minor := arm64Versions.minor[i]; minor >= 0; minor-- {
131+
arm64Variant := "v" + strconv.Itoa(major) + "." + strconv.Itoa(minor)
117132
if minor == 0 {
118-
arm64Variant = "v" + strconv.Itoa(armMajor)
133+
arm64Variant = "v" + strconv.Itoa(major)
119134
}
120135
vector = append(vector, specs.Platform{
121-
Architecture: platform.Architecture,
136+
Architecture: "arm64",
122137
OS: platform.OS,
123138
OSVersion: platform.OSVersion,
124139
OSFeatures: platform.OSFeatures,
@@ -129,7 +144,7 @@ func platformVector(platform specs.Platform) []specs.Platform {
129144

130145
// All arm64/v8.x and arm64/v9.x are compatible with arm/v8 (32-bits) and below.
131146
// There's no arm64 v9 variant, so it's normalized to v8.
132-
if strings.HasPrefix(variant, "v8.") || strings.HasPrefix(variant, "v9.") {
147+
if strings.HasPrefix(variant, "v8") || strings.HasPrefix(variant, "v9") {
133148
variant = "v8"
134149
}
135150
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)