From 08080da8e2863139996dce97c691ed1120af8762 Mon Sep 17 00:00:00 2001 From: Lorenz Brun Date: Tue, 4 Dec 2018 23:34:02 +0100 Subject: [PATCH] Make automatically creating output dirs an option --- jsonnet/cmd.go | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/jsonnet/cmd.go b/jsonnet/cmd.go index f839584..ad26eb7 100644 --- a/jsonnet/cmd.go +++ b/jsonnet/cmd.go @@ -86,6 +86,7 @@ func usage(o io.Writer) { fmt.Fprintln(o, " -J / --jpath Specify an additional library search dir") fmt.Fprintln(o, " -o / --output-file Write to the output file rather than stdout") fmt.Fprintln(o, " -m / --multi Write multiple files to the directory, list files on stdout") + fmt.Fprintln(o, " -c / --create-output-dirs Automatically creates all parent directories for files") fmt.Fprintln(o, " -y / --yaml-stream Write output as a YAML stream of JSON documents") fmt.Fprintln(o, " -S / --string Expect a string, manifest as plain text") fmt.Fprintln(o, " -s / --max-stack Number of allowed stack frames") @@ -140,10 +141,11 @@ type config struct { filenameIsCode bool // commandEval flags - evalMulti bool - evalStream bool - evalMultiOutputDir string - evalJpath []string + evalMulti bool + evalStream bool + evalMultiOutputDir string + evalCreateOutputDirs bool + evalJpath []string // commandFmt flags // commandFmt is currently unsupported. @@ -309,6 +311,8 @@ func processArgs(givenArgs []string, config *config, vm *jsonnet.VM) (processArg outputDir += "/" } config.evalMultiOutputDir = outputDir + } else if arg == "-c" || arg == "--create-output-dirs" { + config.evalCreateOutputDirs = true } else if arg == "-y" || arg == "--yaml-stream" { config.evalStream = true } else if arg == "-S" || arg == "--string" { @@ -363,7 +367,7 @@ func readInput(config config, filename *string) (input string, err error) { return } -func writeMultiOutputFiles(output map[string]string, outputDir, outputFile string) error { +func writeMultiOutputFiles(output map[string]string, outputDir, outputFile string, createDirs bool) error { // If multiple file output is used, then iterate over each string from // the sequence of strings returned by jsonnet_evaluate_snippet_multi, // construct pairs of filename and content, and write each output file. @@ -413,9 +417,10 @@ func writeMultiOutputFiles(output map[string]string, outputDir, outputFile strin continue } } - - if err := os.MkdirAll(filepath.Dir(filename), 0755); err != nil { - return err + if createDirs { + if err := os.MkdirAll(filepath.Dir(filename), 0755); err != nil { + return err + } } f, err := os.Create(filename) @@ -469,12 +474,18 @@ func writeOutputStream(output []string, outputFile string) error { return nil } -func writeOutputFile(output string, outputFile string) error { +func writeOutputFile(output string, outputFile string, createDirs bool) error { if outputFile == "" { fmt.Print(output) return nil } + if createDirs { + if err := os.MkdirAll(filepath.Dir(outputFile), 0755); err != nil { + return err + } + } + f, err := os.Create(outputFile) if err != nil { return err @@ -586,7 +597,7 @@ func main() { // Write output JSON. if config.evalMulti { - err := writeMultiOutputFiles(outputDict, config.evalMultiOutputDir, config.outputFile) + err := writeMultiOutputFiles(outputDict, config.evalMultiOutputDir, config.outputFile, config.evalCreateOutputDirs) if err != nil { fmt.Fprintln(os.Stderr, err.Error()) os.Exit(1) @@ -598,7 +609,7 @@ func main() { os.Exit(1) } } else { - err := writeOutputFile(output, config.outputFile) + err := writeOutputFile(output, config.outputFile, config.evalCreateOutputDirs) if err != nil { fmt.Fprintln(os.Stderr, err.Error()) os.Exit(1)