Skip to content

Commit 3090527

Browse files
committed
fix build.args merge issue when defined with a list
Signed-off-by: Guillaume Lours <[email protected]>
1 parent 0e8d665 commit 3090527

File tree

3 files changed

+137
-5
lines changed

3 files changed

+137
-5
lines changed

override/merge.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,14 +39,15 @@ type merger func(any, any, tree.Path) (any, error)
3939
var mergeSpecials = map[tree.Path]merger{}
4040

4141
func init() {
42+
mergeSpecials["services.*.build.args"] = mergeToSequence
4243
mergeSpecials["services.*.build"] = mergeBuild
4344
mergeSpecials["services.*.depends_on"] = mergeDependsOn
4445
mergeSpecials["services.*.logging"] = mergeLogging
4546
mergeSpecials["services.*.networks"] = mergeNetworks
4647
mergeSpecials["services.*.command"] = override
4748
mergeSpecials["services.*.entrypoint"] = override
4849
mergeSpecials["services.*.healthcheck.test"] = override
49-
mergeSpecials["services.*.environment"] = mergeEnvironment
50+
mergeSpecials["services.*.environment"] = mergeToSequence
5051
mergeSpecials["services.*.ulimits.*"] = mergeUlimit
5152
}
5253

@@ -142,8 +143,7 @@ func mergeNetworks(c any, o any, path tree.Path) (any, error) {
142143
return mergeMappings(right, left, path)
143144
}
144145

145-
// environment must be first converted into yaml sequence syntax so we can append
146-
func mergeEnvironment(c any, o any, _ tree.Path) (any, error) {
146+
func mergeToSequence(c any, o any, _ tree.Path) (any, error) {
147147
right := convertIntoSequence(c)
148148
left := convertIntoSequence(o)
149149
return append(right, left...), nil

override/merge_args_test.go

Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
/*
2+
Copyright 2020 The Compose Specification Authors.
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
package override
18+
19+
import (
20+
"testing"
21+
)
22+
23+
func Test_mergeYamlArgsSequence(t *testing.T) {
24+
assertMergeYaml(t, `
25+
services:
26+
test:
27+
build:
28+
context: .
29+
args:
30+
- FOO=BAR
31+
`, `
32+
services:
33+
test:
34+
build:
35+
context: .
36+
args:
37+
- GIT_COMMIT=cdc3b19
38+
- EMPTY=
39+
- NIL
40+
`, `
41+
services:
42+
test:
43+
build:
44+
context: .
45+
args:
46+
- FOO=BAR
47+
- GIT_COMMIT=cdc3b19
48+
- EMPTY=
49+
- NIL
50+
`)
51+
}
52+
53+
func Test_mergeYamlArgsMapping(t *testing.T) {
54+
assertMergeYaml(t, `
55+
services:
56+
test:
57+
build:
58+
context: .
59+
args:
60+
FOO: BAR
61+
`, `
62+
services:
63+
test:
64+
build:
65+
context: .
66+
args:
67+
EMPTY: ""
68+
NIL: null
69+
QIX: ZOT
70+
`, `
71+
services:
72+
test:
73+
build:
74+
context: .
75+
args:
76+
- FOO=BAR
77+
- EMPTY=
78+
- NIL
79+
- QIX=ZOT
80+
`)
81+
}
82+
83+
func Test_mergeYamlArgsMixed(t *testing.T) {
84+
assertMergeYaml(t, `
85+
services:
86+
test:
87+
build:
88+
context: .
89+
args:
90+
FOO: BAR
91+
`, `
92+
services:
93+
test:
94+
build:
95+
args:
96+
- QIX=ZOT
97+
`, `
98+
services:
99+
test:
100+
build:
101+
context: .
102+
args:
103+
- FOO=BAR
104+
- QIX=ZOT
105+
`)
106+
}
107+
108+
func Test_mergeYamlArgsNumber(t *testing.T) {
109+
assertMergeYaml(t, `
110+
services:
111+
test:
112+
build:
113+
context: .
114+
args:
115+
FOO: 1
116+
`, `
117+
services:
118+
test:
119+
build:
120+
context: .
121+
args:
122+
FOO: 3
123+
`, `
124+
services:
125+
test:
126+
build:
127+
context: .
128+
args:
129+
- FOO=3
130+
`)
131+
}

override/uncity.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ type indexer func(any, tree.Path) (string, error)
3131
var unique = map[tree.Path]indexer{}
3232

3333
func init() {
34-
unique["services.*.environment"] = environmentIndexer
34+
unique["services.*.environment"] = keyValueIndexer
35+
unique["services.*.build.args"] = keyValueIndexer
3536
unique["services.*.volumes"] = volumeIndexer
3637
unique["services.*.expose"] = exposeIndexer
3738
unique["services.*.secrets"] = mountIndexer("/run/secrets")
@@ -83,7 +84,7 @@ func enforceUnicity(value any, p tree.Path) (any, error) {
8384
return value, nil
8485
}
8586

86-
func environmentIndexer(y any, _ tree.Path) (string, error) {
87+
func keyValueIndexer(y any, _ tree.Path) (string, error) {
8788
value := y.(string)
8889
key, _, found := strings.Cut(value, "=")
8990
if !found {

0 commit comments

Comments
 (0)