mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd: add internal/browser package
cmd/cover, cmd/trace, and cmd/pprof all open browsers. 'go bug' will soon also open a browser. It is time to unify the browser-handling code. Change-Id: Iee6b443e21e938aeaaac366a1aefb1afbc7d9b2c Reviewed-on: https://go-review.googlesource.com/29160 Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
parent
9a7ce41d6c
commit
33ed356475
4 changed files with 48 additions and 53 deletions
|
|
@ -7,15 +7,14 @@ package main
|
||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"cmd/internal/browser"
|
||||||
"fmt"
|
"fmt"
|
||||||
"html/template"
|
"html/template"
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"math"
|
"math"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"runtime"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// htmlOutput reads the profile data from profile and generates an HTML
|
// htmlOutput reads the profile data from profile and generates an HTML
|
||||||
|
|
@ -74,7 +73,7 @@ func htmlOutput(profile, outfile string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
if outfile == "" {
|
if outfile == "" {
|
||||||
if !startBrowser("file://" + out.Name()) {
|
if !browser.Open("file://" + out.Name()) {
|
||||||
fmt.Fprintf(os.Stderr, "HTML output written to %s\n", out.Name())
|
fmt.Fprintf(os.Stderr, "HTML output written to %s\n", out.Name())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -133,23 +132,6 @@ func htmlGen(w io.Writer, src []byte, boundaries []Boundary) error {
|
||||||
return dst.Flush()
|
return dst.Flush()
|
||||||
}
|
}
|
||||||
|
|
||||||
// startBrowser tries to open the URL in a browser
|
|
||||||
// and reports whether it succeeds.
|
|
||||||
func startBrowser(url string) bool {
|
|
||||||
// try to start the browser
|
|
||||||
var args []string
|
|
||||||
switch runtime.GOOS {
|
|
||||||
case "darwin":
|
|
||||||
args = []string{"open"}
|
|
||||||
case "windows":
|
|
||||||
args = []string{"cmd", "/c", "start"}
|
|
||||||
default:
|
|
||||||
args = []string{"xdg-open"}
|
|
||||||
}
|
|
||||||
cmd := exec.Command(args[0], append(args[1:], url)...)
|
|
||||||
return cmd.Start() == nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// rgb returns an rgb value for the specified coverage value
|
// rgb returns an rgb value for the specified coverage value
|
||||||
// between 0 (no coverage) and 10 (max coverage).
|
// between 0 (no coverage) and 10 (max coverage).
|
||||||
func rgb(n int) string {
|
func rgb(n int) string {
|
||||||
|
|
|
||||||
41
src/cmd/internal/browser/browser.go
Normal file
41
src/cmd/internal/browser/browser.go
Normal file
|
|
@ -0,0 +1,41 @@
|
||||||
|
// 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{"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
|
||||||
|
}
|
||||||
|
|
@ -12,10 +12,10 @@ import (
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"runtime"
|
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"cmd/internal/browser"
|
||||||
"cmd/internal/pprof/plugin"
|
"cmd/internal/pprof/plugin"
|
||||||
"cmd/internal/pprof/report"
|
"cmd/internal/pprof/report"
|
||||||
"cmd/internal/pprof/svg"
|
"cmd/internal/pprof/svg"
|
||||||
|
|
@ -85,18 +85,9 @@ func PProf(c Completer, interactive **bool) Commands {
|
||||||
// on the current platform
|
// on the current platform
|
||||||
func browsers() []string {
|
func browsers() []string {
|
||||||
var cmds []string
|
var cmds []string
|
||||||
if exe := os.Getenv("BROWSER"); exe != "" {
|
for _, cmd := range browser.Commands() {
|
||||||
cmds = append(cmds, exe)
|
cmds = append(cmds, strings.Join(cmd, " "))
|
||||||
}
|
}
|
||||||
switch runtime.GOOS {
|
|
||||||
case "darwin":
|
|
||||||
cmds = append(cmds, "/usr/bin/open")
|
|
||||||
case "windows":
|
|
||||||
cmds = append(cmds, "cmd /c start")
|
|
||||||
default:
|
|
||||||
cmds = append(cmds, "xdg-open")
|
|
||||||
}
|
|
||||||
cmds = append(cmds, "chrome", "google-chrome", "firefox")
|
|
||||||
return cmds
|
return cmds
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,7 @@ package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
||||||
|
"cmd/internal/browser"
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
"html/template"
|
"html/template"
|
||||||
|
|
@ -28,8 +29,6 @@ import (
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
|
||||||
"runtime"
|
|
||||||
"sync"
|
"sync"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -96,7 +95,7 @@ func main() {
|
||||||
ranges = splitTrace(data)
|
ranges = splitTrace(data)
|
||||||
|
|
||||||
log.Printf("Opening browser")
|
log.Printf("Opening browser")
|
||||||
if !startBrowser("http://" + ln.Addr().String()) {
|
if !browser.Open("http://" + ln.Addr().String()) {
|
||||||
fmt.Fprintf(os.Stderr, "Trace viewer is listening on http://%s\n", ln.Addr().String())
|
fmt.Fprintf(os.Stderr, "Trace viewer is listening on http://%s\n", ln.Addr().String())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -162,24 +161,6 @@ var templMain = template.Must(template.New("").Parse(`
|
||||||
</html>
|
</html>
|
||||||
`))
|
`))
|
||||||
|
|
||||||
// startBrowser tries to open the URL in a browser
|
|
||||||
// and reports whether it succeeds.
|
|
||||||
// Note: copied from x/tools/cmd/cover/html.go
|
|
||||||
func startBrowser(url string) bool {
|
|
||||||
// try to start the browser
|
|
||||||
var args []string
|
|
||||||
switch runtime.GOOS {
|
|
||||||
case "darwin":
|
|
||||||
args = []string{"open"}
|
|
||||||
case "windows":
|
|
||||||
args = []string{"cmd", "/c", "start"}
|
|
||||||
default:
|
|
||||||
args = []string{"xdg-open"}
|
|
||||||
}
|
|
||||||
cmd := exec.Command(args[0], append(args[1:], url)...)
|
|
||||||
return cmd.Start() == nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func dief(msg string, args ...interface{}) {
|
func dief(msg string, args ...interface{}) {
|
||||||
fmt.Fprintf(os.Stderr, msg, args...)
|
fmt.Fprintf(os.Stderr, msg, args...)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue