Skip to content

Commit 6177765

Browse files
author
utam0k
committed
Ensure that EnvVarCombineMergeUnique keeps order.
1 parent 7a3bd09 commit 6177765

File tree

2 files changed

+97
-6
lines changed

2 files changed

+97
-6
lines changed

pkg/dazzle/combiner.go

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -311,14 +311,25 @@ func mergeEnv(base *ociv1.Image, others []*ociv1.Image, vars []EnvVarCombination
311311
case EnvVarCombineMerge:
312312
envs[k] += ":" + v
313313
case EnvVarCombineMergeUnique:
314-
vs := make(map[string]struct{})
314+
var vs []string
315315
for _, s := range strings.Split(envValue, ":") {
316-
vs[s] = struct{}{}
316+
vs = append(vs, s)
317317
}
318-
vs[v] = struct{}{}
319-
vss := make([]string, 0, len(vs))
320-
for s := range vs {
321-
vss = append(vss, s)
318+
for _, s := range strings.Split(v, ":") {
319+
vs = append(vs, s)
320+
}
321+
322+
vss := []string{}
323+
flags := make(map[string]bool)
324+
for i := len(vs) - 1; i >= 0; i-- {
325+
entry := vs[i]
326+
if _, value := flags[entry]; !value {
327+
flags[entry] = true
328+
vss = append(vss, entry)
329+
}
330+
}
331+
for i, j := 0, len(vss)-1; i < j; i, j = i+1, j-1 {
332+
vss[i], vss[j] = vss[j], vss[i]
322333
}
323334
envs[k] = strings.Join(vss, ":")
324335
}

pkg/dazzle/combiner_test.go

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
// Copyright © 2020 Gitpod
2+
3+
// Permission is hereby granted, free of charge, to any person obtaining a copy
4+
// of this software and associated documentation files (the "Software"), to deal
5+
// in the Software without restriction, including without limitation the rights
6+
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7+
// copies of the Software, and to permit persons to whom the Software is
8+
// furnished to do so, subject to the following conditions:
9+
10+
// The above copyright notice and this permission notice shall be included in
11+
// all copies or substantial portions of the Software.
12+
13+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14+
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15+
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16+
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17+
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18+
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19+
// THE SOFTWARE.
20+
21+
package dazzle
22+
23+
import (
24+
"testing"
25+
26+
ociv1 "github.com/opencontainers/image-spec/specs-go/v1"
27+
)
28+
29+
func TestMergeEnv(t *testing.T) {
30+
base := ociv1.Image{
31+
Config: ociv1.ImageConfig{
32+
Env: []string{
33+
"PATH=first:second:third:$PATH",
34+
},
35+
},
36+
}
37+
others := []*ociv1.Image{
38+
{
39+
Config: ociv1.ImageConfig{
40+
Env: []string{
41+
"PATH=fourth:fifth:$PATH",
42+
},
43+
},
44+
},
45+
{
46+
Config: ociv1.ImageConfig{
47+
Env: []string{
48+
"PATH=sixth:sixth:$PATH",
49+
},
50+
},
51+
},
52+
{
53+
Config: ociv1.ImageConfig{
54+
Env: []string{
55+
"PATH=eighth:seventh:eighth:$PATH",
56+
},
57+
},
58+
},
59+
}
60+
vars := []EnvVarCombination{
61+
{
62+
Name: "PATH",
63+
Action: EnvVarCombineMergeUnique,
64+
},
65+
}
66+
envs, err := mergeEnv(&base, others, vars)
67+
if err != nil {
68+
t.Fatal(err)
69+
}
70+
expect := []string{"PATH=first:second:third:fourth:fifth:sixth:seventh:eighth:$PATH"}
71+
if len(envs) != len(expect) {
72+
t.Fatal("unexpected length", len(envs))
73+
}
74+
for i, env := range envs {
75+
if env != expect[i] {
76+
t.Fatal("unexpected env", envs)
77+
}
78+
79+
}
80+
}

0 commit comments

Comments
 (0)