diff --git a/api/krusty/configmaps_test.go b/api/krusty/configmaps_test.go index 024d8ffb84..7219799831 100644 --- a/api/krusty/configmaps_test.go +++ b/api/krusty/configmaps_test.go @@ -549,3 +549,26 @@ metadata: name: testing-tt4769fb52 `) } + +// regression test for https://github.com/kubernetes-sigs/kustomize/issues/4233 +func TestDataEndsWithQuotes(t *testing.T) { + th := kusttest_test.MakeHarness(t) + th.WriteK(".", ` +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +configMapGenerator: + - name: test + literals: + - TEST=this is a 'test' +`) + + m := th.Run(".", th.MakeDefaultOptions()) + th.AssertActualEqualsExpected( + m, `apiVersion: v1 +data: + TEST: this is a 'test' +kind: ConfigMap +metadata: + name: test-k9cc55dfm5 +`) +} diff --git a/api/kv/kv.go b/api/kv/kv.go index b887e583c8..719b761c94 100644 --- a/api/kv/kv.go +++ b/api/kv/kv.go @@ -209,5 +209,17 @@ func parseLiteralSource(source string) (keyName, value string, err error) { if len(items) != 2 { return "", "", fmt.Errorf("invalid literal source %v, expected key=value", source) } - return items[0], strings.Trim(items[1], "\"'"), nil + return items[0], removeQuotes(items[1]), nil +} + +// removeQuotes removes the surrounding quotes from the provided string only if it is surrounded on both sides +// rather than blindly trimming all quotation marks on either side. +func removeQuotes(str string) string { + if len(str) == 0 || str[0] != str[len(str)-1] { + return str + } + if str[0] == '"' || str[0] == '\'' { + return str[1 : len(str)-1] + } + return str }