Changes the meaning of the -out command line flag.

This now expects a directory path to store the generated file(s) in.
This was previously a path with file name. We now always use
the filename, inferred from the input path.
This commit is contained in:
Jim Teeuwen 2013-07-25 23:58:17 +02:00
parent dcda30b1ad
commit f0faa42c2f

67
main.go
View File

@ -18,7 +18,7 @@ import (
var ( var (
pipe = false pipe = false
in = "" in = ""
out = flag.String("out", "", "Optional path to the output file.") out = flag.String("out", "", "Optional path to the output directory.")
pkgname = flag.String("pkg", "main", "Name of the package to generate.") pkgname = flag.String("pkg", "main", "Name of the package to generate.")
funcname = flag.String("func", "", "Optional name of the function to generate.") funcname = flag.String("func", "", "Optional name of the function to generate.")
prefix = flag.String("prefix", "", "Optional path prefix to strip off map keys and function names.") prefix = flag.String("prefix", "", "Optional path prefix to strip off map keys and function names.")
@ -59,7 +59,7 @@ func main() {
// Append the TOC init function to the end of the output file and // Append the TOC init function to the end of the output file and
// write the `bindata-toc.go` file, if applicable. // write the `bindata-toc.go` file, if applicable.
if *toc { if *toc {
err := createTOC(in, *pkgname) err := createTOC(*out, *pkgname)
if err != nil { if err != nil {
fmt.Fprintf(os.Stderr, "[e] %s\n", err) fmt.Fprintf(os.Stderr, "[e] %s\n", err)
@ -85,35 +85,10 @@ func parseArgs() {
pipe = flag.NArg() == 0 pipe = flag.NArg() == 0
if !pipe && len(*out) == 0 { if !pipe {
*prefix, _ = filepath.Abs(filepath.Clean(*prefix)) *prefix, _ = filepath.Abs(filepath.Clean(*prefix))
in, _ = filepath.Abs(filepath.Clean(flag.Args()[0])) in, _ = filepath.Abs(filepath.Clean(flag.Args()[0]))
*out = safeFilename(*out, in)
// Ensure we create our own output filename that does not already exist.
dir, file := path.Split(in)
*out = path.Join(dir, file+".go")
_, err := os.Lstat(*out)
if err == nil {
// File already exists. Pad name with a sequential number until we
// find a name that is available.
count := 0
for {
f := path.Join(dir, fmt.Sprintf("%s.%d.go", file, count))
_, err = os.Lstat(f)
if err != nil {
*out = f
break
}
count++
}
}
fmt.Fprintf(os.Stderr, "[w] No output file specified. Using %s.\n", *out)
} }
if len(*pkgname) == 0 { if len(*pkgname) == 0 {
@ -138,6 +113,40 @@ func parseArgs() {
} }
} }
// safeFilename creates a safe output filename from the given
// output base directory and input filename.
func safeFilename(out, in string) string {
dir, in := filepath.Split(in)
if len(out) == 0 {
out = dir
} else {
out, _ = filepath.Abs(filepath.Clean(out))
}
filename := path.Join(out, in+".go")
_, err := os.Lstat(filename)
if err == nil {
// File already exists. Pad name with a sequential number until we
// find a name that is available.
count := 0
for {
filename = path.Join(out, fmt.Sprintf("%s.%d.go", in, count))
_, err = os.Lstat(filename)
if err != nil {
break
}
count++
}
}
return filename
}
// safeFuncname creates a safe function name from the input path. // safeFuncname creates a safe function name from the input path.
func safeFuncname(in, prefix string) string { func safeFuncname(in, prefix string) string {
name := strings.Replace(in, prefix, "", 1) name := strings.Replace(in, prefix, "", 1)