diff --git a/api/krusty/configmaps_test.go b/api/krusty/configmaps_test.go index 7fa15ce46..c698b3e15 100644 --- a/api/krusty/configmaps_test.go +++ b/api/krusty/configmaps_test.go @@ -440,3 +440,40 @@ metadata: name: cm-o2-5k95kd76ft `) } + +func TestConfigMapGeneratorLiteralNewline(t *testing.T) { + th := kusttest_test.MakeHarness(t) + th.WriteK("/app", ` +generators: +- configmaps.yaml +`) + th.WriteF("/app/configmaps.yaml", ` +apiVersion: builtin +kind: ConfigMapGenerator +metadata: + name: testing +literals: + - | + initial.txt=greetings + everyone + - | + final.txt=different + behavior +--- +`) + m := th.Run("/app", th.MakeDefaultOptions()) + th.AssertActualEqualsExpected( + m, ` +apiVersion: v1 +data: + final.txt: | + different + behavior + initial.txt: | + greetings + everyone +kind: ConfigMap +metadata: + name: testing-tt4769fb52 +`) +} diff --git a/kyaml/kio/byteio_reader.go b/kyaml/kio/byteio_reader.go index 8074b053d..f14f13bfa 100644 --- a/kyaml/kio/byteio_reader.go +++ b/kyaml/kio/byteio_reader.go @@ -149,6 +149,11 @@ func (r *ByteReader) Read() ([]*yaml.RNode, error) { index := 0 for i := range values { + // the Split used above will eat the tail '\n' from each resource. This may affect the + // literal string value since '\n' is meaningful in it. + if i != len(values)-1 { + values[i] += "\n" + } decoder := yaml.NewDecoder(bytes.NewBufferString(values[i])) node, err := r.decode(index, decoder) if err == io.EOF {