Skip to content

Commit 98c91ca

Browse files
authored
Merge pull request #2081 from FabianKramm/master
fix: ! exclude file & variable patches
2 parents 5af7964 + c970067 commit 98c91ca

4 files changed

Lines changed: 118 additions & 11 deletions

File tree

e2e/tests/config/config.go

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,28 @@ var _ = DevSpaceDescribe("config", func() {
5656
framework.ExpectEqual(config.Config().Dev["sync-0"].Terminal.Command, "test")
5757
})
5858

59+
ginkgo.It("should patch correctly", func() {
60+
tempDir, err := framework.CopyToTempDir("tests/config/testdata/profile-patches")
61+
framework.ExpectNoError(err)
62+
defer framework.CleanupTempDir(initialDir, tempDir)
63+
64+
// reload it
65+
config, _, err := framework.LoadConfigWithOptions(f, kubeClient.Client(), "var-patch.yaml", &loader.ConfigOptions{})
66+
framework.ExpectNoError(err)
67+
68+
framework.ExpectEqual(len(config.Config().Images), 1)
69+
framework.ExpectEqual(config.Config().Images["test"].Image, "sample")
70+
framework.ExpectEqual(config.Config().Images["test"].Kaniko.Labels, map[string]string{"app": "sample"})
71+
72+
// with profile
73+
config, _, err = framework.LoadConfigWithOptions(f, kubeClient.Client(), "var-patch.yaml", &loader.ConfigOptions{Profiles: []string{"alt"}})
74+
framework.ExpectNoError(err)
75+
76+
framework.ExpectEqual(len(config.Config().Images), 1)
77+
framework.ExpectEqual(config.Config().Images["test"].Image, "sample-alt")
78+
framework.ExpectEqual(config.Config().Images["test"].Kaniko.Labels, map[string]string{"app": "sample-alt"})
79+
})
80+
5981
ginkgo.It("should resolve runtime environment variables correctly", func() {
6082
tempDir, err := framework.CopyToTempDir("tests/config/testdata/runtime-variables")
6183
framework.ExpectNoError(err)
@@ -1737,8 +1759,7 @@ var _ = DevSpaceDescribe("config", func() {
17371759
framework.ExpectNoError(err)
17381760

17391761
// check if variables were loaded correctly
1740-
fmt.Println(config.Variables())
1741-
framework.ExpectEqual(len(config.Variables()), 4+len(variable.AlwaysResolvePredefinedVars))
1762+
framework.ExpectEqual(len(config.Variables()), 3+len(variable.AlwaysResolvePredefinedVars))
17421763
framework.ExpectEqual(len(config.LocalCache().ListVars()), 1)
17431764
test1, _ := config.LocalCache().GetVar("TEST_1")
17441765
framework.ExpectEqual(test1, "test")
@@ -1767,7 +1788,7 @@ var _ = DevSpaceDescribe("config", func() {
17671788
framework.ExpectNoError(err)
17681789

17691790
// config
1770-
framework.ExpectEqual(len(config.Variables()), 4+len(variable.AlwaysResolvePredefinedVars))
1791+
framework.ExpectEqual(len(config.Variables()), 3+len(variable.AlwaysResolvePredefinedVars))
17711792
framework.ExpectEqual(len(config.LocalCache().ListVars()), 2)
17721793
notUsed, _ = config.LocalCache().GetVar("NOT_USED2")
17731794
framework.ExpectEqual(notUsed, "test")
@@ -1792,7 +1813,7 @@ var _ = DevSpaceDescribe("config", func() {
17921813
framework.ExpectNoError(err)
17931814

17941815
// check if default config variables were loaded correctly
1795-
framework.ExpectEqual(len(config.Variables()), 3+len(variable.AlwaysResolvePredefinedVars))
1816+
framework.ExpectEqual(len(config.Variables()), 2+len(variable.AlwaysResolvePredefinedVars))
17961817
framework.ExpectEqual(len(config.LocalCache().ListVars()), 1)
17971818
value, _ := config.LocalCache().GetVar("NAME")
17981819
framework.ExpectEqual(value, "default")
@@ -1808,7 +1829,7 @@ var _ = DevSpaceDescribe("config", func() {
18081829
framework.ExpectNoError(err)
18091830

18101831
// check if custom config variables were loaded correctly
1811-
framework.ExpectEqual(len(customConfig.Variables()), 3+len(variable.AlwaysResolvePredefinedVars))
1832+
framework.ExpectEqual(len(customConfig.Variables()), 2+len(variable.AlwaysResolvePredefinedVars))
18121833
framework.ExpectEqual(len(customConfig.LocalCache().ListVars()), 1)
18131834
value, _ = customConfig.LocalCache().GetVar("NAME")
18141835
framework.ExpectEqual(value, "custom")
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
version: v1beta11
2+
3+
vars:
4+
- name: LABELS
5+
value:
6+
app: sample
7+
- name: BIN
8+
value: sample
9+
10+
images:
11+
test:
12+
image: ${BIN}
13+
build:
14+
kaniko:
15+
labels: ${LABELS}
16+
17+
profiles:
18+
- name: alt
19+
patches:
20+
- op: replace
21+
path: vars.name=LABELS.value
22+
value:
23+
app: sample-alt
24+
- op: replace
25+
path: vars.name=BIN.value
26+
value: sample-alt

pkg/devspace/config/loader/variable/resolver.go

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ func (r *resolver) replaceString(ctx context.Context, str string) (interface{},
115115
})
116116
}
117117

118-
func (r *resolver) FindVariables(haystack interface{}) ([]*latest.Variable, error) {
118+
func (r *resolver) findVariablesInclude(haystack interface{}, include []*regexp.Regexp) ([]*latest.Variable, error) {
119119
// find out what vars are really used
120120
varsUsed := map[string]bool{}
121121
switch t := haystack.(type) {
@@ -125,7 +125,11 @@ func (r *resolver) FindVariables(haystack interface{}) ([]*latest.Variable, erro
125125
return "", nil
126126
})
127127
case map[string]interface{}:
128-
err := walk.Walk(t, varMatchFn, func(_, value string) (interface{}, error) {
128+
err := walk.Walk(t, varMatchFn, func(path, value string) (interface{}, error) {
129+
if expression.ExcludedPath(path, nil, include) {
130+
return value, nil
131+
}
132+
129133
_, _ = varspkg.ParseString(value, func(v string) (interface{}, error) {
130134
varsUsed[v] = true
131135
return "", nil
@@ -140,7 +144,7 @@ func (r *resolver) FindVariables(haystack interface{}) ([]*latest.Variable, erro
140144

141145
// add always resolve variables
142146
for _, v := range r.vars {
143-
if v.AlwaysResolve || v.Value != nil {
147+
if v.AlwaysResolve {
144148
varsUsed[v.Name] = true
145149
}
146150
}
@@ -155,6 +159,10 @@ func (r *resolver) FindVariables(haystack interface{}) ([]*latest.Variable, erro
155159
return r.orderVariables(varsUsed)
156160
}
157161

162+
func (r *resolver) FindVariables(haystack interface{}) ([]*latest.Variable, error) {
163+
return r.findVariablesInclude(haystack, nil)
164+
}
165+
158166
func (r *resolver) orderVariables(vars map[string]bool) ([]*latest.Variable, error) {
159167
root := graph.NewNode("root", nil)
160168
g := graph.NewGraphOf(root, "variable")
@@ -296,7 +304,7 @@ func (r *resolver) FillVariables(ctx context.Context, haystack interface{}) (int
296304
}
297305

298306
func (r *resolver) findAndFillVariables(ctx context.Context, haystack interface{}, exclude, include []*regexp.Regexp) (interface{}, error) {
299-
varsUsed, err := r.FindVariables(haystack)
307+
varsUsed, err := r.findVariablesInclude(haystack, include)
300308
if err != nil {
301309
return nil, err
302310
}

pkg/devspace/services/sync/controller.go

Lines changed: 54 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package sync
22

33
import (
4+
"bufio"
45
"bytes"
56
"context"
67
"fmt"
@@ -26,7 +27,6 @@ import (
2627
"github.com/loft-sh/devspace/pkg/devspace/sync"
2728
logpkg "github.com/loft-sh/devspace/pkg/util/log"
2829
"github.com/loft-sh/devspace/pkg/util/scanner"
29-
"github.com/moby/buildkit/frontend/dockerfile/dockerignore"
3030
"github.com/pkg/errors"
3131
v1 "k8s.io/api/core/v1"
3232
)
@@ -541,14 +541,66 @@ func parseExcludeFile(path string) ([]string, error) {
541541
}
542542
defer reader.Close()
543543

544-
paths, err := dockerignore.ReadAll(reader)
544+
paths, err := readAll(reader)
545545
if err != nil {
546546
return nil, errors.Wrap(err, "read exclude file")
547547
}
548548

549549
return paths, nil
550550
}
551551

552+
// Taken from Dockerignore
553+
// ReadAll reads a .dockerignore file and returns the list of file patterns
554+
// to ignore. Note this will trim whitespace from each line as well
555+
// as use GO's "clean" func to get the shortest/cleanest path for each.
556+
func readAll(reader io.Reader) ([]string, error) {
557+
if reader == nil {
558+
return nil, nil
559+
}
560+
561+
scanner := bufio.NewScanner(reader)
562+
var excludes []string
563+
currentLine := 0
564+
565+
utf8bom := []byte{0xEF, 0xBB, 0xBF}
566+
for scanner.Scan() {
567+
scannedBytes := scanner.Bytes()
568+
// We trim UTF8 BOM
569+
if currentLine == 0 {
570+
scannedBytes = bytes.TrimPrefix(scannedBytes, utf8bom)
571+
}
572+
pattern := string(scannedBytes)
573+
currentLine++
574+
// Lines starting with # (comments) are ignored before processing
575+
if strings.HasPrefix(pattern, "#") {
576+
continue
577+
}
578+
pattern = strings.TrimSpace(pattern)
579+
if pattern == "" {
580+
continue
581+
}
582+
// normalize absolute paths to paths relative to the context
583+
// (taking care of '!' prefix)
584+
invert := pattern[0] == '!'
585+
if invert {
586+
pattern = strings.TrimSpace(pattern[1:])
587+
}
588+
if len(pattern) > 0 {
589+
pattern = filepath.Clean(pattern)
590+
pattern = filepath.ToSlash(pattern)
591+
}
592+
if invert {
593+
pattern = "!" + pattern
594+
}
595+
596+
excludes = append(excludes, pattern)
597+
}
598+
if err := scanner.Err(); err != nil {
599+
return nil, fmt.Errorf("error reading .dockerignore: %v", err)
600+
}
601+
return excludes, nil
602+
}
603+
552604
func StartStream(ctx context.Context, client kubectl.Client, pod *v1.Pod, container string, command []string, reader io.Reader, stdoutWriter io.Writer, buffer bool, log logpkg.Logger) error {
553605
stderrBuffer := &bytes.Buffer{}
554606
stderrReader, stderrWriter := io.Pipe()

0 commit comments

Comments
 (0)