blob: 90985c07f2ceb28a6da619dd321cc299bb73aee7 [file] [log] [blame]
// Copyright 2017 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 basedir finds templates and static files associated with a binary.
package basedir
import (
"bytes"
"os"
"os/exec"
"path/filepath"
"runtime"
"strings"
)
// Find locates a directory for the given package.
// pkg should be the directory that contains the templates and/or static directories.
// If pkg cannot be found, an empty string will be returned.
func Find(pkg string) string {
cmd := exec.Command("go", "list", "-e", "-f", "{{.Dir}}", pkg)
if out, err := cmd.Output(); err == nil && len(out) > 0 {
return string(bytes.TrimRight(out, "\r\n"))
}
gopath := os.Getenv("GOPATH")
if gopath == "" {
gopath = defaultGOPATH()
}
if gopath != "" {
for _, dir := range strings.Split(gopath, ":") {
p := filepath.Join(dir, pkg)
if _, err := os.Stat(p); err == nil {
return p
}
}
}
return ""
}
// Copied from go/build/build.go
func defaultGOPATH() string {
env := "HOME"
if runtime.GOOS == "windows" {
env = "USERPROFILE"
} else if runtime.GOOS == "plan9" {
env = "home"
}
if home := os.Getenv(env); home != "" {
def := filepath.Join(home, "go")
if filepath.Clean(def) == filepath.Clean(runtime.GOROOT()) {
// Don't set the default GOPATH to GOROOT,
// as that will trigger warnings from the go tool.
return ""
}
return def
}
return ""
}