// Copyright The OpenTelemetry Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package tools provides helper functions used in scripts within the // internal/tools module, as well as imports needed for a build with the // "tools" build tag. package tools import ( "errors" "fmt" "os" "path/filepath" "strings" ) // FindRepoRoot retrieves the root of the repository containing the current working directory. // Beginning at the current working directory (dir), the algorithm checks if joining the ".git" // suffix, such as "dir.get", is a valid file. Otherwise, it will continue checking the dir's // parent directory until it reaches the repo root or returns an error if it cannot be found. func FindRepoRoot() (string, error) { start, err := os.Getwd() if err != nil { return "", err } dir := start for { _, err := os.Stat(filepath.Join(dir, ".git")) if errors.Is(err, os.ErrNotExist) { dir = filepath.Dir(dir) // From https://golang.org/pkg/path/filepath/#Dir: // The returned path does not end in a separator unless it is the root directory. if strings.HasSuffix(dir, string(filepath.Separator)) { return "", fmt.Errorf("unable to find git repository enclosing working dir %s", start) } continue } if err != nil { return "", err } return dir, nil } }