mirror of
https://gitea.com/Lydanne/buildx.git
synced 2025-05-18 17:37:46 +08:00
Merge pull request #783 from tonistiigi/override-merge
bake: restore previous override merge behavior
This commit is contained in:
commit
dff7673afb
56
bake/bake.go
56
bake/bake.go
@ -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 {
|
||||||
|
t = map[string]Override{}
|
||||||
|
m[name] = t
|
||||||
|
}
|
||||||
|
|
||||||
o := Override{
|
o := t[kk[1]]
|
||||||
Key: kk[1],
|
|
||||||
}
|
|
||||||
if len(parts) == 2 {
|
|
||||||
o.Value = parts[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…
x
Reference in New Issue
Block a user