diff --git a/tools/src/cmd/trim-includes/main.go b/tools/src/cmd/trim-includes/main.go index ce195d726c..146a6fc06c 100644 --- a/tools/src/cmd/trim-includes/main.go +++ b/tools/src/cmd/trim-includes/main.go @@ -30,20 +30,15 @@ import ( "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 @@ func run() error { } 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 @@ func (f *file) format() error { // 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 @@ func loadFiles(paths []string) ([]file, error) { 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 @@ func loadFiles(paths []string) ([]file, error) { } 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 7410086439..8647193e0d 100644 --- a/tools/src/fileutils/fileutils.go +++ b/tools/src/fileutils/fileutils.go @@ -17,6 +17,8 @@ package fileutils import ( "os" + "path/filepath" + "runtime" ) // IsExe returns true if the file at path is an executable @@ -27,3 +29,27 @@ func IsExe(path string) bool { } 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 0000000000..696353eed5 --- /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) + } +}