diff --git a/internal/tools/common.go b/internal/tools/common.go new file mode 100644 index 00000000000..7ed489a0b73 --- /dev/null +++ b/internal/tools/common.go @@ -0,0 +1,57 @@ +// 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 + } +} diff --git a/internal/tools/crosslink/crosslink.go b/internal/tools/crosslink/crosslink.go index 914569b3d7e..a229bfa6db0 100644 --- a/internal/tools/crosslink/crosslink.go +++ b/internal/tools/crosslink/crosslink.go @@ -35,37 +35,12 @@ import ( "path/filepath" "strings" "text/tabwriter" + + "go.opentelemetry.io/otel/internal/tools" ) type repo string -func findRepoRoot() (repo, 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 repo(dir), nil - } -} - type mod struct { filePath string importPath string @@ -157,11 +132,13 @@ func (m mods) crossLink() error { } func main() { - repoRoot, err := findRepoRoot() + repoRootStr, err := tools.FindRepoRoot() if err != nil { log.Fatalf("unable to find repo root: %v", err) } + repoRoot := repo(repoRootStr) + mods, err := repoRoot.findModules() if err != nil { log.Fatalf("unable to list modules: %v", err) diff --git a/internal/tools/semconv-gen/generator.go b/internal/tools/semconv-gen/generator.go index 9a9bbf8f747..52efb029175 100644 --- a/internal/tools/semconv-gen/generator.go +++ b/internal/tools/semconv-gen/generator.go @@ -23,13 +23,14 @@ import ( "os" "os/exec" "path" - "path/filepath" "regexp" "sort" "strings" flag "github.com/spf13/pflag" "golang.org/x/mod/semver" + + "go.opentelemetry.io/otel/internal/tools" ) func main() { @@ -102,7 +103,7 @@ func validateConfig(cfg config) (config, error) { } if !path.IsAbs(cfg.outputPath) { - root, err := findRepoRoot() + root, err := tools.FindRepoRoot() if err != nil { return config{}, err } @@ -257,33 +258,6 @@ func checkoutSpecToDir(cfg config, toDir string) (doneFunc func(), err error) { return doneFunc, nil } -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 - } -} - var capitalizations = []string{ "ACL", "AIX",