bake: set attribute even if diagnosed as duplicated

Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
pull/1062/head
CrazyMax 3 years ago
parent f7d7c71f82
commit fafb234e95
No known key found for this signature in database
GPG Key ID: 3248E46B6BB8C7F7

@ -634,6 +634,29 @@ func TestHCLMultiFileAttrs(t *testing.T) {
require.Equal(t, ptrstr("pre-ghi"), c.Targets[0].Args["v1"]) require.Equal(t, ptrstr("pre-ghi"), c.Targets[0].Args["v1"])
} }
func TestHCLMultiFileGlobalAttrs(t *testing.T) {
dt := []byte(`
FOO = "abc"
target "app" {
args = {
v1 = "pre-${FOO}"
}
}
`)
dt2 := []byte(`
FOO = "def"
`)
c, err := ParseFiles([]File{
{Data: dt, Name: "c1.hcl"},
{Data: dt2, Name: "c2.hcl"},
}, nil)
require.NoError(t, err)
require.Equal(t, 1, len(c.Targets))
require.Equal(t, c.Targets[0].Name, "app")
require.Equal(t, "pre-def", *c.Targets[0].Args["v1"])
}
func TestHCLDuplicateTarget(t *testing.T) { func TestHCLDuplicateTarget(t *testing.T) {
dt := []byte(` dt := []byte(`
target "app" { target "app" {

@ -613,7 +613,7 @@ func Parse(b hcl.Body, opt Opt, val interface{}) (map[string]map[string][]string
attrs, diags := b.JustAttributes() attrs, diags := b.JustAttributes()
if diags.HasErrors() { if diags.HasErrors() {
if d := removeAttributesDiags(diags, reserved, p.vars); len(d) > 0 { if d := removeAttributesDiags(diags, reserved, p.vars, attrs); len(d) > 0 {
return nil, d return nil, d
} }
} }
@ -854,27 +854,50 @@ func getNameIndex(v reflect.Value) (int, bool) {
return 0, false return 0, false
} }
func removeAttributesDiags(diags hcl.Diagnostics, reserved map[string]struct{}, vars map[string]*variable) hcl.Diagnostics { func removeAttributesDiags(diags hcl.Diagnostics, reserved map[string]struct{}, vars map[string]*variable, attrs hcl.Attributes) hcl.Diagnostics {
var fdiags hcl.Diagnostics var fdiags hcl.Diagnostics
alreadySetArg := func(detail string, keys []string) bool {
for _, k := range keys {
if strings.HasPrefix(detail, fmt.Sprintf(`Argument %q was already set at `, k)) {
return true
}
}
return false
}
var reservedKeys []string
for k := range reserved {
reservedKeys = append(reservedKeys, k)
}
var varsKeys []string
for k := range vars {
varsKeys = append(varsKeys, k)
}
var attrsKeys []string
for k := range attrs {
attrsKeys = append(attrsKeys, k)
}
for _, d := range diags { for _, d := range diags {
if fout := func(d *hcl.Diagnostic) bool { if fout := func(d *hcl.Diagnostic) bool {
// https://github.com/docker/buildx/pull/541 // https://github.com/docker/buildx/pull/541
if d.Detail == "Blocks are not allowed here." { if d.Detail == "Blocks are not allowed here." {
return true return true
} }
for r := range reserved {
// JSON body objects don't handle repeated blocks like HCL but // JSON body objects don't handle repeated blocks like HCL but
// reserved name attributes should be allowed when multi bodies are merged. // reserved name attributes should be allowed when multi bodies are merged.
// https://github.com/hashicorp/hcl/blob/main/json/spec.md#blocks // https://github.com/hashicorp/hcl/blob/main/json/spec.md#blocks
if strings.HasPrefix(d.Detail, fmt.Sprintf(`Argument "%s" was already set at `, r)) { if alreadySetArg(d.Detail, reservedKeys) {
return true return true
} }
}
for v := range vars {
// Do the same for global variables // Do the same for global variables
if strings.HasPrefix(d.Detail, fmt.Sprintf(`Argument "%s" was already set at `, v)) { if alreadySetArg(d.Detail, varsKeys) {
return true return true
} }
// Do the same for attributes
if alreadySetArg(d.Detail, attrsKeys) {
return true
} }
return false return false
}(d); !fout { }(d); !fout {

@ -123,7 +123,6 @@ func (mb mergedBodies) JustAttributes() (hcl.Attributes, hcl.Diagnostics) {
), ),
Subject: &attr.NameRange, Subject: &attr.NameRange,
}) })
continue
} }
attrs[name] = attr attrs[name] = attr

Loading…
Cancel
Save