Fix architecture-specific values inherited from the global entry

This commit is contained in:
Tianon Gravi 2017-06-05 15:40:37 -07:00
parent e3f0b23913
commit 51bb97f72d
4 changed files with 52 additions and 25 deletions

View File

@ -20,6 +20,9 @@ func gitCache() string {
} }
func gitCommand(args ...string) *exec.Cmd { func gitCommand(args ...string) *exec.Cmd {
if debugFlag {
fmt.Printf("$ git %q\n", args)
}
cmd := exec.Command("git", args...) cmd := exec.Command("git", args...)
cmd.Dir = gitCache() cmd.Dir = gitCache()
return cmd return cmd

View File

@ -97,6 +97,9 @@ func sortRepoObjects(rs []*Repo, applyConstraints bool) ([]*Repo, error) {
if applyConstraints && r.SkipConstraints(entry) { if applyConstraints && r.SkipConstraints(entry) {
continue continue
} }
if !entry.HasArchitecture(arch) {
continue
}
from, err := r.DockerFrom(&entry) from, err := r.DockerFrom(&entry)
if err != nil { if err != nil {

2
go/vendor/manifest vendored
View File

@ -10,7 +10,7 @@
{ {
"importpath": "github.com/docker-library/go-dockerlibrary", "importpath": "github.com/docker-library/go-dockerlibrary",
"repository": "https://github.com/docker-library/go-dockerlibrary", "repository": "https://github.com/docker-library/go-dockerlibrary",
"revision": "663a091da13fc848e27a16048fb39c4e4067056e", "revision": "ce3ef0e05c16a5202b2c3dae35ef6a832eb18d7a",
"branch": "master" "branch": "master"
}, },
{ {

View File

@ -37,7 +37,12 @@ type Manifest2822Entry struct {
GitFetch string GitFetch string
GitCommit string GitCommit string
Directory string Directory string
// architecture-specific versions of the above fields are in Paragraph.Values as ARCH-Field, ala s390x-Directory
// architecture-specific versions of the above fields
ArchValues map[string]string
// "ARCH-FIELD: VALUE"
// ala, "s390x-GitCommit: deadbeef"
// (sourced from Paragraph.Values via .SeedArchValues())
Constraints []string `delim:"," strip:"\n\r\t "` Constraints []string `delim:"," strip:"\n\r\t "`
} }
@ -53,6 +58,14 @@ var (
} }
) )
func deepCopyStringsMap(a map[string]string) map[string]string {
b := map[string]string{}
for k, v := range a {
b[k] = v
}
return b
}
func (entry Manifest2822Entry) Clone() Manifest2822Entry { func (entry Manifest2822Entry) Clone() Manifest2822Entry {
// SLICES! grr // SLICES! grr
entry.Maintainers = append([]string{}, entry.Maintainers...) entry.Maintainers = append([]string{}, entry.Maintainers...)
@ -60,9 +73,19 @@ func (entry Manifest2822Entry) Clone() Manifest2822Entry {
entry.SharedTags = append([]string{}, entry.SharedTags...) entry.SharedTags = append([]string{}, entry.SharedTags...)
entry.Architectures = append([]string{}, entry.Architectures...) entry.Architectures = append([]string{}, entry.Architectures...)
entry.Constraints = append([]string{}, entry.Constraints...) entry.Constraints = append([]string{}, entry.Constraints...)
// and MAPS, oh my
entry.ArchValues = deepCopyStringsMap(entry.ArchValues)
return entry return entry
} }
func (entry *Manifest2822Entry) SeedArchValues() {
for field, val := range entry.Paragraph.Values {
if strings.HasSuffix(field, "-GitRepo") || strings.HasSuffix(field, "-GitFetch") || strings.HasSuffix(field, "-GitCommit") || strings.HasSuffix(field, "-Directory") {
entry.ArchValues[field] = val
}
}
}
const StringSeparator2822 = ", " const StringSeparator2822 = ", "
func (entry Manifest2822Entry) MaintainersString() string { func (entry Manifest2822Entry) MaintainersString() string {
@ -89,7 +112,7 @@ func (entry Manifest2822Entry) ConstraintsString() string {
func (a Manifest2822Entry) SameBuildArtifacts(b Manifest2822Entry) bool { func (a Manifest2822Entry) SameBuildArtifacts(b Manifest2822Entry) bool {
// check xxxarch-GitRepo, etc. fields for sameness first // check xxxarch-GitRepo, etc. fields for sameness first
for _, key := range append(a.archFields(), b.archFields()...) { for _, key := range append(a.archFields(), b.archFields()...) {
if a.Paragraph.Values[key] != b.Paragraph.Values[key] { if a.ArchValues[key] != b.ArchValues[key] {
return false return false
} }
} }
@ -97,18 +120,15 @@ func (a Manifest2822Entry) SameBuildArtifacts(b Manifest2822Entry) bool {
return a.ArchitecturesString() == b.ArchitecturesString() && a.GitRepo == b.GitRepo && a.GitFetch == b.GitFetch && a.GitCommit == b.GitCommit && a.Directory == b.Directory && a.ConstraintsString() == b.ConstraintsString() return a.ArchitecturesString() == b.ArchitecturesString() && a.GitRepo == b.GitRepo && a.GitFetch == b.GitFetch && a.GitCommit == b.GitCommit && a.Directory == b.Directory && a.ConstraintsString() == b.ConstraintsString()
} }
func isArchField(field string) bool {
return strings.HasSuffix(field, "-GitRepo") || strings.HasSuffix(field, "-GitFetch") || strings.HasSuffix(field, "-GitCommit") || strings.HasSuffix(field, "-Directory")
}
// returns a list of architecture-specific fields in an Entry // returns a list of architecture-specific fields in an Entry
func (entry Manifest2822Entry) archFields() []string { func (entry Manifest2822Entry) archFields() []string {
ret := []string{} ret := []string{}
for key, val := range entry.Paragraph.Values { for key, val := range entry.ArchValues {
if isArchField(key) && val != "" { if val != "" {
ret = append(ret, key) ret = append(ret, key)
} }
} }
sort.Strings(ret)
return ret return ret
} }
@ -140,8 +160,8 @@ func (entry Manifest2822Entry) ClearDefaults(defaults Manifest2822Entry) Manifes
entry.Directory = "" entry.Directory = ""
} }
for _, key := range defaults.archFields() { for _, key := range defaults.archFields() {
if defaults.Paragraph.Values[key] == entry.Paragraph.Values[key] { if defaults.ArchValues[key] == entry.ArchValues[key] {
delete(entry.Paragraph.Values, key) delete(entry.ArchValues, key)
} }
} }
if entry.ConstraintsString() == defaults.ConstraintsString() { if entry.ConstraintsString() == defaults.ConstraintsString() {
@ -176,10 +196,8 @@ func (entry Manifest2822Entry) String() string {
if str := entry.Directory; str != "" { if str := entry.Directory; str != "" {
ret = append(ret, "Directory: "+str) ret = append(ret, "Directory: "+str)
} }
archFields := entry.archFields() for _, key := range entry.archFields() {
sort.Strings(archFields) // consistent ordering ret = append(ret, key+": "+entry.ArchValues[key])
for _, key := range archFields {
ret = append(ret, key+": "+entry.Paragraph.Values[key])
} }
if str := entry.ConstraintsString(); str != "" { if str := entry.ConstraintsString(); str != "" {
ret = append(ret, "Constraints: "+str) ret = append(ret, "Constraints: "+str)
@ -203,42 +221,42 @@ func (manifest Manifest2822) String() string {
} }
func (entry *Manifest2822Entry) SetGitRepo(arch string, repo string) { func (entry *Manifest2822Entry) SetGitRepo(arch string, repo string) {
if entry.Paragraph.Values == nil { if entry.ArchValues == nil {
entry.Paragraph.Values = map[string]string{} entry.ArchValues = map[string]string{}
} }
entry.Paragraph.Values[arch+"-GitRepo"] = repo entry.ArchValues[arch+"-GitRepo"] = repo
} }
func (entry Manifest2822Entry) ArchGitRepo(arch string) string { func (entry Manifest2822Entry) ArchGitRepo(arch string) string {
if val, ok := entry.Paragraph.Values[arch+"-GitRepo"]; ok && val != "" { if val, ok := entry.ArchValues[arch+"-GitRepo"]; ok && val != "" {
return val return val
} }
return entry.GitRepo return entry.GitRepo
} }
func (entry Manifest2822Entry) ArchGitFetch(arch string) string { func (entry Manifest2822Entry) ArchGitFetch(arch string) string {
if val, ok := entry.Paragraph.Values[arch+"-GitFetch"]; ok && val != "" { if val, ok := entry.ArchValues[arch+"-GitFetch"]; ok && val != "" {
return val return val
} }
return entry.GitFetch return entry.GitFetch
} }
func (entry *Manifest2822Entry) SetGitCommit(arch string, commit string) { func (entry *Manifest2822Entry) SetGitCommit(arch string, commit string) {
if entry.Paragraph.Values == nil { if entry.ArchValues == nil {
entry.Paragraph.Values = map[string]string{} entry.ArchValues = map[string]string{}
} }
entry.Paragraph.Values[arch+"-GitCommit"] = commit entry.ArchValues[arch+"-GitCommit"] = commit
} }
func (entry Manifest2822Entry) ArchGitCommit(arch string) string { func (entry Manifest2822Entry) ArchGitCommit(arch string) string {
if val, ok := entry.Paragraph.Values[arch+"-GitCommit"]; ok && val != "" { if val, ok := entry.ArchValues[arch+"-GitCommit"]; ok && val != "" {
return val return val
} }
return entry.GitCommit return entry.GitCommit
} }
func (entry Manifest2822Entry) ArchDirectory(arch string) string { func (entry Manifest2822Entry) ArchDirectory(arch string) string {
if val, ok := entry.Paragraph.Values[arch+"-Directory"]; ok && val != "" { if val, ok := entry.ArchValues[arch+"-Directory"]; ok && val != "" {
return val return val
} }
return entry.Directory return entry.Directory
@ -454,6 +472,9 @@ func (decoder *decoderWrapper) Decode(entry *Manifest2822Entry) error {
entry.Architectures = arches entry.Architectures = arches
} }
// pull out any new architecture-specific values from Paragraph.Values
entry.SeedArchValues()
return nil return nil
} }
} }