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")
}
}
}