Make automatically creating output dirs an option

This commit is contained in:
Lorenz Brun 2018-12-04 23:34:02 +01:00 committed by Dave Cunningham
parent 4122e4436e
commit 08080da8e2

View File

@ -86,6 +86,7 @@ func usage(o io.Writer) {
fmt.Fprintln(o, " -J / --jpath <dir> Specify an additional library search dir") fmt.Fprintln(o, " -J / --jpath <dir> Specify an additional library search dir")
fmt.Fprintln(o, " -o / --output-file <file> Write to the output file rather than stdout") fmt.Fprintln(o, " -o / --output-file <file> Write to the output file rather than stdout")
fmt.Fprintln(o, " -m / --multi <dir> Write multiple files to the directory, list files on stdout") fmt.Fprintln(o, " -m / --multi <dir> 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, " -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 / --string Expect a string, manifest as plain text")
fmt.Fprintln(o, " -s / --max-stack <n> Number of allowed stack frames") fmt.Fprintln(o, " -s / --max-stack <n> Number of allowed stack frames")
@ -140,10 +141,11 @@ type config struct {
filenameIsCode bool filenameIsCode bool
// commandEval flags // commandEval flags
evalMulti bool evalMulti bool
evalStream bool evalStream bool
evalMultiOutputDir string evalMultiOutputDir string
evalJpath []string evalCreateOutputDirs bool
evalJpath []string
// commandFmt flags // commandFmt flags
// commandFmt is currently unsupported. // commandFmt is currently unsupported.
@ -309,6 +311,8 @@ func processArgs(givenArgs []string, config *config, vm *jsonnet.VM) (processArg
outputDir += "/" outputDir += "/"
} }
config.evalMultiOutputDir = outputDir config.evalMultiOutputDir = outputDir
} else if arg == "-c" || arg == "--create-output-dirs" {
config.evalCreateOutputDirs = true
} else if arg == "-y" || arg == "--yaml-stream" { } else if arg == "-y" || arg == "--yaml-stream" {
config.evalStream = true config.evalStream = true
} else if arg == "-S" || arg == "--string" { } else if arg == "-S" || arg == "--string" {
@ -363,7 +367,7 @@ func readInput(config config, filename *string) (input string, err error) {
return 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 // If multiple file output is used, then iterate over each string from
// the sequence of strings returned by jsonnet_evaluate_snippet_multi, // the sequence of strings returned by jsonnet_evaluate_snippet_multi,
// construct pairs of filename and content, and write each output file. // 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 continue
} }
} }
if createDirs {
if err := os.MkdirAll(filepath.Dir(filename), 0755); err != nil { if err := os.MkdirAll(filepath.Dir(filename), 0755); err != nil {
return err return err
}
} }
f, err := os.Create(filename) f, err := os.Create(filename)
@ -469,12 +474,18 @@ func writeOutputStream(output []string, outputFile string) error {
return nil return nil
} }
func writeOutputFile(output string, outputFile string) error { func writeOutputFile(output string, outputFile string, createDirs bool) error {
if outputFile == "" { if outputFile == "" {
fmt.Print(output) fmt.Print(output)
return nil return nil
} }
if createDirs {
if err := os.MkdirAll(filepath.Dir(outputFile), 0755); err != nil {
return err
}
}
f, err := os.Create(outputFile) f, err := os.Create(outputFile)
if err != nil { if err != nil {
return err return err
@ -586,7 +597,7 @@ func main() {
// Write output JSON. // Write output JSON.
if config.evalMulti { if config.evalMulti {
err := writeMultiOutputFiles(outputDict, config.evalMultiOutputDir, config.outputFile) err := writeMultiOutputFiles(outputDict, config.evalMultiOutputDir, config.outputFile, config.evalCreateOutputDirs)
if err != nil { if err != nil {
fmt.Fprintln(os.Stderr, err.Error()) fmt.Fprintln(os.Stderr, err.Error())
os.Exit(1) os.Exit(1)
@ -598,7 +609,7 @@ func main() {
os.Exit(1) os.Exit(1)
} }
} else { } else {
err := writeOutputFile(output, config.outputFile) err := writeOutputFile(output, config.outputFile, config.evalCreateOutputDirs)
if err != nil { if err != nil {
fmt.Fprintln(os.Stderr, err.Error()) fmt.Fprintln(os.Stderr, err.Error())
os.Exit(1) os.Exit(1)