Giant blob of minor changes
[dotfiles/.git] / .config / coc / extensions / coc-go-data / tools / pkg / mod / golang.org / x / tools@v0.0.0-20201105173854-bc9fc8d8c4bc / internal / lsp / browser / browser.go
diff --git a/.config/coc/extensions/coc-go-data/tools/pkg/mod/golang.org/x/tools@v0.0.0-20201105173854-bc9fc8d8c4bc/internal/lsp/browser/browser.go b/.config/coc/extensions/coc-go-data/tools/pkg/mod/golang.org/x/tools@v0.0.0-20201105173854-bc9fc8d8c4bc/internal/lsp/browser/browser.go
new file mode 100644 (file)
index 0000000..6867c85
--- /dev/null
@@ -0,0 +1,67 @@
+// 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"
+       "time"
+)
+
+// 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:
+               if os.Getenv("DISPLAY") != "" {
+                       // xdg-open is only for use in a desktop environment.
+                       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 && appearsSuccessful(cmd, 3*time.Second) {
+                       return true
+               }
+       }
+       return false
+}
+
+// appearsSuccessful reports whether the command appears to have run successfully.
+// If the command runs longer than the timeout, it's deemed successful.
+// If the command runs within the timeout, it's deemed successful if it exited cleanly.
+func appearsSuccessful(cmd *exec.Cmd, timeout time.Duration) bool {
+       errc := make(chan error, 1)
+       go func() {
+               errc <- cmd.Wait()
+       }()
+
+       select {
+       case <-time.After(timeout):
+               return true
+       case err := <-errc:
+               return err == nil
+       }
+}