[tools] Move getProjectRoot() out to fileutils. Add tests. This is going to be used by intrinsic-gen, a new tool Bug: tint:832 Change-Id: Ib22ffa88a699be9c8dfdf3f8f6e32cff4ffc88e3 Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/52602 Commit-Queue: Ben Clayton <bclayton@google.com> Reviewed-by: David Neto <dneto@google.com>
diff --git a/tools/src/cmd/trim-includes/main.go b/tools/src/cmd/trim-includes/main.go index ce195d7..146a6fc 100644 --- a/tools/src/cmd/trim-includes/main.go +++ b/tools/src/cmd/trim-includes/main.go
@@ -30,20 +30,15 @@ "os/exec" "path/filepath" "regexp" - "runtime" "strings" "sync" "time" + "dawn.googlesource.com/tint/tools/src/fileutils" "dawn.googlesource.com/tint/tools/src/glob" ) var ( - // Directory to this .go file - toolRoot = getToolRoot() - // Root directory of the Tint project - projectRoot = getProjectRoot(toolRoot) - // Path to the build script to run after each attempting to remove each // #include buildScript = "" @@ -104,7 +99,7 @@ } fmt.Println("Scanning for files...") - paths, err := glob.Scan(projectRoot, cfg) + paths, err := glob.Scan(fileutils.ProjectRoot(), cfg) if err != nil { return err } @@ -235,7 +230,7 @@ // Runs git add on the file func (f *file) stage() error { - err := exec.Command("git", "-C", projectRoot, "add", f.path).Run() + err := exec.Command("git", "-C", fileutils.ProjectRoot(), "add", f.path).Run() if err != nil { return fmt.Errorf("Couldn't stage file '%v': %w", f.path, err) } @@ -250,7 +245,7 @@ files := make([]file, len(paths)) errs := make([]error, len(paths)) for i, path := range paths { - i, path := i, filepath.Join(projectRoot, path) + i, path := i, filepath.Join(fileutils.ProjectRoot(), path) go func() { defer wg.Done() body, err := ioutil.ReadFile(path) @@ -271,25 +266,3 @@ } return files, nil } - -// Returns the path to the directory holding this .go file -func getToolRoot() string { - _, filename, _, ok := runtime.Caller(0) - if !ok { - panic("No caller information") - } - mainPath, err := filepath.Abs(filename) - if err != nil { - panic(err) - } - return filepath.Dir(mainPath) -} - -// Returns the path to the project root -func getProjectRoot(toolRoot string) string { - root, err := filepath.Abs(filepath.Join(toolRoot, "../..")) - if err != nil { - panic(err) - } - return root -}
diff --git a/tools/src/fileutils/fileutils.go b/tools/src/fileutils/fileutils.go index 7410086..8647193 100644 --- a/tools/src/fileutils/fileutils.go +++ b/tools/src/fileutils/fileutils.go
@@ -17,6 +17,8 @@ import ( "os" + "path/filepath" + "runtime" ) // IsExe returns true if the file at path is an executable @@ -27,3 +29,27 @@ } return s.Mode()&0100 != 0 } + +// GoSourcePath returns the absolute path to the .go file that calls the +// function +func GoSourcePath() string { + _, filename, _, ok := runtime.Caller(1) + if !ok { + panic("No caller information") + } + path, err := filepath.Abs(filename) + if err != nil { + panic(err) + } + return path +} + +// ProjectRoot returns the path to the tint project root +func ProjectRoot() string { + toolRoot := filepath.Dir(GoSourcePath()) + root, err := filepath.Abs(filepath.Join(toolRoot, "../../..")) + if err != nil { + panic(err) + } + return root +}
diff --git a/tools/src/fileutils/fileutils_test.go b/tools/src/fileutils/fileutils_test.go new file mode 100644 index 0000000..696353e --- /dev/null +++ b/tools/src/fileutils/fileutils_test.go
@@ -0,0 +1,38 @@ +// Copyright 2021 The Tint 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 fileutils_test + +import ( + "os" + "path/filepath" + "strings" + "testing" + + "dawn.googlesource.com/tint/tools/src/fileutils" +) + +func TestGoSourcePath(t *testing.T) { + p := fileutils.GoSourcePath() + if !strings.HasSuffix(p, "fileutils/fileutils_test.go") { + t.Errorf("GoSourcePath() returned %v", p) + } +} + +func TestProjectRoot(t *testing.T) { + p := filepath.Join(fileutils.ProjectRoot(), "tint_overrides_with_defaults.gni") + if _, err := os.Stat(p); os.IsNotExist(err) { + t.Errorf("ProjectRoot() returned %v", p) + } +}