Skip to content

Commit 3cd616e

Browse files
committed
unbraced variable must not apply advanced substitutions
Signed-off-by: Nicolas De Loof <[email protected]>
1 parent f5d8ec8 commit 3cd616e

File tree

2 files changed

+26
-14
lines changed

2 files changed

+26
-14
lines changed

template/template.go

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,12 @@ import (
2525
)
2626

2727
var delimiter = "\\$"
28-
var substitution = "[_a-z][_a-z0-9]*(?::?[-?][^}]*)?"
28+
var substitutionNamed = "[_a-z][_a-z0-9]*"
29+
var substitutionBraced = "[_a-z][_a-z0-9]*(?::?[-?][^}]*)?"
2930

3031
var patternString = fmt.Sprintf(
3132
"%s(?i:(?P<escaped>%s)|(?P<named>%s)|{(?P<braced>%s)}|(?P<invalid>))",
32-
delimiter, delimiter, substitution, substitution,
33+
delimiter, delimiter, substitutionNamed, substitutionBraced,
3334
)
3435

3536
var defaultPattern = regexp.MustCompile(patternString)
@@ -74,29 +75,33 @@ func SubstituteWith(template string, mapping Mapping, pattern *regexp.Regexp, su
7475
return escaped
7576
}
7677

78+
braced := false
7779
substitution := groups["named"]
7880
if substitution == "" {
7981
substitution = groups["braced"]
82+
braced = true
8083
}
8184

8285
if substitution == "" {
8386
err = &InvalidTemplateError{Template: template}
8487
return ""
8588
}
8689

87-
for _, f := range subsFuncs {
88-
var (
89-
value string
90-
applied bool
91-
)
92-
value, applied, err = f(substitution, mapping)
93-
if err != nil {
94-
return ""
95-
}
96-
if !applied {
97-
continue
90+
if braced {
91+
for _, f := range subsFuncs {
92+
var (
93+
value string
94+
applied bool
95+
)
96+
value, applied, err = f(substitution, mapping)
97+
if err != nil {
98+
return ""
99+
}
100+
if !applied {
101+
continue
102+
}
103+
return value
98104
}
99-
return value
100105
}
101106

102107
value, ok := mapping(substitution)

template/template_test.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,13 @@ func TestInvalid(t *testing.T) {
6464
}
6565
}
6666

67+
// see https://github.com/docker/compose/issues/8601
68+
func TestNonBraced(t *testing.T) {
69+
substituted, err := Substitute("$FOO-bar", defaultMapping)
70+
assert.NilError(t, err)
71+
assert.Equal(t, substituted, "first-bar")
72+
}
73+
6774
func TestNoValueNoDefault(t *testing.T) {
6875
for _, template := range []string{"This ${missing} var", "This ${BAR} var"} {
6976
result, err := Substitute(template, defaultMapping)

0 commit comments

Comments
 (0)