@@ -25,17 +25,18 @@ import (
2525 "io"
2626 "time"
2727
28+ "github.com/containerd/errdefs"
29+ "github.com/containerd/log"
30+ digest "github.com/opencontainers/go-digest"
31+ ocispec "github.com/opencontainers/image-spec/specs-go/v1"
32+
2833 "github.com/containerd/containerd/v2/core/content"
2934 "github.com/containerd/containerd/v2/core/diff"
3035 "github.com/containerd/containerd/v2/core/mount"
3136 "github.com/containerd/containerd/v2/pkg/archive"
3237 "github.com/containerd/containerd/v2/pkg/archive/compression"
3338 "github.com/containerd/containerd/v2/pkg/epoch"
3439 "github.com/containerd/containerd/v2/pkg/labels"
35- "github.com/containerd/errdefs"
36- "github.com/containerd/log"
37- digest "github.com/opencontainers/go-digest"
38- ocispec "github.com/opencontainers/image-spec/specs-go/v1"
3940)
4041
4142type walkingDiff struct {
@@ -74,12 +75,12 @@ func (s *walkingDiff) Compare(ctx context.Context, lower, upper []mount.Mount, o
7475 writeDiffOpts = append (writeDiffOpts , archive .WithSourceDateEpoch (config .SourceDateEpoch ))
7576 }
7677
77- var isCompressed bool
78+ compressionType := compression . Uncompressed
7879 if config .Compressor != nil {
7980 if config .MediaType == "" {
8081 return emptyDesc , errors .New ("media type must be explicitly specified when using custom compressor" )
8182 }
82- isCompressed = true
83+ compressionType = compression . Unknown
8384 } else {
8485 if config .MediaType == "" {
8586 config .MediaType = ocispec .MediaTypeImageLayerGzip
@@ -88,7 +89,9 @@ func (s *walkingDiff) Compare(ctx context.Context, lower, upper []mount.Mount, o
8889 switch config .MediaType {
8990 case ocispec .MediaTypeImageLayer :
9091 case ocispec .MediaTypeImageLayerGzip :
91- isCompressed = true
92+ compressionType = compression .Gzip
93+ case ocispec .MediaTypeImageLayerZstd :
94+ compressionType = compression .Zstd
9295 default :
9396 return emptyDesc , fmt .Errorf ("unsupported diff media type: %v: %w" , config .MediaType , errdefs .ErrNotImplemented )
9497 }
@@ -131,7 +134,7 @@ func (s *walkingDiff) Compare(ctx context.Context, lower, upper []mount.Mount, o
131134 }
132135 }
133136
134- if isCompressed {
137+ if compressionType != compression . Uncompressed {
135138 dgstr := digest .SHA256 .Digester ()
136139 var compressed io.WriteCloser
137140 if config .Compressor != nil {
@@ -140,7 +143,7 @@ func (s *walkingDiff) Compare(ctx context.Context, lower, upper []mount.Mount, o
140143 return fmt .Errorf ("failed to get compressed stream: %w" , errOpen )
141144 }
142145 } else {
143- compressed , errOpen = compression .CompressStream (cw , compression . Gzip )
146+ compressed , errOpen = compression .CompressStream (cw , compressionType )
144147 if errOpen != nil {
145148 return fmt .Errorf ("failed to get compressed stream: %w" , errOpen )
146149 }
0 commit comments