|
@@ -14,7 +14,9 @@ import (
|
|
|
|
|
|
type Manifest struct {
|
|
|
ManifestV2
|
|
|
- Digest string `json:"-"`
|
|
|
+
|
|
|
+ filepath string
|
|
|
+ digest string
|
|
|
}
|
|
|
|
|
|
func (m *Manifest) Size() (size int64) {
|
|
@@ -25,9 +27,28 @@ func (m *Manifest) Size() (size int64) {
|
|
|
return
|
|
|
}
|
|
|
|
|
|
-func ParseNamedManifest(name model.Name) (*Manifest, error) {
|
|
|
- if !name.IsFullyQualified() {
|
|
|
- return nil, model.Unqualified(name)
|
|
|
+func (m *Manifest) Remove() error {
|
|
|
+ if err := os.Remove(m.filepath); err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ for _, layer := range append(m.Layers, m.Config) {
|
|
|
+ if err := layer.Remove(); err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ manifests, err := GetManifestPath()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ return PruneDirectory(manifests)
|
|
|
+}
|
|
|
+
|
|
|
+func ParseNamedManifest(n model.Name) (*Manifest, error) {
|
|
|
+ if !n.IsFullyQualified() {
|
|
|
+ return nil, model.Unqualified(n)
|
|
|
}
|
|
|
|
|
|
manifests, err := GetManifestPath()
|
|
@@ -35,20 +56,24 @@ func ParseNamedManifest(name model.Name) (*Manifest, error) {
|
|
|
return nil, err
|
|
|
}
|
|
|
|
|
|
- var manifest ManifestV2
|
|
|
- manifestfile, err := os.Open(filepath.Join(manifests, name.Filepath()))
|
|
|
+ p := filepath.Join(manifests, n.Filepath())
|
|
|
+
|
|
|
+ var m ManifestV2
|
|
|
+ f, err := os.Open(p)
|
|
|
if err != nil {
|
|
|
return nil, err
|
|
|
}
|
|
|
+ defer f.Close()
|
|
|
|
|
|
sha256sum := sha256.New()
|
|
|
- if err := json.NewDecoder(io.TeeReader(manifestfile, sha256sum)).Decode(&manifest); err != nil {
|
|
|
+ if err := json.NewDecoder(io.TeeReader(f, sha256sum)).Decode(&m); err != nil {
|
|
|
return nil, err
|
|
|
}
|
|
|
|
|
|
return &Manifest{
|
|
|
- ManifestV2: manifest,
|
|
|
- Digest: fmt.Sprintf("%x", sha256sum.Sum(nil)),
|
|
|
+ ManifestV2: m,
|
|
|
+ filepath: p,
|
|
|
+ digest: fmt.Sprintf("%x", sha256sum.Sum(nil)),
|
|
|
}, nil
|
|
|
}
|
|
|
|
|
@@ -77,3 +102,36 @@ func WriteManifest(name string, config *Layer, layers []*Layer) error {
|
|
|
|
|
|
return os.WriteFile(manifestPath, b.Bytes(), 0o644)
|
|
|
}
|
|
|
+
|
|
|
+func Manifests() (map[model.Name]*Manifest, error) {
|
|
|
+ manifests, err := GetManifestPath()
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+
|
|
|
+ // TODO(mxyng): use something less brittle
|
|
|
+ matches, err := filepath.Glob(fmt.Sprintf("%s/*/*/*/*", manifests))
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+
|
|
|
+ ms := make(map[model.Name]*Manifest)
|
|
|
+ for _, match := range matches {
|
|
|
+ rel, err := filepath.Rel(manifests, match)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+
|
|
|
+ n := model.ParseNameFromFilepath(rel)
|
|
|
+ if n.IsValid() {
|
|
|
+ m, err := ParseNamedManifest(n)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+
|
|
|
+ ms[n] = m
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return ms, nil
|
|
|
+}
|