From 2fb28e008dee69dbadfc5c74a0d9000d5bdb3581 Mon Sep 17 00:00:00 2001 From: Ben Clayton Date: Fri, 29 Apr 2022 11:18:43 +0000 Subject: [PATCH] tools: Extract getDawnRoot() from run-cts to utils This is needed elsewhere. Rename location.go to paths.go, as this is really dealing with file paths. Bug: dawn:1342 Change-Id: Ifdbfafc0fd763ac7ec2b8f692efc35772c4793da Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/87704 Reviewed-by: Antonio Maiorano Commit-Queue: Ben Clayton --- src/dawn/node/tools/src/cmd/run-cts/main.go | 80 +++++-------------- tools/src/utils/location.go | 39 --------- tools/src/utils/paths.go | 77 ++++++++++++++++++ .../utils/{location_test.go => paths_test.go} | 17 +++- 4 files changed, 114 insertions(+), 99 deletions(-) delete mode 100644 tools/src/utils/location.go create mode 100644 tools/src/utils/paths.go rename tools/src/utils/{location_test.go => paths_test.go} (69%) diff --git a/src/dawn/node/tools/src/cmd/run-cts/main.go b/src/dawn/node/tools/src/cmd/run-cts/main.go index 7ab76825a1..d76b0754c1 100644 --- a/src/dawn/node/tools/src/cmd/run-cts/main.go +++ b/src/dawn/node/tools/src/cmd/run-cts/main.go @@ -39,6 +39,7 @@ import ( "time" "unicode/utf8" + "dawn.googlesource.com/dawn/tools/src/utils" "github.com/mattn/go-colorable" "github.com/mattn/go-isatty" ) @@ -1160,24 +1161,22 @@ func saveExpectations(path string, ex testcaseStatuses) error { // directory, falling back to PATH. This is used as the default for the --node // command line flag. func defaultNodePath() string { - if dir := thisDir(); dir != "" { - if dawnRoot := getDawnRoot(); dawnRoot != "" { - node := filepath.Join(dawnRoot, "third_party/node") - if info, err := os.Stat(node); err == nil && info.IsDir() { - path := "" - switch fmt.Sprintf("%v/%v", runtime.GOOS, runtime.GOARCH) { // See `go tool dist list` - case "darwin/amd64": - path = filepath.Join(node, "node-darwin-x64/bin/node") - case "darwin/arm64": - path = filepath.Join(node, "node-darwin-arm64/bin/node") - case "linux/amd64": - path = filepath.Join(node, "node-linux-x64/bin/node") - case "windows/amd64": - path = filepath.Join(node, "node.exe") - } - if _, err := os.Stat(path); err == nil { - return path - } + if dawnRoot := utils.DawnRoot(); dawnRoot != "" { + node := filepath.Join(dawnRoot, "third_party/node") + if info, err := os.Stat(node); err == nil && info.IsDir() { + path := "" + switch fmt.Sprintf("%v/%v", runtime.GOOS, runtime.GOARCH) { // See `go tool dist list` + case "darwin/amd64": + path = filepath.Join(node, "node-darwin-x64/bin/node") + case "darwin/arm64": + path = filepath.Join(node, "node-darwin-arm64/bin/node") + case "linux/amd64": + path = filepath.Join(node, "node-linux-x64/bin/node") + case "windows/amd64": + path = filepath.Join(node, "node.exe") + } + if _, err := os.Stat(path); err == nil { + return path } } } @@ -1192,52 +1191,15 @@ func defaultNodePath() string { // defaultCtsPath looks for the webgpu-cts directory in dawn's third_party // directory. This is used as the default for the --cts command line flag. func defaultCtsPath() string { - if dir := thisDir(); dir != "" { - if dawnRoot := getDawnRoot(); dawnRoot != "" { - cts := filepath.Join(dawnRoot, "third_party/webgpu-cts") - if info, err := os.Stat(cts); err == nil && info.IsDir() { - return cts - } + if dawnRoot := utils.DawnRoot(); dawnRoot != "" { + cts := filepath.Join(dawnRoot, "third_party/webgpu-cts") + if info, err := os.Stat(cts); err == nil && info.IsDir() { + return cts } } - return "" } -// getDawnRoot returns the path to the dawn project's root directory or empty -// string if not found. -func getDawnRoot() string { - return getPathOfFileInParentDirs(thisDir(), "DEPS") -} - -// getPathOfFileInParentDirs looks for file with `name` in paths starting from -// `path`, and up into parent directories, returning the clean path in which the -// file is found, or empty string if not found. -func getPathOfFileInParentDirs(path string, name string) string { - sep := string(filepath.Separator) - path, _ = filepath.Abs(path) - numDirs := strings.Count(path, sep) + 1 - for i := 0; i < numDirs; i++ { - test := filepath.Join(path, name) - if _, err := os.Stat(test); err == nil { - return filepath.Clean(path) - } - - path = path + sep + ".." - } - return "" -} - -// thisDir returns the path to the directory that holds the .go file of the -// caller function -func thisDir() string { - _, file, _, ok := runtime.Caller(1) - if !ok { - return "" - } - return filepath.Dir(file) -} - type muxWriter struct { data chan []byte err chan error diff --git a/tools/src/utils/location.go b/tools/src/utils/location.go deleted file mode 100644 index ee1fee91a8..0000000000 --- a/tools/src/utils/location.go +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright 2022 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 utils - -import ( - "fmt" - "path/filepath" - "runtime" -) - -// ThisLine returns the filepath and line number of the calling function -func ThisLine() string { - _, file, line, ok := runtime.Caller(1) - if !ok { - return "" - } - return fmt.Sprintf("%v:%v", file, line) -} - -// ThisDir returns the directory of the caller function -func ThisDir() string { - _, file, _, ok := runtime.Caller(1) - if !ok { - return "" - } - return filepath.Dir(file) -} diff --git a/tools/src/utils/paths.go b/tools/src/utils/paths.go new file mode 100644 index 0000000000..bc7a9099d6 --- /dev/null +++ b/tools/src/utils/paths.go @@ -0,0 +1,77 @@ +// Copyright 2022 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 utils + +import ( + "fmt" + "os" + "path/filepath" + "runtime" + "strings" +) + +// ThisLine returns the filepath and line number of the calling function +func ThisLine() string { + _, file, line, ok := runtime.Caller(1) + if !ok { + return "" + } + return fmt.Sprintf("%v:%v", file, line) +} + +// ThisDir returns the directory of the caller function +func ThisDir() string { + _, file, _, ok := runtime.Caller(1) + if !ok { + return "" + } + return filepath.Dir(file) +} + +// DawnRoot returns the path to the dawn project's root directory or empty +// string if not found. +func DawnRoot() string { + return pathOfFileInParentDirs(ThisDir(), "DEPS") +} + +// pathOfFileInParentDirs looks for file with `name` in paths starting from +// `path`, and up into parent directories, returning the clean path in which the +// file is found, or empty string if not found. +func pathOfFileInParentDirs(path string, name string) string { + sep := string(filepath.Separator) + path, _ = filepath.Abs(path) + numDirs := strings.Count(path, sep) + 1 + for i := 0; i < numDirs; i++ { + test := filepath.Join(path, name) + if _, err := os.Stat(test); err == nil { + return filepath.Clean(path) + } + + path = path + sep + ".." + } + return "" +} + +// ExpandHome returns the string with all occurrences of '~' replaced with the +// user's home directory. The the user's home directory cannot be found, then +// the input string is returned. +func ExpandHome(path string) string { + if strings.ContainsRune(path, '~') { + if home, err := os.UserHomeDir(); err == nil { + return strings.ReplaceAll(path, "~", home) + } + } + return path +} diff --git a/tools/src/utils/location_test.go b/tools/src/utils/paths_test.go similarity index 69% rename from tools/src/utils/location_test.go rename to tools/src/utils/paths_test.go index 933aebaf6f..998b79e56e 100644 --- a/tools/src/utils/location_test.go +++ b/tools/src/utils/paths_test.go @@ -15,15 +15,17 @@ package utils_test import ( + "path/filepath" "strings" "testing" "dawn.googlesource.com/dawn/tools/src/utils" + "github.com/google/go-cmp/cmp" ) func TestThisLine(t *testing.T) { td := utils.ThisLine() - if !strings.HasSuffix(td, "location_test.go:25") { + if !strings.HasSuffix(td, "paths_test.go:27") { t.Errorf("TestThisLine() returned %v", td) } } @@ -34,3 +36,16 @@ func TestThisDir(t *testing.T) { t.Errorf("ThisDir() returned %v", td) } } + +func TestDawnRoot(t *testing.T) { + dr := utils.DawnRoot() + rel, err := filepath.Rel(dr, utils.ThisDir()) + if err != nil { + t.Fatalf("%v", err) + } + got := filepath.ToSlash(rel) + expect := `tools/src/utils` + if diff := cmp.Diff(got, expect); diff != "" { + t.Errorf("DawnRoot() returned %v.\n%v", dr, diff) + } +}