import (
"bytes"
"fmt"
+ "io"
"io/ioutil"
"os/exec"
"runtime"
}
func runBug(cmd *Command, args []string) {
- inspectGoVersion()
- fmt.Println("```")
- fmt.Printf("go version %s %s/%s\n", runtime.Version(), runtime.GOOS, runtime.GOARCH)
+ var buf bytes.Buffer
+ buf.WriteString(bugHeader)
+ inspectGoVersion(&buf)
+ fmt.Fprint(&buf, "#### System details\n\n")
+ fmt.Fprintln(&buf, "```")
+ fmt.Fprintf(&buf, "go version %s %s/%s\n", runtime.Version(), runtime.GOOS, runtime.GOARCH)
for _, e := range mkEnv() {
- fmt.Printf("%s=\"%s\"\n", e.name, e.value)
+ fmt.Fprintf(&buf, "%s=\"%s\"\n", e.name, e.value)
+ }
+ printOSDetails(&buf)
+ printCDetails(&buf)
+ fmt.Fprintln(&buf, "```")
+
+ body := buf.String()
+ url := "https://github.com/golang/go/issues/new?body=" + queryEscape(body)
+ if !openBrowser(url) {
+ fmt.Print("Please file a new issue at golang.org/issue/new using this template:\n\n")
+ fmt.Print(body)
}
- printOSDetails()
- printCDetails()
- fmt.Println("```")
}
-func printOSDetails() {
+const bugHeader = `Please answer these questions before submitting your issue. Thanks!
+
+#### What did you do?
+If possible, provide a recipe for reproducing the error.
+A complete runnable program is good.
+A link on play.golang.org is best.
+
+
+#### What did you expect to see?
+
+
+#### What did you see instead?
+
+
+`
+
+func printOSDetails(w io.Writer) {
switch runtime.GOOS {
case "darwin":
- printCmdOut("uname -v: ", "uname", "-v")
- printCmdOut("", "sw_vers")
+ printCmdOut(w, "uname -v: ", "uname", "-v")
+ printCmdOut(w, "", "sw_vers")
case "linux":
- printCmdOut("uname -sr: ", "uname", "-sr")
- printCmdOut("libc:", "/lib/libc.so.6")
+ printCmdOut(w, "uname -sr: ", "uname", "-sr")
+ printCmdOut(w, "libc:", "/lib/libc.so.6")
case "openbsd", "netbsd", "freebsd", "dragonfly":
- printCmdOut("uname -v: ", "uname", "-v")
+ printCmdOut(w, "uname -v: ", "uname", "-v")
case "solaris":
out, err := ioutil.ReadFile("/etc/release")
if err == nil {
- fmt.Printf("/etc/release: %s\n", out)
+ fmt.Fprintf(w, "/etc/release: %s\n", out)
} else {
if buildV {
fmt.Printf("failed to read /etc/release: %v\n", err)
}
}
-func printCDetails() {
- printCmdOut("lldb --version: ", "lldb", "--version")
+func printCDetails(w io.Writer) {
+ printCmdOut(w, "lldb --version: ", "lldb", "--version")
cmd := exec.Command("gdb", "--version")
out, err := cmd.Output()
if err == nil {
idx := bytes.Index(out, []byte{'\n'})
line := out[:idx]
line = bytes.TrimSpace(line)
- fmt.Printf("gdb --version: %s\n", line)
+ fmt.Fprintf(w, "gdb --version: %s\n", line)
} else {
if buildV {
fmt.Printf("failed to run gdb --version: %v\n", err)
}
}
-func inspectGoVersion() {
+func inspectGoVersion(w io.Writer) {
data, err := httpGET("https://golang.org/VERSION?m=text")
if err != nil {
if buildV {
}
// Devel version or outdated release. Either way, this request is apropos.
- fmt.Printf("Please check whether the issue also reproduces on the latest release, %s.\n\n", release)
+ fmt.Fprintf(w, "#### Does this issue reproduce with the latest release (%s)?\n\n\n", release)
}
// printCmdOut prints the output of running the given command.
// It ignores failures; 'go bug' is best effort.
-func printCmdOut(prefix, path string, args ...string) {
+func printCmdOut(w io.Writer, prefix, path string, args ...string) {
cmd := exec.Command(path, args...)
out, err := cmd.Output()
if err != nil {
}
return
}
- fmt.Printf("%s%s\n", prefix, bytes.TrimSpace(out))
+ fmt.Fprintf(w, "%s%s\n", prefix, bytes.TrimSpace(out))
}