blob: 0994ac510f7046dcfbf1cbb508cb5613171aa51c [file] [log] [blame] [edit]
package toolbase
import (
"fmt"
"os"
"path"
)
// isWorkspace returns whether a given string is a valid path pointing to a
// Bazel workspace directory.
func isWorkspace(dir string) bool {
w := path.Join(dir, "WORKSPACE")
if _, err := os.Stat(w); err == nil {
return true
}
return false
}
// WorkspaceDirectory returns the workspace directory from which a given
// command line tool is running. This handles the following cases:
//
// 1. The command line tool was invoked via `bazel run`.
// 2. The command line tool was started directly in a workspace directory (but
// not a subdirectory).
//
// If the workspace directory path cannot be inferred based on the above
// assumptions, an error is returned.
func WorkspaceDirectory() (string, error) {
if p := os.Getenv("BUILD_WORKSPACE_DIRECTORY"); p != "" && isWorkspace(p) {
return p, nil
}
if p, err := os.Getwd(); err != nil && isWorkspace(p) {
return p, nil
}
return "", fmt.Errorf("not invoked from `bazel run` and not running in workspace directory")
}