summaryrefslogtreecommitdiff
path: root/cmd
diff options
context:
space:
mode:
authorDave Henderson <dhenderson@gmail.com>2019-10-23 23:06:56 -0400
committerDave Henderson <dhenderson@gmail.com>2019-10-23 23:09:48 -0400
commite0840639ea94698921025301ef6c5ff0c6961feb (patch)
treeb349bef18afad24923eb686115fdf9c245de4c0b /cmd
parentcb03ef3ca03fdbdf6d7e99866c08db4250daef3e (diff)
New --exec-pipe output option
Signed-off-by: Dave Henderson <dhenderson@gmail.com>
Diffstat (limited to 'cmd')
-rw-r--r--cmd/gomplate/main.go16
-rw-r--r--cmd/gomplate/validate.go4
-rw-r--r--cmd/gomplate/validate_test.go35
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",