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