experimental/tag.go (77 lines of code) (raw):

package experimental import ( "path/filepath" "sync" "github.com/Sirupsen/logrus" ) type tagData struct { repository *repositoryData name string current digest versions []digest lock sync.Mutex } func (t *tagData) currentLinkPath() string { return filepath.Join("repositories", t.repository.name, "_manifests", "tags", t.name, "current", "link") } func (t *tagData) versionLinkPath(version digest) string { return filepath.Join("repositories", t.repository.name, "_manifests", "tags", t.name, "index", version.path(), "link") } func (t *tagData) mark(blobs blobsData) error { if t.current.valid() { t.repository.markManifest(t.current) } for _, version := range t.versions { if version == t.current { continue } if *deleteOldTagVersions { continue } t.repository.markManifest(version) } return nil } func (t *tagData) sweep() error { if !t.current.valid() { err := deleteFile(t.currentLinkPath(), digestReferenceSize) if err != nil { return err } } for _, version := range t.versions { if version == t.current { continue } if *deleteOldTagVersions { err := deleteFile(t.versionLinkPath(version), digestReferenceSize) if err != nil { return err } } } return nil } func (t *tagData) setCurrent(info fileInfo) error { //INFO[0000] /test2/_manifests/tags/latest/current/link link, err := readLink(t.currentLinkPath(), info.etag) if err != nil { return err } t.current = link logrus.Infoln("TAG:", t.repository.name, ":", t.name, ": is using:", t.current) return nil } func (t *tagData) addVersion(args []string, info fileInfo) error { //INFO[0000] /test2/_manifests/tags/latest/index/sha256/af8338145978acd626bfb9e863fa446bebfc9f2660bee1af99ed29efc48d73b4/link link, err := analyzeLink(args) if err != nil { return err } err = verifyLink(link, t.versionLinkPath(link), info.etag) if err != nil { return err } t.lock.Lock() defer t.lock.Unlock() t.versions = append(t.versions, link) return nil }