build: make Build accept only refs without builds

This commit is contained in:
Blake Mizerany 2024-04-01 22:12:43 -07:00
parent 2318ed2919
commit f488652ba7
2 changed files with 25 additions and 9 deletions

View File

@ -125,6 +125,10 @@ func (r Ref) Complete() bool {
return r.Valid() && !slices.Contains(r.Parts(), "")
}
func (r Ref) CompleteWithoutBuild() bool {
return r.Valid() && !slices.Contains(r.Parts()[:tag], "")
}
// Less returns true if r is less concrete than o; false otherwise.
func (r Ref) Less(o Ref) bool {
rp := r.Parts()

View File

@ -16,6 +16,7 @@ import (
// Errors
var (
ErrIncompleteRef = errors.New("unqualified ref")
ErrBuildPresentInRef = errors.New("build present in ref")
ErrUnsupportedModelFormat = errors.New("unsupported model format")
ErrMissingFileType = errors.New("missing 'general.file_type' key")
ErrNotFound = errors.New("not found")
@ -53,8 +54,8 @@ func Open(dir string) (*Server, error) {
func (s *Server) Build(ref string, f model.File) error {
br := blob.ParseRef(ref)
if !br.Complete() {
return fmt.Errorf("%w: %q", ErrIncompleteRef, br.Full())
if !br.CompleteWithoutBuild() {
return fmt.Errorf("%w: %q", ErrIncompleteRef, ref)
}
// 1. Resolve FROM
@ -91,11 +92,10 @@ func (s *Server) Build(ref string, f model.File) error {
Size: size,
})
data, err := json.Marshal(Manifest{Layers: layers})
if err != nil {
return err
}
return s.Set(br.WithBuild(info.FileType.String()), data)
return s.setManifestData(
br.WithBuild(info.FileType.String()),
Manifest{Layers: layers},
)
}
func (s *Server) LayerFile(digest string) (string, error) {
@ -161,9 +161,21 @@ func (s *Server) resolve(ref blob.Ref) (data []byte, path string, err error) {
return data, path, nil
}
func (s *Server) SetManifestData(ref string, m Manifest) error {
br, err := parseCompleteRef(ref)
if err != nil {
return err
}
return s.setManifestData(br, m)
}
// Set sets the data for the given ref.
func (s *Server) Set(ref blob.Ref, data []byte) error {
path, err := s.refFileName(ref)
func (s *Server) setManifestData(br blob.Ref, m Manifest) error {
data, err := json.Marshal(m)
if err != nil {
return err
}
path, err := s.refFileName(br)
if err != nil {
return err
}