@@ -201,12 +201,41 @@ public class Builder {
201201 try command. finish ( )
202202 }
203203
204- public func tagDefaultDeviceDockerImages( filter: ImageDescriptionFilter ) throws {
205- let defaultImages = try defaultDeviceDockerImageDescriptions ( filter: filter)
206-
204+ public func tagDefaultDockerImages( filter: ImageDescriptionFilter ) throws {
205+ if filter. baseType == nil {
206+ let defaultDeviceImages = try defaultDeviceDockerImageDescriptions ( filter: filter)
207+ try tagDefaultDockerImages ( defaultDeviceImages)
208+
209+ let defaultArchitectureImages = try defaultArchitectureDockerImageDescriptions ( filter: filter)
210+ try tagDefaultDockerImages ( defaultArchitectureImages)
211+ } else {
212+ let defaultImages = try defaultDockerImageDescriptions ( filter: filter)
213+ try tagDefaultDockerImages ( defaultImages)
214+ }
215+ }
216+
217+ private func tagDefaultDockerImages( _ images: [ ImageDescription ] , pullImages: Bool = false ) throws {
207218 let context = CustomContext ( main)
208219
209- defaultImages. forEach { imageDescription in
220+ print ( " Tag Manifest " )
221+ images. forEach { imageDescription in
222+ print ( " - \( imageDescription. defaultOSDockerTag) " )
223+ }
224+ print ( )
225+
226+ images. forEach { imageDescription in
227+ if pullImages {
228+ let pullCommand = context. runAsyncAndPrint ( bash: " docker pull \( imageDescription. dockerTag) " )
229+ currentCommand = pullCommand
230+ do {
231+ try pullCommand. finish ( )
232+ print ( " Pulled \( imageDescription. dockerTag) " )
233+ } catch {
234+ print ( " ERROR: Failed to pull \( imageDescription. dockerTag) . Skipping this tag. " )
235+ return
236+ }
237+ }
238+
210239 let tagCommand = context. runAsyncAndPrint ( bash: " docker tag \( imageDescription. dockerTag) \( imageDescription. defaultOSDockerTag) " )
211240 currentCommand = tagCommand
212241 do {
@@ -218,20 +247,31 @@ public class Builder {
218247 }
219248 }
220249
221- public func pushDefaultDeviceDockerImages( filter: ImageDescriptionFilter ) throws {
222- let defaultImages = try defaultDeviceDockerImageDescriptions ( filter: filter)
223-
250+ public func pushDefaultDockerImages( filter: ImageDescriptionFilter ) throws {
251+ if filter. baseType == nil {
252+ let defaultDeviceImages = try defaultDeviceDockerImageDescriptions ( filter: filter)
253+ try pushDefaultDockerImages ( defaultDeviceImages)
254+
255+ let defaultArchitectureImages = try defaultArchitectureDockerImageDescriptions ( filter: filter)
256+ try pushDefaultDockerImages ( defaultArchitectureImages)
257+ } else {
258+ let defaultImages = try defaultDockerImageDescriptions ( filter: filter)
259+ try pushDefaultDockerImages ( defaultImages)
260+ }
261+ }
262+
263+ public func pushDefaultDockerImages( _ images: [ ImageDescription ] ) throws {
224264 let context = CustomContext ( main)
225265
226266 print ( " Push Manifest " )
227- defaultImages . forEach { imageDescription in
267+ images . forEach { imageDescription in
228268 print ( " - \( imageDescription. defaultOSDockerTag) " )
229269 }
230270 print ( )
231271
232272 var failedImages = [ ImageDescription] ( )
233273
234- defaultImages . forEach { imageDescription in
274+ images . forEach { imageDescription in
235275 let tagCommand = context. runAsyncAndPrint ( bash: " docker push \( imageDescription. defaultOSDockerTag) " )
236276 currentCommand = tagCommand
237277 do {
@@ -261,16 +301,30 @@ public class Builder {
261301 }
262302
263303 func defaultDeviceDockerImageDescriptions( filter: ImageDescriptionFilter ) throws -> [ ImageDescription ] {
264- let deviceImageDescriptions = try ImageDescription . imageDescriptions ( for: filter) . filter { $0. isDeviceBase }
304+ var filter = filter
305+ filter. baseType = . device
306+ return try defaultDockerImageDescriptions ( filter: filter)
307+ }
308+
309+ func defaultArchitectureDockerImageDescriptions( filter: ImageDescriptionFilter ) throws -> [ ImageDescription ] {
310+ var filter = filter
311+ filter. baseType = . architecture
312+ return try defaultDockerImageDescriptions ( filter: filter)
313+ }
314+
315+ private func defaultDockerImageDescriptions( filter: ImageDescriptionFilter ) throws -> [ ImageDescription ] {
316+ precondition ( filter. baseType != nil )
317+
318+ let deviceImageDescriptions = try ImageDescription . imageDescriptions ( for: filter)
265319
266320 let groupedByVersion = Dictionary ( grouping: deviceImageDescriptions) { $0. swiftVersion }
267321
268322 var defaultImages = [ ImageDescription] ( )
269323
270324 groupedByVersion. forEach { _, imageDescriptions in
271- let groupedByDevice = Dictionary ( grouping: imageDescriptions) { $0. base }
325+ let groupedByBase = Dictionary ( grouping: imageDescriptions) { $0. base }
272326
273- groupedByDevice . forEach { _, imageDescriptions in
327+ groupedByBase . forEach { _, imageDescriptions in
274328
275329 var defaultImage : ImageDescription ?
276330 for os in preferredOperatingSystems ( ) {
0 commit comments