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"])
}
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) {
dt := []byte(`
target "app" {

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

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

Loading…
Cancel
Save