diff options
| author | Dave Henderson <dhenderson@gmail.com> | 2019-10-23 23:06:56 -0400 |
|---|---|---|
| committer | Dave Henderson <dhenderson@gmail.com> | 2019-10-23 23:09:48 -0400 |
| commit | e0840639ea94698921025301ef6c5ff0c6961feb (patch) | |
| tree | b349bef18afad24923eb686115fdf9c245de4c0b /cmd | |
| parent | cb03ef3ca03fdbdf6d7e99866c08db4250daef3e (diff) | |
New --exec-pipe output option
Signed-off-by: Dave Henderson <dhenderson@gmail.com>
Diffstat (limited to 'cmd')
| -rw-r--r-- | cmd/gomplate/main.go | 16 | ||||
| -rw-r--r-- | cmd/gomplate/validate.go | 4 | ||||
| -rw-r--r-- | cmd/gomplate/validate_test.go | 35 |
3 files changed, 54 insertions, 1 deletions
diff --git a/cmd/gomplate/main.go b/cmd/gomplate/main.go index a11ea931..8a0dffb7 100644 --- a/cmd/gomplate/main.go +++ b/cmd/gomplate/main.go @@ -5,6 +5,7 @@ The gomplate command package main import ( + "bytes" "fmt" "os" "os/exec" @@ -19,8 +20,11 @@ import ( var ( printVer bool verbose bool + execPipe bool opts gomplate.Config includes []string + + postRunInput *bytes.Buffer ) func printVersion(name string) { @@ -34,7 +38,11 @@ func postRunExec(cmd *cobra.Command, args []string) error { args = args[1:] // nolint: gosec c := exec.Command(name, args...) - c.Stdin = os.Stdin + if execPipe { + c.Stdin = postRunInput + } else { + c.Stdin = os.Stdin + } c.Stderr = os.Stderr c.Stdout = os.Stdout @@ -101,6 +109,10 @@ func newGomplateCmd() *cobra.Command { // support --include opts.ExcludeGlob = processIncludes(includes, opts.ExcludeGlob) + if execPipe { + postRunInput = &bytes.Buffer{} + opts.Out = postRunInput + } err := gomplate.RunTemplates(&opts) cmd.SilenceErrors = true cmd.SilenceUsage = true @@ -140,6 +152,8 @@ func initFlags(command *cobra.Command) { command.Flags().StringVar(&opts.OutputMap, "output-map", "", "Template `string` to map the input file to an output path") command.Flags().StringVar(&opts.OutMode, "chmod", "", "set the mode for output file(s). Omit to inherit from input file(s)") + command.Flags().BoolVar(&execPipe, "exec-pipe", false, "pipe the output to the post-run exec command") + ldDefault := env.Getenv("GOMPLATE_LEFT_DELIM", "{{") rdDefault := env.Getenv("GOMPLATE_RIGHT_DELIM", "}}") command.Flags().StringVar(&opts.LDelim, "left-delim", ldDefault, "override the default left-`delimiter` [$GOMPLATE_LEFT_DELIM]") diff --git a/cmd/gomplate/validate.go b/cmd/gomplate/validate.go index 68c132b8..f4c73133 100644 --- a/cmd/gomplate/validate.go +++ b/cmd/gomplate/validate.go @@ -47,6 +47,10 @@ func validateOpts(cmd *cobra.Command, args []string) (err error) { err = fmt.Errorf("must provide same number of --out (%d) as --file (%d) options", len(opts.OutputFiles), len(opts.InputFiles)) } + if err == nil && cmd.Flag("exec-pipe").Changed && len(args) == 0 { + err = fmt.Errorf("--exec-pipe may only be used with a post-exec command after --") + } + if err == nil { err = mustTogether(cmd, "output-dir", "input-dir") } diff --git a/cmd/gomplate/validate_test.go b/cmd/gomplate/validate_test.go index 91f16767..54f4ba01 100644 --- a/cmd/gomplate/validate_test.go +++ b/cmd/gomplate/validate_test.go @@ -42,6 +42,41 @@ func TestValidateOpts(t *testing.T) { )) assert.Error(t, err) + err = validateOpts(parseFlags("--exec-pipe")) + assert.Error(t, err) + + err = validateOpts(parseFlags("--exec-pipe", "--")) + assert.Error(t, err) + + err = validateOpts(parseFlags( + "--exec-pipe", + "--", "echo", "foo", + )) + assert.NoError(t, err) + + err = validateOpts(parseFlags( + "--exec-pipe", + "--out", "foo", + "--", "echo", + )) + assert.Error(t, err) + + err = validateOpts(parseFlags( + "--input-dir", "in", + "--exec-pipe", + "--output-dir", "foo", + "--", "echo", + )) + assert.Error(t, err) + + err = validateOpts(parseFlags( + "--input-dir", "in", + "--exec-pipe", + "--output-map", "foo", + "--", "echo", + )) + assert.Error(t, err) + err = validateOpts(parseFlags( "--input-dir", "in", "--output-map", "bar", |
