diff --git a/api/go.mod b/api/go.mod index 8c8a06043..56bf2002c 100644 --- a/api/go.mod +++ b/api/go.mod @@ -6,6 +6,7 @@ require ( github.com/evanphx/json-patch v4.5.0+incompatible github.com/go-openapi/spec v0.19.4 github.com/golangci/golangci-lint v1.21.0 + github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 github.com/monopole/mdrip v1.0.0 github.com/pkg/errors v0.8.1 golang.org/x/tools v0.0.0-20191010075000-0337d82405ff diff --git a/api/go.sum b/api/go.sum index 9dfdab7f4..c1ffff21d 100644 --- a/api/go.sum +++ b/api/go.sum @@ -168,6 +168,8 @@ github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSN github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.3.0 h1:CcQijm0XKekKjP/YCz28LXVSpgguuB+nCxaSjCe09y0= diff --git a/api/internal/plugins/execplugin/execplugin.go b/api/internal/plugins/execplugin/execplugin.go index 52b1582bd..c8fc8e25d 100644 --- a/api/internal/plugins/execplugin/execplugin.go +++ b/api/internal/plugins/execplugin/execplugin.go @@ -12,6 +12,8 @@ import ( "strconv" "strings" + "github.com/google/shlex" + "github.com/pkg/errors" "sigs.k8s.io/kustomize/api/resid" "sigs.k8s.io/kustomize/api/resmap" @@ -86,7 +88,7 @@ func (p *ExecPlugin) processOptionalArgsFields() error { var c argsConfig yaml.Unmarshal(p.cfg, &c) if c.ArgsOneLiner != "" { - p.args = strings.Split(c.ArgsOneLiner, " ") + p.args, _ = shlex.Split(c.ArgsOneLiner) } if c.ArgsFromFile != "" { content, err := p.h.Loader().Load(c.ArgsFromFile) diff --git a/api/internal/plugins/execplugin/execplugin_test.go b/api/internal/plugins/execplugin/execplugin_test.go index ca1d1dc60..998229cfa 100644 --- a/api/internal/plugins/execplugin/execplugin_test.go +++ b/api/internal/plugins/execplugin/execplugin_test.go @@ -43,9 +43,16 @@ s/$BAR/bar/g "metadata": map[string]interface{}{ "name": "some-random-name", }, - "argsOneLiner": "one two", + "argsOneLiner": "one two 'foo bar'", "argsFromFile": "sed-input.txt", }) + + ldr.AddFile("/app/sed-input.txt", []byte(` +s/$FOO/foo/g +s/$BAR/bar baz/g + \ \ \ +`)) + p := NewExecPlugin( pLdr.AbsolutePluginPath( konfig.DisabledPluginConfig(), @@ -69,7 +76,7 @@ s/$BAR/bar/g expected = `apiVersion: someteam.example.com/v1 argsFromFile: sed-input.txt -argsOneLiner: one two +argsOneLiner: one two 'foo bar' kind: SedTransformer metadata: name: some-random-name @@ -78,15 +85,16 @@ metadata: t.Fatalf("expected cfg '%s', got '%s'", expected, string(p.Cfg())) } - if len(p.Args()) != 5 { - t.Fatalf("unexpected arg len %d, %v", len(p.Args()), p.Args()) + if len(p.Args()) != 6 { + t.Fatalf("unexpected arg len %d, %#v", len(p.Args()), p.Args()) } if p.Args()[0] != "one" || p.Args()[1] != "two" || - p.Args()[2] != "s/$FOO/foo/g" || - p.Args()[3] != "s/$BAR/bar/g" || - p.Args()[4] != "\\ \\ \\ " { - t.Fatalf("unexpected arg array: %v", p.Args()) + p.Args()[2] != "foo bar" || + p.Args()[3] != "s/$FOO/foo/g" || + p.Args()[4] != "s/$BAR/bar baz/g" || + p.Args()[5] != "\\ \\ \\ " { + t.Fatalf("unexpected arg array: %#v", p.Args()) } }