sweet: wrap errors where possible

Currently Sweet doesn't wrap errors at all. Make that the default.

This makes it hard to check for certain types of errors before exiting
and printing more information.

[git-generate]
cd sweet
grep -R "%v" cmd/ cli/ common/ harnesses/ generators/ | grep "fmt\.Errorf" | cut -f 1 -d ":" | uniq | xargs sed -i 's/\(Errorf[^%]*\)%v/\1%w/g'

Change-Id: I6fdef3940738870ec8d7a41735fd7eb87dc7ea1b
Reviewed-on: https://go-review.googlesource.com/c/benchmarks/+/383535
Trust: Michael Knyszek <mknyszek@google.com>
Run-TryBot: Michael Knyszek <mknyszek@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Michael Pratt <mpratt@google.com>
diff --git a/sweet/cli/bootstrap/cache.go b/sweet/cli/bootstrap/cache.go
index 774ae7d..70decbd 100644
--- a/sweet/cli/bootstrap/cache.go
+++ b/sweet/cli/bootstrap/cache.go
@@ -16,13 +16,13 @@
 func CachedAssets(cache, version string) (string, error) {
 	name := VersionArchiveName(version)
 	if err := os.MkdirAll(cache, os.ModePerm); err != nil {
-		return "", fmt.Errorf("failed to create cache directory: %v", err)
+		return "", fmt.Errorf("failed to create cache directory: %w", err)
 	}
 	cacheloc := filepath.Join(cache, name)
 	if _, err := os.Lstat(cacheloc); os.IsNotExist(err) {
 		return cacheloc, ErrNotInCache
 	} else if err != nil {
-		return "", fmt.Errorf("failed to check cache: %v", err)
+		return "", fmt.Errorf("failed to check cache: %w", err)
 	}
 	return cacheloc, nil
 }
diff --git a/sweet/cli/bootstrap/gcs.go b/sweet/cli/bootstrap/gcs.go
index 35fd72a..40c9dd9 100644
--- a/sweet/cli/bootstrap/gcs.go
+++ b/sweet/cli/bootstrap/gcs.go
@@ -63,7 +63,7 @@
 	}
 	o := client.Bucket(bucket).Object(VersionArchiveName(version))
 	if _, err := o.Attrs(ctx); err != nil && err != storage.ErrObjectNotExist {
-		return nil, fmt.Errorf("checking if object exists: %v", err)
+		return nil, fmt.Errorf("checking if object exists: %w", err)
 	} else if err == nil && !force {
 		return nil, fmt.Errorf("assets object already exists for version %s", version)
 	}
diff --git a/sweet/cmd/sweet/gen.go b/sweet/cmd/sweet/gen.go
index 247f9d6..2af8216 100644
--- a/sweet/cmd/sweet/gen.go
+++ b/sweet/cmd/sweet/gen.go
@@ -102,15 +102,15 @@
 	var err error
 	c.assetsDir, err = filepath.Abs(c.assetsDir)
 	if err != nil {
-		return fmt.Errorf("creating absolute path from assets path: %v", err)
+		return fmt.Errorf("creating absolute path from assets path: %w", err)
 	}
 	c.sourceAssetsDir, err = filepath.Abs(c.sourceAssetsDir)
 	if err != nil {
-		return fmt.Errorf("creating absolute path from source assets path: %v", err)
+		return fmt.Errorf("creating absolute path from source assets path: %w", err)
 	}
 	c.outputDir, err = filepath.Abs(c.outputDir)
 	if err != nil {
-		return fmt.Errorf("creating absolute path from output path: %v", err)
+		return fmt.Errorf("creating absolute path from output path: %w", err)
 	}
 
 	// Make sure the assets directory is there.
diff --git a/sweet/cmd/sweet/get.go b/sweet/cmd/sweet/get.go
index 2d80290..a53f5e4 100644
--- a/sweet/cmd/sweet/get.go
+++ b/sweet/cmd/sweet/get.go
@@ -178,7 +178,7 @@
 
 func extractAssets(archive *os.File, outdir string) error {
 	if err := os.MkdirAll(outdir, os.ModePerm); err != nil {
-		return fmt.Errorf("create assets directory: %v", err)
+		return fmt.Errorf("create assets directory: %w", err)
 	}
 	archiveInfo, err := archive.Stat()
 	if err != nil {
diff --git a/sweet/cmd/sweet/run.go b/sweet/cmd/sweet/run.go
index 3a2f142..0ca218b 100644
--- a/sweet/cmd/sweet/run.go
+++ b/sweet/cmd/sweet/run.go
@@ -159,27 +159,27 @@
 		// Create a temporary work tree for running the benchmarks.
 		c.workDir, err = ioutil.TempDir("", "gosweet")
 		if err != nil {
-			return fmt.Errorf("creating work root: %v", err)
+			return fmt.Errorf("creating work root: %w", err)
 		}
 	}
 	// Ensure all provided directories are absolute paths. This avoids problems with
 	// benchmarks potentially changing their current working directory.
 	c.workDir, err = filepath.Abs(c.workDir)
 	if err != nil {
-		return fmt.Errorf("creating absolute path from provided work root: %v", err)
+		return fmt.Errorf("creating absolute path from provided work root: %w", err)
 	}
 	c.benchDir, err = filepath.Abs(c.benchDir)
 	if err != nil {
-		return fmt.Errorf("creating absolute path from benchmarks path: %v", err)
+		return fmt.Errorf("creating absolute path from benchmarks path: %w", err)
 	}
 	c.resultsDir, err = filepath.Abs(c.resultsDir)
 	if err != nil {
-		return fmt.Errorf("creating absolute path from results path: %v", err)
+		return fmt.Errorf("creating absolute path from results path: %w", err)
 	}
 	if c.assetsDir != "" {
 		c.assetsDir, err = filepath.Abs(c.assetsDir)
 		if err != nil {
-			return fmt.Errorf("creating absolute path from assets path: %v", err)
+			return fmt.Errorf("creating absolute path from assets path: %w", err)
 		}
 		if info, err := os.Stat(c.assetsDir); os.IsNotExist(err) {
 			return fmt.Errorf("assets not found at %q: did you mean to specify assets-dir?", c.assetsDir)
@@ -195,7 +195,7 @@
 		}
 		c.assetsCache, err = filepath.Abs(c.assetsCache)
 		if err != nil {
-			return fmt.Errorf("creating absolute path from assets cache path: %v", err)
+			return fmt.Errorf("creating absolute path from assets cache path: %w", err)
 		}
 		if info, err := os.Stat(c.assetsCache); os.IsNotExist(err) {
 			return fmt.Errorf("assets not found at %q: forgot to run `sweet get`?", c.assetsDir)
diff --git a/sweet/common/gotool.go b/sweet/common/gotool.go
index 6113d1f..20fc76c 100644
--- a/sweet/common/gotool.go
+++ b/sweet/common/gotool.go
@@ -22,7 +22,7 @@
 func SystemGoTool() (*Go, error) {
 	tool, err := exec.LookPath("go")
 	if err != nil {
-		return nil, fmt.Errorf("looking for system Go: %v", err)
+		return nil, fmt.Errorf("looking for system Go: %w", err)
 	}
 	return &Go{
 		Tool: tool,
@@ -70,11 +70,11 @@
 	}
 	cwd, err := os.Getwd()
 	if err != nil {
-		return fmt.Errorf("failed to get current working directory: %v", err)
+		return fmt.Errorf("failed to get current working directory: %w", err)
 	}
 	defer chdir(cwd)
 	if err := chdir(path); err != nil {
-		return fmt.Errorf("failed to enter build directory: %v", err)
+		return fmt.Errorf("failed to enter build directory: %w", err)
 	}
 	return g.Do("build", "-o", out)
 }
diff --git a/sweet/generators/tile38.go b/sweet/generators/tile38.go
index d6bb2b2..21a0e14 100644
--- a/sweet/generators/tile38.go
+++ b/sweet/generators/tile38.go
@@ -109,7 +109,7 @@
 		for _, line := range strings.Split(buf.String(), "\n") {
 			log.Printf(line)
 		}
-		return fmt.Errorf("error: starting server: %v", err)
+		return fmt.Errorf("error: starting server: %w", err)
 	}
 
 	// Clean up the server process after we're done.
@@ -229,7 +229,7 @@
 	srvCmd.Stdout = out
 	srvCmd.Stderr = out
 	if err := srvCmd.Start(); err != nil {
-		return nil, fmt.Errorf("failed to start server: %v", err)
+		return nil, fmt.Errorf("failed to start server: %w", err)
 	}
 
 	// Poll until the server is ready to serve, up to 120 seconds.
@@ -244,7 +244,7 @@
 		}
 		time.Sleep(2 * time.Second)
 	}
-	return nil, fmt.Errorf("timeout trying to connect to server: %v", err)
+	return nil, fmt.Errorf("timeout trying to connect to server: %w", err)
 }
 
 // tsvScanner returns a bufio.Scanner that emits a cell in
diff --git a/sweet/harnesses/gvisor.go b/sweet/harnesses/gvisor.go
index dce4612..bd16741 100644
--- a/sweet/harnesses/gvisor.go
+++ b/sweet/harnesses/gvisor.go
@@ -51,7 +51,7 @@
 	// See https://gvisor.dev/docs/user_guide/install/#install-directly
 	log.CommandPrintf("chmod 755 %s", bin)
 	if err := os.Chmod(bin, 0755); err != nil {
-		return fmt.Errorf("failed to set permissions on runsc: %v", err)
+		return fmt.Errorf("failed to set permissions on runsc: %w", err)
 	}
 	return nil
 }