mirror of https://github.com/ethereum/go-ethereum
cmd/geth: added 'geth bug' command (#3684)
* cmd/geth: added 'geth bug' command Added bug command to geth, which will open a browser window with an issue template and some additional system information. * cmd/geth: update bug with better infos * cmd/geth: added browser fallback * cmd/geth: govet yo mommapull/3672/head
parent
b7f010de52
commit
94334c233e
@ -0,0 +1,108 @@ |
|||||||
|
// Copyright 2017 The go-ethereum Authors
|
||||||
|
// This file is part of go-ethereum.
|
||||||
|
//
|
||||||
|
// go-ethereum is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// go-ethereum is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with go-ethereum. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
package main |
||||||
|
|
||||||
|
import ( |
||||||
|
"bytes" |
||||||
|
"fmt" |
||||||
|
"io" |
||||||
|
"io/ioutil" |
||||||
|
"net/url" |
||||||
|
"os/exec" |
||||||
|
"runtime" |
||||||
|
"strings" |
||||||
|
|
||||||
|
"github.com/ethereum/go-ethereum/cmd/internal/browser" |
||||||
|
"github.com/ethereum/go-ethereum/params" |
||||||
|
|
||||||
|
cli "gopkg.in/urfave/cli.v1" |
||||||
|
) |
||||||
|
|
||||||
|
var bugCommand = cli.Command{ |
||||||
|
Action: reportBug, |
||||||
|
Name: "bug", |
||||||
|
Usage: "opens a window to report a bug on the geth repo", |
||||||
|
ArgsUsage: " ", |
||||||
|
Category: "MISCELLANEOUS COMMANDS", |
||||||
|
} |
||||||
|
|
||||||
|
const issueUrl = "https://github.com/ethereum/go-ethereum/issues/new" |
||||||
|
|
||||||
|
// reportBug reports a bug by opening a new URL to the go-ethereum GH issue
|
||||||
|
// tracker and setting default values as the issue body.
|
||||||
|
func reportBug(ctx *cli.Context) error { |
||||||
|
// execute template and write contents to buff
|
||||||
|
var buff bytes.Buffer |
||||||
|
|
||||||
|
fmt.Fprintln(&buff, header) |
||||||
|
fmt.Fprintln(&buff, "Version:", params.Version) |
||||||
|
fmt.Fprintln(&buff, "Go Version:", runtime.Version()) |
||||||
|
fmt.Fprintln(&buff, "OS:", runtime.GOOS) |
||||||
|
printOSDetails(&buff) |
||||||
|
|
||||||
|
// open a new GH issue
|
||||||
|
if !browser.Open(issueUrl + "?body=" + url.QueryEscape(buff.String())) { |
||||||
|
fmt.Printf("Please file a new issue at %s using this template:\n%s", issueUrl, buff.String()) |
||||||
|
} |
||||||
|
return nil |
||||||
|
} |
||||||
|
|
||||||
|
// copied from the Go source. Copyright 2017 The Go Authors
|
||||||
|
func printOSDetails(w io.Writer) { |
||||||
|
switch runtime.GOOS { |
||||||
|
case "darwin": |
||||||
|
printCmdOut(w, "uname -v: ", "uname", "-v") |
||||||
|
printCmdOut(w, "", "sw_vers") |
||||||
|
case "linux": |
||||||
|
printCmdOut(w, "uname -sr: ", "uname", "-sr") |
||||||
|
printCmdOut(w, "", "lsb_release", "-a") |
||||||
|
case "openbsd", "netbsd", "freebsd", "dragonfly": |
||||||
|
printCmdOut(w, "uname -v: ", "uname", "-v") |
||||||
|
case "solaris": |
||||||
|
out, err := ioutil.ReadFile("/etc/release") |
||||||
|
if err == nil { |
||||||
|
fmt.Fprintf(w, "/etc/release: %s\n", out) |
||||||
|
} else { |
||||||
|
fmt.Printf("failed to read /etc/release: %v\n", err) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// printCmdOut prints the output of running the given command.
|
||||||
|
// It ignores failures; 'go bug' is best effort.
|
||||||
|
//
|
||||||
|
// copied from the Go source. Copyright 2017 The Go Authors
|
||||||
|
func printCmdOut(w io.Writer, prefix, path string, args ...string) { |
||||||
|
cmd := exec.Command(path, args...) |
||||||
|
out, err := cmd.Output() |
||||||
|
if err != nil { |
||||||
|
fmt.Printf("%s %s: %v\n", path, strings.Join(args, " "), err) |
||||||
|
return |
||||||
|
} |
||||||
|
fmt.Fprintf(w, "%s%s\n", prefix, bytes.TrimSpace(out)) |
||||||
|
} |
||||||
|
|
||||||
|
const header = `Please answer these questions before submitting your issue. Thanks! |
||||||
|
|
||||||
|
#### What did you do? |
||||||
|
|
||||||
|
#### What did you expect to see? |
||||||
|
|
||||||
|
#### What did you see instead? |
||||||
|
|
||||||
|
#### System details |
||||||
|
` |
@ -0,0 +1,46 @@ |
|||||||
|
// Copyright 2016 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// Package browser provides utilities for interacting with users' browsers.
|
||||||
|
package browser |
||||||
|
|
||||||
|
import ( |
||||||
|
"os" |
||||||
|
"os/exec" |
||||||
|
"runtime" |
||||||
|
) |
||||||
|
|
||||||
|
// Commands returns a list of possible commands to use to open a url.
|
||||||
|
func Commands() [][]string { |
||||||
|
var cmds [][]string |
||||||
|
if exe := os.Getenv("BROWSER"); exe != "" { |
||||||
|
cmds = append(cmds, []string{exe}) |
||||||
|
} |
||||||
|
switch runtime.GOOS { |
||||||
|
case "darwin": |
||||||
|
cmds = append(cmds, []string{"/usr/bin/open"}) |
||||||
|
case "windows": |
||||||
|
cmds = append(cmds, []string{"cmd", "/c", "start"}) |
||||||
|
default: |
||||||
|
cmds = append(cmds, []string{"xdg-open"}) |
||||||
|
} |
||||||
|
cmds = append(cmds, |
||||||
|
[]string{"chrome"}, |
||||||
|
[]string{"google-chrome"}, |
||||||
|
[]string{"chromium"}, |
||||||
|
[]string{"firefox"}, |
||||||
|
) |
||||||
|
return cmds |
||||||
|
} |
||||||
|
|
||||||
|
// Open tries to open url in a browser and reports whether it succeeded.
|
||||||
|
func Open(url string) bool { |
||||||
|
for _, args := range Commands() { |
||||||
|
cmd := exec.Command(args[0], append(args[1:], url)...) |
||||||
|
if cmd.Start() == nil { |
||||||
|
return true |
||||||
|
} |
||||||
|
} |
||||||
|
return false |
||||||
|
} |
Loading…
Reference in new issue