@@ -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
0 commit comments