mirror of
				https://gitea.com/Lydanne/buildx.git
				synced 2025-11-01 00:23:56 +08:00 
			
		
		
		
	bake: merge vars from multiple JSON files
Signed-off-by: CrazyMax <crazy-max@users.noreply.github.com>
This commit is contained in:
		| @@ -621,7 +621,7 @@ func TestHCLBuiltinVars(t *testing.T) { | ||||
| 	require.Equal(t, "test", *c.Targets[0].Dockerfile) | ||||
| } | ||||
|  | ||||
| func TestCombineHCLAndJSON(t *testing.T) { | ||||
| func TestCombineHCLAndJSONTargets(t *testing.T) { | ||||
| 	c, err := ParseFiles([]File{ | ||||
| 		{ | ||||
| 			Name: "docker-bake.hcl", | ||||
| @@ -696,3 +696,52 @@ target "b" { | ||||
| 	require.Equal(t, ".", *c.Targets[3].Context) | ||||
| 	require.Equal(t, "b", *c.Targets[3].Target) | ||||
| } | ||||
|  | ||||
| func TestCombineHCLAndJSONVars(t *testing.T) { | ||||
| 	c, err := ParseFiles([]File{ | ||||
| 		{ | ||||
| 			Name: "docker-bake.hcl", | ||||
| 			Data: []byte(` | ||||
| variable "ABC" { | ||||
|   default = "foo" | ||||
| } | ||||
| variable "DEF" { | ||||
|   default = "" | ||||
| } | ||||
| group "default" { | ||||
|   targets = ["one"] | ||||
| } | ||||
| target "one" { | ||||
|   args = { | ||||
|     a = "pre-${ABC}" | ||||
|   } | ||||
| } | ||||
| target "two" { | ||||
|   args = { | ||||
|     b = "pre-${DEF}" | ||||
|   } | ||||
| }`), | ||||
| 		}, | ||||
| 		{ | ||||
| 			Name: "foo.json", | ||||
| 			Data: []byte(`{"variable": {"DEF": {"default": "bar"}}, "target": { "one": { "args": {"a": "pre-${ABC}-${DEF}"}} } }`), | ||||
| 		}, | ||||
| 		{ | ||||
| 			Name: "bar.json", | ||||
| 			Data: []byte(`{"ABC": "ghi", "DEF": "jkl"}`), | ||||
| 		}, | ||||
| 	}, nil) | ||||
| 	require.NoError(t, err) | ||||
|  | ||||
| 	require.Equal(t, 1, len(c.Groups)) | ||||
| 	require.Equal(t, "default", c.Groups[0].Name) | ||||
| 	require.Equal(t, []string{"one"}, c.Groups[0].Targets) | ||||
|  | ||||
| 	require.Equal(t, 2, len(c.Targets)) | ||||
|  | ||||
| 	require.Equal(t, c.Targets[0].Name, "one") | ||||
| 	require.Equal(t, map[string]string{"a": "pre-ghi-jkl"}, c.Targets[0].Args) | ||||
|  | ||||
| 	require.Equal(t, c.Targets[1].Name, "two") | ||||
| 	require.Equal(t, map[string]string{"b": "pre-jkl"}, c.Targets[1].Args) | ||||
| } | ||||
|   | ||||
| @@ -302,7 +302,7 @@ func Parse(b hcl.Body, opt Opt, val interface{}) hcl.Diagnostics { | ||||
|  | ||||
| 	attrs, diags := b.JustAttributes() | ||||
| 	if diags.HasErrors() { | ||||
| 		if d := removeAttributesDiags(diags, reserved); len(d) > 0 { | ||||
| 		if d := removeAttributesDiags(diags, reserved, p.vars); len(d) > 0 { | ||||
| 			return d | ||||
| 		} | ||||
| 	} | ||||
| @@ -513,7 +513,7 @@ func setLabel(v reflect.Value, lbl string) int { | ||||
| 	return -1 | ||||
| } | ||||
|  | ||||
| func removeAttributesDiags(diags hcl.Diagnostics, reserved map[string]struct{}) hcl.Diagnostics { | ||||
| func removeAttributesDiags(diags hcl.Diagnostics, reserved map[string]struct{}, vars map[string]*variable) hcl.Diagnostics { | ||||
| 	var fdiags hcl.Diagnostics | ||||
| 	for _, d := range diags { | ||||
| 		if fout := func(d *hcl.Diagnostic) bool { | ||||
| @@ -529,6 +529,12 @@ func removeAttributesDiags(diags hcl.Diagnostics, reserved map[string]struct{}) | ||||
| 					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 | ||||
| 				} | ||||
| 			} | ||||
| 			return false | ||||
| 		}(d); !fout { | ||||
| 			fdiags = append(fdiags, d) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 CrazyMax
					CrazyMax