Skip to content

Commit 8500e54

Browse files
feat: change foreign layer error message at repository.Fetch() (#377)
Signed-off-by: wangxiaoxuan273 <wangxiaoxuan119@gmail.com>
1 parent 0382be2 commit 8500e54

File tree

3 files changed

+19
-0
lines changed

3 files changed

+19
-0
lines changed

copy.go

+4
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import (
2626
"oras.land/oras-go/v2/content"
2727
"oras.land/oras-go/v2/errdef"
2828
"oras.land/oras-go/v2/internal/cas"
29+
"oras.land/oras-go/v2/internal/descriptor"
2930
"oras.land/oras-go/v2/internal/platform"
3031
"oras.land/oras-go/v2/internal/registryutil"
3132
"oras.land/oras-go/v2/internal/status"
@@ -258,6 +259,9 @@ func copyGraph(ctx context.Context, src content.ReadOnlyStorage, dst content.Sto
258259
func doCopyNode(ctx context.Context, src content.ReadOnlyStorage, dst content.Storage, desc ocispec.Descriptor) error {
259260
rc, err := src.Fetch(ctx, desc)
260261
if err != nil {
262+
if descriptor.IsForeignLayer(desc) && errors.Is(err, errdef.ErrNotFound) {
263+
return fmt.Errorf("the artifact with foreign layer %s is not supported: %w", desc.Digest, err)
264+
}
261265
return err
262266
}
263267
defer rc.Close()

internal/descriptor/descriptor.go

+14
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package descriptor
1818
import (
1919
"github.com/opencontainers/go-digest"
2020
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
21+
"oras.land/oras-go/v2/internal/docker"
2122
)
2223

2324
// Descriptor contains the minimun information to describe the disposition of
@@ -45,3 +46,16 @@ func FromOCI(desc ocispec.Descriptor) Descriptor {
4546
Size: desc.Size,
4647
}
4748
}
49+
50+
// IsForeignLayer checks if a descriptor describes a foreign layer.
51+
func IsForeignLayer(desc ocispec.Descriptor) bool {
52+
switch desc.MediaType {
53+
case ocispec.MediaTypeImageLayerNonDistributable,
54+
ocispec.MediaTypeImageLayerNonDistributableGzip,
55+
ocispec.MediaTypeImageLayerNonDistributableZstd,
56+
docker.MediaTypeForeignLayer:
57+
return true
58+
default:
59+
return false
60+
}
61+
}

internal/docker/mediatype.go

+1
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,5 @@ const (
2020
MediaTypeConfig = "application/vnd.docker.container.image.v1+json"
2121
MediaTypeManifestList = "application/vnd.docker.distribution.manifest.list.v2+json"
2222
MediaTypeManifest = "application/vnd.docker.distribution.manifest.v2+json"
23+
MediaTypeForeignLayer = "application/vnd.docker.image.rootfs.foreign.diff.tar.gzip"
2324
)

0 commit comments

Comments
 (0)