@@ -328,6 +328,74 @@ func (f Frontend) Call(ctx context.Context, cln *client.Client, val Value, opts
328328 return NewValue (ctx , fs )
329329}
330330
331+ type Cache struct {}
332+
333+ func (c Cache ) Call (ctx context.Context , cln * client.Client , val Value , opts Option , input Filesystem , ref string ) (Value , error ) {
334+ inputDgst , err := input .Digest (ctx )
335+ if err != nil {
336+ return nil , Arg (ctx , 1 ).WithError (err )
337+ }
338+ named , err := reference .ParseNormalizedNamed (ref )
339+ if err != nil {
340+ return nil , errdefs .WithInvalidImageRef (err , Arg (ctx , 1 ), ref )
341+ }
342+ namedTagged , err := reference .WithTag (named , inputDgst .Encoded ())
343+ if err != nil {
344+ return nil , Arg (ctx , 1 ).WithError (err )
345+ }
346+ ref = namedTagged .String ()
347+
348+ resolver := ImageResolver (ctx )
349+ if resolver != nil {
350+ resolveOpt := llb.ResolveImageConfigOpt {
351+ Platform : & input .Platform ,
352+ }
353+
354+ dgst , config , err := resolver .ResolveImageConfig (ctx , ref , resolveOpt )
355+ if err == nil {
356+ var imageOpts []llb.ImageOption
357+ imageOpts = append (imageOpts , llb .Platform (input .Platform ))
358+ for _ , opt := range SourceMap (ctx ) {
359+ imageOpts = append (imageOpts , opt )
360+ }
361+
362+ canonical , err := reference .WithDigest (named , dgst )
363+ if err != nil {
364+ return nil , errdefs .WithInvalidImageRef (err , Arg (ctx , 1 ), ref )
365+ }
366+
367+ cacheVal , err := NewValue (ctx , llb .Image (canonical .String ()))
368+ if err != nil {
369+ return nil , Arg (ctx , 1 ).WithError (err )
370+ }
371+
372+ input , err = cacheVal .Filesystem ()
373+ if err != nil {
374+ return nil , Arg (ctx , 1 ).WithError (err )
375+ }
376+
377+ input .State , err = input .State .WithImageConfig (config )
378+ if err != nil {
379+ return nil , Arg (ctx , 1 ).WithError (err )
380+ }
381+
382+ input .Image = & solver.ImageSpec {}
383+ err = json .Unmarshal (config , input .Image )
384+ if err != nil {
385+ return nil , Arg (ctx , 1 ).WithError (err )
386+ }
387+ } else { // not found
388+ inputVal , err := NewValue (ctx , input )
389+ if err != nil {
390+ return nil , Arg (ctx , 0 ).WithError (err )
391+ }
392+ return (DockerPush {}).Call (ctx , cln , inputVal , opts , ref )
393+ }
394+ }
395+
396+ return NewValue (ctx , input )
397+ }
398+
331399type Env struct {}
332400
333401func (e Env ) Call (ctx context.Context , cln * client.Client , val Value , opts Option , key , value string ) (Value , error ) {
0 commit comments