cmd/gotext: standardize error handling Change-Id: I2aed475d975af4e084a0a17547d424493fd7c70b Reviewed-on: https://go-review.googlesource.com/82198 Run-TryBot: Marcel van Lohuizen <mpvl@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Nigel Tao <nigeltao@golang.org>
diff --git a/cmd/gotext/common.go b/cmd/gotext/common.go index 6496a21..021b655 100644 --- a/cmd/gotext/common.go +++ b/cmd/gotext/common.go
@@ -5,12 +5,24 @@ package main import ( + "fmt" "go/build" "go/parser" "golang.org/x/tools/go/loader" ) +// NOTE: The command line tool already prefixes with "gotext:". +var ( + wrap = func(err error, msg string) error { + return fmt.Errorf("%s: %v", msg, err) + } + wrapf = func(err error, msg string, args ...interface{}) error { + return wrap(err, fmt.Sprintf(msg, args...)) + } + errorf = fmt.Errorf +) + func loadPackages(conf *loader.Config, args []string) (*loader.Program, error) { if len(args) == 0 { args = []string{"."} @@ -22,7 +34,7 @@ // Use the initial packages from the command line. args, err := conf.FromArgs(args, false) if err != nil { - return nil, err + return nil, wrap(err, "loading packages failed") } // Load, parse and type-check the whole program.
diff --git a/cmd/gotext/extract.go b/cmd/gotext/extract.go index b5cd65b..d789ab5 100644 --- a/cmd/gotext/extract.go +++ b/cmd/gotext/extract.go
@@ -53,7 +53,7 @@ conf := loader.Config{} prog, err := loadPackages(&conf, args) if err != nil { - return err + return wrap(err, "") } // print returns Go syntax for the specified node. @@ -210,7 +210,7 @@ tag, err := language.Parse(*srcLang) if err != nil { - return err + return wrap(err, "") } out := Locale{ Language: tag, @@ -218,14 +218,14 @@ } data, err := json.MarshalIndent(out, "", " ") if err != nil { - return err + return wrap(err, "") } os.MkdirAll(*dir, 0755) // TODO: this file can probably go if we replace the extract + generate // cycle with a init once and update cycle. file := filepath.Join(*dir, "extracted.gotext.json") if err := ioutil.WriteFile(file, data, 0644); err != nil { - return fmt.Errorf("could not create file: %v", err) + return wrapf(err, "could not create file") } langs := append(getLangs(), tag) @@ -235,14 +235,14 @@ out.Language = tag data, err := json.MarshalIndent(out, "", " ") if err != nil { - return err + return wrap(err, "JSON marshal failed") } file := filepath.Join(*dir, tag.String(), "out.gotext.json") if err := os.MkdirAll(filepath.Dir(file), 0750); err != nil { - return err + return wrap(err, "dir create failed") } if err := ioutil.WriteFile(file, data, 0740); err != nil { - return fmt.Errorf("could not create file: %v", err) + return wrap(err, "write failed") } } return nil
diff --git a/cmd/gotext/main.go b/cmd/gotext/main.go index 1a1e374..062b2c5 100644 --- a/cmd/gotext/main.go +++ b/cmd/gotext/main.go
@@ -125,7 +125,7 @@ cmd.Flag.Parse(args[1:]) args = cmd.Flag.Args() if err := cmd.Run(cmd, args); err != nil { - fatalf("gotext: %v", err) + fatalf("gotext: %+v", err) } exit() return @@ -285,10 +285,10 @@ if arg == "gendocumentation" { b, err := format.Source(w.Bytes()) if err != nil { - errorf("Could not format generated docs: %v\n", err) + logf("Could not format generated docs: %v\n", err) } if err := ioutil.WriteFile("doc.go", b, 0666); err != nil { - errorf("Could not create file alldocs.go: %v\n", err) + logf("Could not create file alldocs.go: %v\n", err) } } else { fmt.Println(w.String()) @@ -336,11 +336,11 @@ } func fatalf(format string, args ...interface{}) { - errorf(format, args...) + logf(format, args...) exit() } -func errorf(format string, args ...interface{}) { +func logf(format string, args ...interface{}) { log.Printf(format, args...) setExitStatus(1) }
diff --git a/cmd/gotext/rewrite.go b/cmd/gotext/rewrite.go index e1c4833..e847d1b 100644 --- a/cmd/gotext/rewrite.go +++ b/cmd/gotext/rewrite.go
@@ -11,7 +11,6 @@ "go/constant" "go/format" "go/token" - "log" "os" "strings" @@ -52,7 +51,7 @@ } prog, err := loadPackages(conf, args) if err != nil { - return err + return wrap(err, "") } for _, info := range prog.InitialPackages() { @@ -73,12 +72,12 @@ if *overwrite { var err error if w, err = os.Create(conf.Fset.File(f.Pos()).Name()); err != nil { - log.Fatalf("Could not open file: %v", err) + return wrap(err, "open failed") } } if err := format.Node(w, conf.Fset, f); err != nil { - return err + return wrap(err, "go format failed") } } }