Merge pull request #783 from tonistiigi/override-merge

bake: restore previous override merge behavior
pull/791/head
Tõnis Tiigi 4 years ago committed by GitHub
commit dff7673afb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -31,8 +31,8 @@ type File struct {
} }
type Override struct { type Override struct {
Key string Value string
Value string ArrValue []string
} }
func defaultFilenames() []string { func defaultFilenames() []string {
@ -246,8 +246,8 @@ func (c Config) expandTargets(pattern string) ([]string, error) {
return names, nil return names, nil
} }
func (c Config) newOverrides(v []string) (map[string][]Override, error) { func (c Config) newOverrides(v []string) (map[string]map[string]Override, error) {
m := map[string][]Override{} m := map[string]map[string]Override{}
for _, v := range v { for _, v := range v {
parts := strings.SplitN(v, "=", 2) parts := strings.SplitN(v, "=", 2)
@ -269,16 +269,19 @@ func (c Config) newOverrides(v []string) (map[string][]Override, error) {
kk := strings.SplitN(parts[0], ".", 2) kk := strings.SplitN(parts[0], ".", 2)
for _, name := range names { for _, name := range names {
t := m[name] t, ok := m[name]
if !ok {
o := Override{ t = map[string]Override{}
Key: kk[1], m[name] = t
}
if len(parts) == 2 {
o.Value = parts[1]
} }
o := t[kk[1]]
switch keys[1] { switch keys[1] {
case "output", "cache-to", "cache-from", "tags", "platform", "secrets", "ssh":
if len(parts) == 2 {
o.ArrValue = append(o.ArrValue, parts[1])
}
case "args": case "args":
if len(keys) != 3 { if len(keys) != 3 {
return nil, errors.Errorf("invalid key %s, args requires name", parts[0]) return nil, errors.Errorf("invalid key %s, args requires name", parts[0])
@ -290,11 +293,14 @@ func (c Config) newOverrides(v []string) (map[string][]Override, error) {
} }
o.Value = v o.Value = v
} }
fallthrough
default:
if len(parts) == 2 {
o.Value = parts[1]
}
} }
t = append(t, o) t[kk[1]] = o
m[name] = t
} }
} }
return m, nil return m, nil
@ -326,7 +332,7 @@ func (c Config) group(name string, visited map[string]struct{}) []string {
return targets return targets
} }
func (c Config) ResolveTarget(name string, overrides map[string][]Override) (*Target, error) { func (c Config) ResolveTarget(name string, overrides map[string]map[string]Override) (*Target, error) {
t, err := c.target(name, map[string]struct{}{}, overrides) t, err := c.target(name, map[string]struct{}{}, overrides)
if err != nil { if err != nil {
return nil, err return nil, err
@ -342,7 +348,7 @@ func (c Config) ResolveTarget(name string, overrides map[string][]Override) (*Ta
return t, nil return t, nil
} }
func (c Config) target(name string, visited map[string]struct{}, overrides map[string][]Override) (*Target, error) { func (c Config) target(name string, visited map[string]struct{}, overrides map[string]map[string]Override) (*Target, error) {
if _, ok := visited[name]; ok { if _, ok := visited[name]; ok {
return nil, nil return nil, nil
} }
@ -476,10 +482,10 @@ func (t *Target) Merge(t2 *Target) {
t.Inherits = append(t.Inherits, t2.Inherits...) t.Inherits = append(t.Inherits, t2.Inherits...)
} }
func (t *Target) AddOverrides(overrides []Override) error { func (t *Target) AddOverrides(overrides map[string]Override) error {
for _, o := range overrides { for key, o := range overrides {
value := o.Value value := o.Value
keys := strings.SplitN(o.Key, ".", 2) keys := strings.SplitN(key, ".", 2)
switch keys[0] { switch keys[0] {
case "context": case "context":
t.Context = &value t.Context = &value
@ -503,21 +509,21 @@ func (t *Target) AddOverrides(overrides []Override) error {
} }
t.Labels[keys[1]] = value t.Labels[keys[1]] = value
case "tags": case "tags":
t.Tags = append(t.Tags, value) t.Tags = o.ArrValue
case "cache-from": case "cache-from":
t.CacheFrom = append(t.CacheFrom, value) t.CacheFrom = o.ArrValue
case "cache-to": case "cache-to":
t.CacheTo = append(t.CacheTo, value) t.CacheTo = o.ArrValue
case "target": case "target":
t.Target = &value t.Target = &value
case "secrets": case "secrets":
t.Secrets = append(t.Secrets, value) t.Secrets = o.ArrValue
case "ssh": case "ssh":
t.SSH = append(t.SSH, value) t.SSH = o.ArrValue
case "platform": case "platform":
t.Platforms = append(t.Platforms, value) t.Platforms = o.ArrValue
case "output": case "output":
t.Outputs = append(t.Outputs, value) t.Outputs = o.ArrValue
case "no-cache": case "no-cache":
noCache, err := strconv.ParseBool(value) noCache, err := strconv.ParseBool(value)
if err != nil { if err != nil {

@ -274,7 +274,7 @@ services:
func TestHCLCwdPrefix(t *testing.T) { func TestHCLCwdPrefix(t *testing.T) {
fp := File{ fp := File{
Name: "docker-bake.hc", Name: "docker-bake.hcl",
Data: []byte( Data: []byte(
`target "app" { `target "app" {
context = "cwd://foo" context = "cwd://foo"
@ -295,3 +295,32 @@ func TestHCLCwdPrefix(t *testing.T) {
require.Equal(t, "test", *m["app"].Dockerfile) require.Equal(t, "test", *m["app"].Dockerfile)
require.Equal(t, "foo", *m["app"].Context) require.Equal(t, "foo", *m["app"].Context)
} }
func TestOverrideMerge(t *testing.T) {
fp := File{
Name: "docker-bake.hcl",
Data: []byte(
`target "app" {
platforms = ["linux/amd64"]
output = ["foo"]
}`),
}
ctx := context.TODO()
m, _, err := ReadTargets(ctx, []File{fp}, []string{"app"}, []string{
"app.platform=linux/arm",
"app.platform=linux/ppc64le",
"app.output=type=registry",
}, nil)
require.NoError(t, err)
require.Equal(t, 1, len(m))
_, ok := m["app"]
require.True(t, ok)
_, err = TargetsToBuildOpt(m, &Input{})
require.NoError(t, err)
require.Equal(t, []string{"linux/arm", "linux/ppc64le"}, m["app"].Platforms)
require.Equal(t, 1, len(m["app"].Outputs))
require.Equal(t, "type=registry", m["app"].Outputs[0])
}

Loading…
Cancel
Save