@@ -35,13 +35,24 @@ public class Reference {
35
35
private final String name ;
36
36
private final String tag ;
37
37
private final String digest ;
38
+ private final String platform ;
38
39
39
40
@ VisibleForTesting
40
41
Reference (String domain , String name , String tag , String digest ) {
41
42
this .domain = Require .nonNull ("Domain" , domain );
42
43
this .name = Require .nonNull ("Name" , name );
43
44
this .tag = tag ;
44
45
this .digest = digest ;
46
+ this .platform = getDefaultPlatform ();
47
+ }
48
+
49
+ @ VisibleForTesting
50
+ Reference (String domain , String name , String tag , String digest , String platform ) {
51
+ this .domain = Require .nonNull ("Domain" , domain );
52
+ this .name = Require .nonNull ("Name" , name );
53
+ this .tag = tag ;
54
+ this .digest = digest ;
55
+ this .platform = Require .nonNull ("Platform" , platform );
45
56
}
46
57
47
58
// Logic taken from https://github.com/distribution/distribution/blob/main/reference/normalize.go
@@ -53,15 +64,15 @@ public static Reference parse(String input) {
53
64
String remainder = splitDockerDomain .get ("remainder" );
54
65
55
66
String name ;
56
- String digest = null ;
67
+ String digest =
68
+ splitDockerDomain .get ("digest" ).isEmpty () ? null : splitDockerDomain .get ("digest" );
69
+ String platform = splitDockerDomain .get ("platform" );
57
70
String tag = DEFAULT_TAG ;
58
71
59
- int digestSep = remainder .indexOf ("@" );
60
72
int tagSep = remainder .indexOf (":" );
61
- if (digestSep > -1 && tagSep > -1 ) {
62
- digest = remainder .substring (digestSep + 1 );
63
- name = remainder .substring (0 , digestSep );
73
+ if (digest != null ) {
64
74
tag = null ;
75
+ name = remainder ;
65
76
} else if (tagSep > -1 ) {
66
77
tag = remainder .substring (tagSep + 1 );
67
78
name = remainder .substring (0 , tagSep );
@@ -74,12 +85,27 @@ public static Reference parse(String input) {
74
85
String .format ("Invalid reference format: repository name (%s) must be lowercase" , name ));
75
86
}
76
87
77
- return new Reference (domain , name , tag , digest );
88
+ return new Reference (domain , name , tag , digest , platform );
78
89
}
79
90
80
91
private static ImmutableMap <String , String > splitDockerDomain (String name ) {
81
92
String domain ;
82
93
String remainder ;
94
+ String platform = getDefaultPlatform ();
95
+ String digest = "" ;
96
+
97
+ // Check if the name contains a platform part
98
+ int platformSep = name .lastIndexOf ("@" );
99
+ if (platformSep > -1 ) {
100
+ String [] parts = name .substring (platformSep + 1 ).split ("/" );
101
+ if (parts .length == 2 ) {
102
+ platform = name .substring (platformSep + 1 );
103
+ } else if (parts [0 ].contains (":" )) {
104
+ digest = name .substring (platformSep + 1 );
105
+ }
106
+ name = name .substring (0 , platformSep );
107
+ }
108
+
83
109
int domSep = name .indexOf ("/" );
84
110
String possibleDomain = domSep == -1 ? "" : name .substring (0 , domSep );
85
111
if (domSep == -1
@@ -99,7 +125,8 @@ private static ImmutableMap<String, String> splitDockerDomain(String name) {
99
125
if (DEFAULT_DOMAIN .equals (domain ) && !remainder .contains ("/" )) {
100
126
remainder = String .format ("%s/%s" , DEFAULT_REPO , remainder );
101
127
}
102
- return ImmutableMap .of ("domain" , domain , "remainder" , remainder );
128
+ return ImmutableMap .of (
129
+ "domain" , domain , "remainder" , remainder , "platform" , platform , "digest" , digest );
103
130
}
104
131
105
132
public String getDomain () {
@@ -118,6 +145,10 @@ public String getDigest() {
118
145
return digest ;
119
146
}
120
147
148
+ public String getPlatform () {
149
+ return platform ;
150
+ }
151
+
121
152
public String getFamiliarName () {
122
153
StringBuilder familiar = new StringBuilder ();
123
154
@@ -142,6 +173,16 @@ public String getFamiliarName() {
142
173
return familiar .toString ();
143
174
}
144
175
176
+ private static String getDefaultPlatform () {
177
+ String arch = System .getProperty ("os.arch" ).toLowerCase ();
178
+ if (arch .contains ("amd64" ) || arch .contains ("x86_64" )) {
179
+ arch = "amd64" ;
180
+ } else if (arch .contains ("arm64" ) || arch .contains ("aarch64" )) {
181
+ arch = "arm64" ;
182
+ }
183
+ return "linux/" + arch ;
184
+ }
185
+
145
186
@ Override
146
187
public String toString () {
147
188
return "Reference{"
@@ -157,6 +198,8 @@ public String toString() {
157
198
+ ", digest='"
158
199
+ digest
159
200
+ '\''
201
+ + ", platform='"
202
+ + platform
160
203
+ '}' ;
161
204
}
162
205
@@ -170,11 +213,12 @@ public boolean equals(Object o) {
170
213
return this .domain .equals (that .domain )
171
214
&& this .name .equals (that .name )
172
215
&& Objects .equals (tag , that .tag )
173
- && Objects .equals (digest , that .digest );
216
+ && Objects .equals (digest , that .digest )
217
+ && Objects .equals (platform , that .platform );
174
218
}
175
219
176
220
@ Override
177
221
public int hashCode () {
178
- return Objects .hash (domain , name , tag , digest );
222
+ return Objects .hash (domain , name , tag , digest , platform );
179
223
}
180
224
}
0 commit comments