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 / cmd / present / main.go
diff --git a/.config/coc/extensions/coc-go-data/tools/pkg/mod/golang.org/x/tools@v0.0.0-20201105173854-bc9fc8d8c4bc/cmd/present/main.go b/.config/coc/extensions/coc-go-data/tools/pkg/mod/golang.org/x/tools@v0.0.0-20201105173854-bc9fc8d8c4bc/cmd/present/main.go
new file mode 100644 (file)
index 0000000..cc04c46
--- /dev/null
@@ -0,0 +1,155 @@
+// Copyright 2013 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 main
+
+import (
+       "flag"
+       "fmt"
+       "go/build"
+       "log"
+       "net"
+       "net/http"
+       "net/url"
+       "os"
+       "strings"
+
+       "golang.org/x/tools/present"
+)
+
+const basePkg = "golang.org/x/tools/cmd/present"
+
+var (
+       httpAddr      = flag.String("http", "127.0.0.1:3999", "HTTP service address (e.g., '127.0.0.1:3999')")
+       originHost    = flag.String("orighost", "", "host component of web origin URL (e.g., 'localhost')")
+       basePath      = flag.String("base", "", "base path for slide template and static resources")
+       contentPath   = flag.String("content", ".", "base path for presentation content")
+       usePlayground = flag.Bool("use_playground", false, "run code snippets using play.golang.org; if false, run them locally and deliver results by WebSocket transport")
+       nativeClient  = flag.Bool("nacl", false, "use Native Client environment playground (prevents non-Go code execution) when using local WebSocket transport")
+)
+
+func main() {
+       flag.BoolVar(&present.PlayEnabled, "play", true, "enable playground (permit execution of arbitrary user code)")
+       flag.BoolVar(&present.NotesEnabled, "notes", false, "enable presenter notes (press 'N' from the browser to display them)")
+       flag.Parse()
+
+       if os.Getenv("GAE_ENV") == "standard" {
+               log.Print("Configuring for App Engine Standard")
+               port := os.Getenv("PORT")
+               if port == "" {
+                       port = "8080"
+               }
+               *httpAddr = fmt.Sprintf("0.0.0.0:%s", port)
+               pwd, err := os.Getwd()
+               if err != nil {
+                       log.Fatalf("Couldn't get pwd: %v\n", err)
+               }
+               *basePath = pwd
+               *usePlayground = true
+               *contentPath = "./content/"
+       }
+
+       if *basePath == "" {
+               p, err := build.Default.Import(basePkg, "", build.FindOnly)
+               if err != nil {
+                       fmt.Fprintf(os.Stderr, "Couldn't find gopresent files: %v\n", err)
+                       fmt.Fprintf(os.Stderr, basePathMessage, basePkg)
+                       os.Exit(1)
+               }
+               *basePath = p.Dir
+       }
+       err := initTemplates(*basePath)
+       if err != nil {
+               log.Fatalf("Failed to parse templates: %v", err)
+       }
+
+       ln, err := net.Listen("tcp", *httpAddr)
+       if err != nil {
+               log.Fatal(err)
+       }
+       defer ln.Close()
+
+       _, port, err := net.SplitHostPort(ln.Addr().String())
+       if err != nil {
+               log.Fatal(err)
+       }
+
+       origin := &url.URL{Scheme: "http"}
+       if *originHost != "" {
+               if strings.HasPrefix(*originHost, "https://") {
+                       *originHost = strings.TrimPrefix(*originHost, "https://")
+                       origin.Scheme = "https"
+               }
+               *originHost = strings.TrimPrefix(*originHost, "http://")
+               origin.Host = net.JoinHostPort(*originHost, port)
+       } else if ln.Addr().(*net.TCPAddr).IP.IsUnspecified() {
+               name, _ := os.Hostname()
+               origin.Host = net.JoinHostPort(name, port)
+       } else {
+               reqHost, reqPort, err := net.SplitHostPort(*httpAddr)
+               if err != nil {
+                       log.Fatal(err)
+               }
+               if reqPort == "0" {
+                       origin.Host = net.JoinHostPort(reqHost, port)
+               } else {
+                       origin.Host = *httpAddr
+               }
+       }
+
+       initPlayground(*basePath, origin)
+       http.Handle("/static/", http.FileServer(http.Dir(*basePath)))
+
+       if !ln.Addr().(*net.TCPAddr).IP.IsLoopback() &&
+               present.PlayEnabled && !*nativeClient && !*usePlayground {
+               log.Print(localhostWarning)
+       }
+
+       log.Printf("Open your web browser and visit %s", origin.String())
+       if present.NotesEnabled {
+               log.Println("Notes are enabled, press 'N' from the browser to display them.")
+       }
+       log.Fatal(http.Serve(ln, nil))
+}
+
+func environ(vars ...string) []string {
+       env := os.Environ()
+       for _, r := range vars {
+               k := strings.SplitAfter(r, "=")[0]
+               var found bool
+               for i, v := range env {
+                       if strings.HasPrefix(v, k) {
+                               env[i] = r
+                               found = true
+                       }
+               }
+               if !found {
+                       env = append(env, r)
+               }
+       }
+       return env
+}
+
+const basePathMessage = `
+By default, gopresent locates the slide template files and associated
+static content by looking for a %q package
+in your Go workspaces (GOPATH).
+
+You may use the -base flag to specify an alternate location.
+`
+
+const localhostWarning = `
+WARNING!  WARNING!  WARNING!
+
+The present server appears to be listening on an address that is not localhost
+and is configured to run code snippets locally. Anyone with access to this address
+and port will have access to this machine as the user running present.
+
+To avoid this message, listen on localhost, run with -play=false, or run with
+-play_socket=false.
+
+If you don't understand this message, hit Control-C to terminate this process.
+
+WARNING!  WARNING!  WARNING!
+`