package storage import ( "path/filepath" "regexp" ) var digestRe = regexp.MustCompile(`^sha256:[a-f0-9]{64}$`) // Store manages blob storage on the local filesystem. type Store struct { layersPath string uploadsPath string } // New creates a Store that will write final blobs under layersPath and // stage in-progress uploads under uploadsPath. func New(layersPath, uploadsPath string) *Store { return &Store{ layersPath: layersPath, uploadsPath: uploadsPath, } } // validateDigest checks that digest matches sha256:<64 lowercase hex chars>. func validateDigest(digest string) error { if !digestRe.MatchString(digest) { return ErrInvalidDigest } return nil } // blobPath returns the filesystem path for a blob with the given digest. // The layout is: /sha256// func (s *Store) blobPath(digest string) string { hex := digest[len("sha256:"):] return filepath.Join(s.layersPath, "sha256", hex[0:2], hex) }