@@ -31,6 +31,54 @@ type MatchComparer interface {
31
31
Less (specs.Platform , specs.Platform ) bool
32
32
}
33
33
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
+
34
82
// platformVector returns an (ordered) vector of appropriate specs.Platform
35
83
// objects to try matching for the given platform object (see platforms.Only).
36
84
func platformVector (platform specs.Platform ) []specs.Platform {
@@ -73,52 +121,19 @@ func platformVector(platform specs.Platform) []specs.Platform {
73
121
variant = "v8"
74
122
}
75
123
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 )
117
132
if minor == 0 {
118
- arm64Variant = "v" + strconv .Itoa (armMajor )
133
+ arm64Variant = "v" + strconv .Itoa (major )
119
134
}
120
135
vector = append (vector , specs.Platform {
121
- Architecture : platform . Architecture ,
136
+ Architecture : "arm64" ,
122
137
OS : platform .OS ,
123
138
OSVersion : platform .OSVersion ,
124
139
OSFeatures : platform .OSFeatures ,
@@ -129,7 +144,7 @@ func platformVector(platform specs.Platform) []specs.Platform {
129
144
130
145
// All arm64/v8.x and arm64/v9.x are compatible with arm/v8 (32-bits) and below.
131
146
// 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" ) {
133
148
variant = "v8"
134
149
}
135
150
vector = append (vector , platformVector (specs.Platform {
0 commit comments