diff --git a/build/blob/ref.go b/build/blob/ref.go index b8ad52032..093701e13 100644 --- a/build/blob/ref.go +++ b/build/blob/ref.go @@ -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() diff --git a/build/build.go b/build/build.go index bca31eac8..9f80820db 100644 --- a/build/build.go +++ b/build/build.go @@ -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 }