internal: move IncludeStderr

Move the IncludeStderr function from internal/log to internal/derrors.

Change-Id: I65823d484cbf749eb442b5ba8d0499f01c3363b0
Reviewed-on: https://go-review.googlesource.com/c/pkgsite-metrics/+/471095
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Zvonimir Pavlinovic <zpavlinovic@google.com>
Run-TryBot: Jonathan Amsterdam <jba@google.com>
diff --git a/cmd/vulncheck_sandbox/vulncheck_sandbox_test.go b/cmd/vulncheck_sandbox/vulncheck_sandbox_test.go
index 87a178d..7dbe9bc 100644
--- a/cmd/vulncheck_sandbox/vulncheck_sandbox_test.go
+++ b/cmd/vulncheck_sandbox/vulncheck_sandbox_test.go
@@ -15,7 +15,7 @@
 	"testing"
 
 	"golang.org/x/exp/slices"
-	"golang.org/x/pkgsite-metrics/internal/log"
+	"golang.org/x/pkgsite-metrics/internal/derrors"
 	"golang.org/x/pkgsite-metrics/internal/worker"
 	"golang.org/x/vuln/vulncheck"
 )
@@ -49,7 +49,7 @@
 		cmd := exec.Command("go build")
 		cmd.Dir = "testdata/module"
 		if _, err := cmd.Output(); err != nil {
-			t.Fatal(log.IncludeStderr(err))
+			t.Fatal(derrors.IncludeStderr(err))
 		}
 		defer os.Remove(binary)
 		res, err := runTest([]string{worker.ModeBinary, binary}, "testdata/vulndb")
diff --git a/internal/derrors/derrors.go b/internal/derrors/derrors.go
index 2e00c86..0a89df7 100644
--- a/internal/derrors/derrors.go
+++ b/internal/derrors/derrors.go
@@ -7,8 +7,10 @@
 package derrors
 
 import (
+	"bytes"
 	"errors"
 	"fmt"
+	"os/exec"
 	"runtime"
 	"strings"
 
@@ -204,3 +206,13 @@
 func IsGoVersionMismatchError(msg string) bool {
 	return strings.Contains(msg, "can't be built on Go")
 }
+
+// IncludeStderr includes the stderr with an *exec.ExitError.
+// If err is not an *exec.ExitError, it returns err.Error().
+func IncludeStderr(err error) string {
+	var eerr *exec.ExitError
+	if errors.As(err, &eerr) {
+		return fmt.Sprintf("%v: %s", eerr, bytes.TrimSpace(eerr.Stderr))
+	}
+	return err.Error()
+}
diff --git a/internal/log/log.go b/internal/log/log.go
index 778fdab..7976bcf 100644
--- a/internal/log/log.go
+++ b/internal/log/log.go
@@ -6,14 +6,11 @@
 package log
 
 import (
-	"bytes"
 	"context"
-	"errors"
 	"fmt"
 	"io"
 	"log"
 	"os"
-	"os/exec"
 	"reflect"
 	"strings"
 	"sync"
@@ -283,13 +280,3 @@
 	log.Printf("Error: %s is invalid LogLevel. Possible values are [debug, info, warning, error, fatal]", v)
 	return logging.Default
 }
-
-// IncludeStderr includes the stderr with an *exec.ExitError.
-// If err is not an *exec.ExitError, it returns err.Error().
-func IncludeStderr(err error) string {
-	var eerr *exec.ExitError
-	if errors.As(err, &eerr) {
-		return fmt.Sprintf("%v: %s", eerr, bytes.TrimSpace(eerr.Stderr))
-	}
-	return err.Error()
-}
diff --git a/internal/sandbox/sandbox_test.go b/internal/sandbox/sandbox_test.go
index b396652..af240fa 100644
--- a/internal/sandbox/sandbox_test.go
+++ b/internal/sandbox/sandbox_test.go
@@ -12,7 +12,7 @@
 	"strings"
 	"testing"
 
-	"golang.org/x/pkgsite-metrics/internal/log"
+	"golang.org/x/pkgsite-metrics/internal/derrors"
 )
 
 // These tests require a minimal bundle, in testdata/bundle.
@@ -32,7 +32,7 @@
 	t.Run("printargs", func(t *testing.T) {
 		out, err := sb.Run(ctx, "/printargs", "a", "b")
 		if err != nil {
-			t.Fatal(log.IncludeStderr(err))
+			t.Fatal(derrors.IncludeStderr(err))
 		}
 
 		want := `args:
diff --git a/internal/worker/analysis.go b/internal/worker/analysis.go
index 1cc42d1..e9fa08e 100644
--- a/internal/worker/analysis.go
+++ b/internal/worker/analysis.go
@@ -150,7 +150,7 @@
 	cmd.Dir = moduleDir
 	out, err := cmd.Output()
 	if err != nil {
-		return nil, fmt.Errorf("running analysis binary %s: %s", binaryPath, log.IncludeStderr(err))
+		return nil, fmt.Errorf("running analysis binary %s: %s", binaryPath, derrors.IncludeStderr(err))
 	}
 	var tree JSONTree
 	if err := json.Unmarshal(out, &tree); err != nil {
diff --git a/internal/worker/vulncheck_scan.go b/internal/worker/vulncheck_scan.go
index 4d288e6..5068d2b 100644
--- a/internal/worker/vulncheck_scan.go
+++ b/internal/worker/vulncheck_scan.go
@@ -334,13 +334,13 @@
 	_, err := cmd.Output()
 	if err != nil {
 		return nil, fmt.Errorf("%w: 'go mod download' for %s@%s returned %s",
-			derrors.BadModule, modulePath, version, log.IncludeStderr(err))
+			derrors.BadModule, modulePath, version, derrors.IncludeStderr(err))
 	}
 	log.Infof(ctx, "go mod download succeeded")
 	log.Infof(ctx, "%s@%s: running vulncheck in sandbox", modulePath, version)
 	stdout, err := sbox.Run(ctx, "/binaries/vulncheck_sandbox", "-gomodcache", "/"+sandboxGoModCache, mode, sandboxDir)
 	if err != nil {
-		return nil, errors.New(log.IncludeStderr(err))
+		return nil, errors.New(derrors.IncludeStderr(err))
 	}
 	return stdout, nil
 }
@@ -366,7 +366,7 @@
 	log.Infof(ctx, "%s@%s/%s: running vulncheck in sandbox on %s", modulePath, version, binDir, destf.Name())
 	stdout, err := s.sbox.Run(ctx, "/binaries/vulncheck_sandbox", ModeBinary, destf.Name())
 	if err != nil {
-		return nil, errors.New(log.IncludeStderr(err))
+		return nil, errors.New(derrors.IncludeStderr(err))
 	}
 	return unmarshalVulncheckOutput(stdout)
 }
@@ -747,7 +747,7 @@
 		out, err = s.sbox.Run(ctx, "/binaries/vulncheck_sandbox", "-gomodcache", "/"+sandboxGoModCache, "-clean")
 	}
 	if err != nil {
-		return fmt.Errorf("cleaning Go caches: %s", log.IncludeStderr(err))
+		return fmt.Errorf("cleaning Go caches: %s", derrors.IncludeStderr(err))
 	}
 	output := ""
 	if len(out) > 0 {