blob: ea1fbb24ea6953565ef0597cd3c62e85c785bc8d [file] [log] [blame] [edit]
// Package ws offers functions to get information about Bazel workspaces.
package ws
import (
"os"
"path/filepath"
)
// FindWorkspaceRoot returns the root directory of the Bazel workspace in which the passed root exists, if any.
func FindWorkspaceRoot(root string) string {
for _, boundary := range [...]string{"MODULE.bazel", "REPO.bazel", "WORKSPACE.bazel", "WORKSPACE"} {
if isValidWorkspace(filepath.Join(root, boundary)) {
return root
}
}
parentDirectory := filepath.Dir(root)
if parentDirectory == root {
return ""
}
return FindWorkspaceRoot(parentDirectory)
}
// isValidWorkspace returns true if the supplied path is the workspace root, defined by the presence of
// a file named MODULE.bazel, REPO.bazel, WORKSPACE.bazel, or WORKSPACE
// see https://github.com/bazelbuild/bazel/blob/7.2.1/src/main/cpp/workspace_layout.cc#L34
func isValidWorkspace(path string) bool {
info, err := os.Stat(path)
if err != nil {
return false
}
return !info.IsDir()
}