diff --git a/content/oci/oci.go b/content/oci/oci.go index 4e10311f..916a71e5 100644 --- a/content/oci/oci.go +++ b/content/oci/oci.go @@ -485,17 +485,22 @@ func (s *Store) GC(ctx context.Context) error { return err } // skip the directories - if !info.IsDir() { - alg := filepath.Base(filepath.Dir(path)) - blobDigest, err := digest.Parse(fmt.Sprintf("%s:%s", alg, info.Name())) + if info.IsDir() { + return nil + } + alg := filepath.Base(filepath.Dir(path)) + blobDigest, err := digest.Parse(fmt.Sprintf("%s:%s", alg, info.Name())) + if err != nil { + return err + } + if exists := s.graph.Exists(blobDigest); !exists { + // remove the blob from storage if it does not exist in Store + err = os.Remove(path) if err != nil { - return err - } - if exists := s.graph.Exists(blobDigest); !exists { - // remove the blob from storage if it does not exist in Store - if err := s.storage.deleteByDigest(ctx, blobDigest); err != nil { - return err + if errors.Is(err, fs.ErrNotExist) { + return fmt.Errorf("%s: %w", blobDigest, errdef.ErrNotFound) } + return err } } return nil diff --git a/content/oci/storage.go b/content/oci/storage.go index a581cd1f..efb9f3d8 100644 --- a/content/oci/storage.go +++ b/content/oci/storage.go @@ -25,7 +25,6 @@ import ( "path/filepath" "sync" - "github.com/opencontainers/go-digest" ocispec "github.com/opencontainers/image-spec/specs-go/v1" "oras.land/oras-go/v2/errdef" "oras.land/oras-go/v2/internal/ioutil" @@ -110,19 +109,15 @@ func (s *Storage) Push(_ context.Context, expected ocispec.Descriptor, content i // Delete removes the target from the system. func (s *Storage) Delete(ctx context.Context, target ocispec.Descriptor) error { - return s.deleteByDigest(ctx, target.Digest) -} - -func (s *Storage) deleteByDigest(ctx context.Context, digest digest.Digest) error { - path, err := blobPath(digest) + path, err := blobPath(target.Digest) if err != nil { - return fmt.Errorf("%s: %w", digest, errdef.ErrInvalidDigest) + return fmt.Errorf("%s: %s: %w", target.Digest, target.MediaType, errdef.ErrInvalidDigest) } targetPath := filepath.Join(s.root, path) err = os.Remove(targetPath) if err != nil { if errors.Is(err, fs.ErrNotExist) { - return fmt.Errorf("%s: %w", digest, errdef.ErrNotFound) + return fmt.Errorf("%s: %s: %w", target.Digest, target.MediaType, errdef.ErrNotFound) } return err }