@@ -31,6 +31,34 @@ type MatchComparer interface {
31
31
Less (specs.Platform , specs.Platform ) bool
32
32
}
33
33
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
+
34
62
// platformVector returns an (ordered) vector of appropriate specs.Platform
35
63
// objects to try matching for the given platform object (see platforms.Only).
36
64
func platformVector (platform specs.Platform ) []specs.Platform {
@@ -73,52 +101,19 @@ func platformVector(platform specs.Platform) []specs.Platform {
73
101
variant = "v8"
74
102
}
75
103
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 )
117
112
if minor == 0 {
118
- arm64Variant = "v" + strconv .Itoa (armMajor )
113
+ arm64Variant = "v" + strconv .Itoa (major )
119
114
}
120
115
vector = append (vector , specs.Platform {
121
- Architecture : platform . Architecture ,
116
+ Architecture : "arm64" ,
122
117
OS : platform .OS ,
123
118
OSVersion : platform .OSVersion ,
124
119
OSFeatures : platform .OSFeatures ,
@@ -129,7 +124,7 @@ func platformVector(platform specs.Platform) []specs.Platform {
129
124
130
125
// All arm64/v8.x and arm64/v9.x are compatible with arm/v8 (32-bits) and below.
131
126
// 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" ) {
133
128
variant = "v8"
134
129
}
135
130
vector = append (vector , platformVector (specs.Platform {
0 commit comments