1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package ocimem
16
17 import (
18 "context"
19 "fmt"
20
21 "cuelabs.dev/go/oci/ociregistry"
22 )
23
24
25
26 func (r *Registry) GetBlob(ctx context.Context, repoName string, dig ociregistry.Digest) (ociregistry.BlobReader, error) {
27 r.mu.Lock()
28 defer r.mu.Unlock()
29 b, err := r.blobForDigest(repoName, dig)
30 if err != nil {
31 return nil, err
32 }
33 return NewBytesReader(b.data, b.descriptor()), nil
34 }
35
36 func (r *Registry) GetBlobRange(ctx context.Context, repoName string, dig ociregistry.Digest, o0, o1 int64) (ociregistry.BlobReader, error) {
37 r.mu.Lock()
38 defer r.mu.Unlock()
39 b, err := r.blobForDigest(repoName, dig)
40 if err != nil {
41 return nil, err
42 }
43 if o1 < 0 || o1 > int64(len(b.data)) {
44 o1 = int64(len(b.data))
45 }
46 if o0 < 0 || o0 > o1 {
47 return nil, fmt.Errorf("invalid range [%d, %d]; have [%d, %d]", o0, o1, 0, len(b.data))
48 }
49 return NewBytesReader(b.data[o0:o1], b.descriptor()), nil
50 }
51
52 func (r *Registry) GetManifest(ctx context.Context, repoName string, dig ociregistry.Digest) (ociregistry.BlobReader, error) {
53 r.mu.Lock()
54 defer r.mu.Unlock()
55 b, err := r.manifestForDigest(repoName, dig)
56 if err != nil {
57 return nil, err
58 }
59 return NewBytesReader(b.data, b.descriptor()), nil
60 }
61
62 func (r *Registry) GetTag(ctx context.Context, repoName string, tagName string) (ociregistry.BlobReader, error) {
63 desc, err := r.ResolveTag(ctx, repoName, tagName)
64 if err != nil {
65 return nil, err
66 }
67 return r.GetManifest(ctx, repoName, desc.Digest)
68 }
69
70 func (r *Registry) ResolveTag(ctx context.Context, repoName string, tagName string) (ociregistry.Descriptor, error) {
71 r.mu.Lock()
72 defer r.mu.Unlock()
73 repo, err := r.repo(repoName)
74 if err != nil {
75 return ociregistry.Descriptor{}, err
76 }
77 desc, ok := repo.tags[tagName]
78 if !ok {
79 return ociregistry.Descriptor{}, ociregistry.ErrManifestUnknown
80 }
81 return desc, nil
82 }
83
84 func (r *Registry) ResolveBlob(ctx context.Context, repoName string, digest ociregistry.Digest) (ociregistry.Descriptor, error) {
85 r.mu.Lock()
86 defer r.mu.Unlock()
87 b, err := r.blobForDigest(repoName, digest)
88 if err != nil {
89 return ociregistry.Descriptor{}, err
90 }
91 return b.descriptor(), nil
92 }
93
94 func (r *Registry) ResolveManifest(ctx context.Context, repoName string, digest ociregistry.Digest) (ociregistry.Descriptor, error) {
95 r.mu.Lock()
96 defer r.mu.Unlock()
97 b, err := r.manifestForDigest(repoName, digest)
98 if err != nil {
99 return ociregistry.Descriptor{}, err
100 }
101 return b.descriptor(), nil
102 }
103
View as plain text