| 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") | 
 | } |