Add initial support for an explicit "SharedTags" field
Things we know we'll need to be able to do with the new `SharedTags` (and are thus included in this initial file format support): - get list of all shared tags from a manifest (`manifest.GetAllSharedTags()`) - get list of shared tags from an entry (`entry.SharedTags`) - get list of entries given a shared tag (`manifest.GetSharedTag(tag)`)
This commit is contained in:
parent
08ef5a968e
commit
8488b2f8fc
|
|
@ -27,7 +27,8 @@ type Manifest2822Entry struct {
|
|||
|
||||
Maintainers []string `delim:"," strip:"\n\r\t "`
|
||||
|
||||
Tags []string `delim:"," strip:"\n\r\t "`
|
||||
Tags []string `delim:"," strip:"\n\r\t "`
|
||||
SharedTags []string `delim:"," strip:"\n\r\t "`
|
||||
|
||||
GitRepo string
|
||||
GitFetch string
|
||||
|
|
@ -46,6 +47,7 @@ func (entry Manifest2822Entry) Clone() Manifest2822Entry {
|
|||
// SLICES! grr
|
||||
entry.Maintainers = append([]string{}, entry.Maintainers...)
|
||||
entry.Tags = append([]string{}, entry.Tags...)
|
||||
entry.SharedTags = append([]string{}, entry.SharedTags...)
|
||||
entry.Constraints = append([]string{}, entry.Constraints...)
|
||||
return entry
|
||||
}
|
||||
|
|
@ -60,6 +62,10 @@ func (entry Manifest2822Entry) TagsString() string {
|
|||
return strings.Join(entry.Tags, StringSeparator2822)
|
||||
}
|
||||
|
||||
func (entry Manifest2822Entry) SharedTagsString() string {
|
||||
return strings.Join(entry.SharedTags, StringSeparator2822)
|
||||
}
|
||||
|
||||
func (entry Manifest2822Entry) ConstraintsString() string {
|
||||
return strings.Join(entry.Constraints, StringSeparator2822)
|
||||
}
|
||||
|
|
@ -77,6 +83,9 @@ func (entry Manifest2822Entry) ClearDefaults(defaults Manifest2822Entry) Manifes
|
|||
if entry.TagsString() == defaults.TagsString() {
|
||||
entry.Tags = nil
|
||||
}
|
||||
if entry.SharedTagsString() == defaults.SharedTagsString() {
|
||||
entry.SharedTags = nil
|
||||
}
|
||||
if entry.GitRepo == defaults.GitRepo {
|
||||
entry.GitRepo = ""
|
||||
}
|
||||
|
|
@ -103,6 +112,9 @@ func (entry Manifest2822Entry) String() string {
|
|||
if str := entry.TagsString(); str != "" {
|
||||
ret = append(ret, "Tags: "+str)
|
||||
}
|
||||
if str := entry.SharedTagsString(); str != "" {
|
||||
ret = append(ret, "SharedTags: "+str)
|
||||
}
|
||||
if str := entry.GitRepo; str != "" {
|
||||
ret = append(ret, "GitRepo: "+str)
|
||||
}
|
||||
|
|
@ -145,6 +157,16 @@ func (entry Manifest2822Entry) HasTag(tag string) bool {
|
|||
return false
|
||||
}
|
||||
|
||||
// HasSharedTag returns true if the given tag exists in entry.SharedTags.
|
||||
func (entry Manifest2822Entry) HasSharedTag(tag string) bool {
|
||||
for _, existingTag := range entry.SharedTags {
|
||||
if tag == existingTag {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (manifest Manifest2822) GetTag(tag string) *Manifest2822Entry {
|
||||
for _, entry := range manifest.Entries {
|
||||
if entry.HasTag(tag) {
|
||||
|
|
@ -154,6 +176,27 @@ func (manifest Manifest2822) GetTag(tag string) *Manifest2822Entry {
|
|||
return nil
|
||||
}
|
||||
|
||||
// GetSharedTag returns a list of entries with the given tag in entry.SharedTags (or the empty list if there are no entries with the given tag).
|
||||
func (manifest Manifest2822) GetSharedTag(tag string) []Manifest2822Entry {
|
||||
ret := []Manifest2822Entry{}
|
||||
for _, entry := range manifest.Entries {
|
||||
if entry.HasSharedTag(tag) {
|
||||
ret = append(ret, entry)
|
||||
}
|
||||
}
|
||||
return ret
|
||||
}
|
||||
|
||||
// GetAllSharedTags returns a list of the sum of all SharedTags in all entries of this image manifest (in the order they appear in the file).
|
||||
func (manifest Manifest2822) GetAllSharedTags() []string {
|
||||
fakeEntry := Manifest2822Entry{}
|
||||
for _, entry := range manifest.Entries {
|
||||
fakeEntry.SharedTags = append(fakeEntry.SharedTags, entry.SharedTags...)
|
||||
}
|
||||
fakeEntry.DeduplicateSharedTags()
|
||||
return fakeEntry.SharedTags
|
||||
}
|
||||
|
||||
func (manifest *Manifest2822) AddEntry(entry Manifest2822Entry) error {
|
||||
if len(entry.Tags) < 1 {
|
||||
return fmt.Errorf("missing Tags")
|
||||
|
|
@ -165,20 +208,36 @@ func (manifest *Manifest2822) AddEntry(entry Manifest2822Entry) error {
|
|||
return fmt.Errorf("Tags %q has invalid Maintainers: %q (expected format %q)", strings.Join(invalidMaintainers, ", "), MaintainersFormat)
|
||||
}
|
||||
|
||||
entry.DeduplicateSharedTags()
|
||||
|
||||
seenTag := map[string]bool{}
|
||||
for _, tag := range entry.Tags {
|
||||
if otherEntry := manifest.GetTag(tag); otherEntry != nil {
|
||||
return fmt.Errorf("Tags %q includes duplicate tag: %q (duplicated in %q)", entry.TagsString(), tag, otherEntry.TagsString())
|
||||
}
|
||||
if otherEntries := manifest.GetSharedTag(tag); len(otherEntries) > 0 {
|
||||
return fmt.Errorf("Tags %q includes tag conflicting with a shared tag: %q (shared tag in %q)", entry.TagsString(), tag, otherEntries[0].TagsString())
|
||||
}
|
||||
if seenTag[tag] {
|
||||
return fmt.Errorf("Tags %q includes duplicate tag: %q", entry.TagsString(), tag)
|
||||
}
|
||||
seenTag[tag] = true
|
||||
}
|
||||
for _, tag := range entry.SharedTags {
|
||||
if otherEntry := manifest.GetTag(tag); otherEntry != nil {
|
||||
return fmt.Errorf("Tags %q includes conflicting shared tag: %q (duplicated in %q)", entry.TagsString(), tag, otherEntry.TagsString())
|
||||
}
|
||||
if seenTag[tag] {
|
||||
return fmt.Errorf("Tags %q includes duplicate tag: %q (in SharedTags)", entry.TagsString(), tag)
|
||||
}
|
||||
seenTag[tag] = true
|
||||
}
|
||||
|
||||
for i, existingEntry := range manifest.Entries {
|
||||
if existingEntry.SameBuildArtifacts(entry) {
|
||||
manifest.Entries[i].Tags = append(existingEntry.Tags, entry.Tags...)
|
||||
manifest.Entries[i].SharedTags = append(existingEntry.SharedTags, entry.SharedTags...)
|
||||
manifest.Entries[i].DeduplicateSharedTags()
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
|
@ -210,6 +269,20 @@ func (entry Manifest2822Entry) InvalidMaintainers() []string {
|
|||
return invalid
|
||||
}
|
||||
|
||||
// DeduplicateSharedTags will remove duplicate values from entry.SharedTags, preserving order.
|
||||
func (entry *Manifest2822Entry) DeduplicateSharedTags() {
|
||||
aggregate := []string{}
|
||||
seen := map[string]bool{}
|
||||
for _, tag := range entry.SharedTags {
|
||||
if seen[tag] {
|
||||
continue
|
||||
}
|
||||
seen[tag] = true
|
||||
aggregate = append(aggregate, tag)
|
||||
}
|
||||
entry.SharedTags = aggregate
|
||||
}
|
||||
|
||||
type decoderWrapper struct {
|
||||
*control.Decoder
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue