@@ -100,7 +100,7 @@ func (b *graphBuilder) Build(ctx context.Context) error {
100100 if err != nil {
101101 return fmt .Errorf ("failed to obtain new pusher: %w" , err )
102102 }
103- tagPusher , err := b .Resolver .Pusher (ctx , b .TargetRef ) // append '@' to avoid tag
103+ tagPusher , err := b .Resolver .Pusher (ctx , b .TargetRef )
104104 if err != nil {
105105 return fmt .Errorf ("failed to obtain new tag pusher: %w" , err )
106106 }
@@ -283,8 +283,10 @@ func (b *graphBuilder) buildOne(ctx context.Context, src v1.Descriptor, tag bool
283283
284284 // build
285285 builder := & overlaybdBuilder {
286- layers : len (engineBase .manifest .Layers ),
287- engine : engine ,
286+ layers : len (engineBase .manifest .Layers ),
287+ engine : engine ,
288+ pusher : engineBase .pusher ,
289+ fetcher : engineBase .fetcher ,
288290 }
289291 desc , err := builder .Build (ctx )
290292 if err != nil {
@@ -347,8 +349,10 @@ func Build(ctx context.Context, opt BuilderOptions) error {
347349}
348350
349351type overlaybdBuilder struct {
350- layers int
351- engine builderEngine
352+ layers int
353+ engine builderEngine
354+ pusher remotes.Pusher
355+ fetcher remotes.Fetcher
352356}
353357
354358// Build return a descriptor of the converted target, as the caller may need it
@@ -363,6 +367,21 @@ func (b *overlaybdBuilder) Build(ctx context.Context) (v1.Descriptor, error) {
363367 // when errors are encountered fallback to regular conversion
364368 if convertedDesc , err := b .engine .CheckForConvertedManifest (ctx ); err == nil && convertedDesc .Digest != "" {
365369 logrus .Infof ("Image found already converted in registry with digest %s" , convertedDesc .Digest )
370+ // fetch the already converted manifest and push with new tag
371+ convertedManifest , err := fetchManifest (ctx , b .fetcher , convertedDesc )
372+ if err != nil {
373+ return v1.Descriptor {}, fmt .Errorf ("failed to fetch converted manifest: %w" , err )
374+ }
375+ cbuf , err := json .Marshal (convertedManifest )
376+ if err != nil {
377+ return v1.Descriptor {}, fmt .Errorf ("failed to marshal converted manifest: %w" , err )
378+ }
379+ // ensure that output tag is pushed even if the manifest is already converted and found in registry
380+ // push output tag only if the pusher is tagPusher
381+ if err := uploadBytes (ctx , b .pusher , convertedDesc , cbuf ); err != nil {
382+ return v1.Descriptor {}, fmt .Errorf ("failed to upload converted manifest: %w" , err )
383+ }
384+ log .G (ctx ).Infof ("converted manifest uploaded, %s" , convertedDesc .Digest )
366385 return convertedDesc , nil
367386 }
368387
0 commit comments