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 <amaiorano@google.com>
Commit-Queue: Ben Clayton <bclayton@google.com>
This commit is contained in:
Ben Clayton 2022-04-29 11:18:43 +00:00 committed by Dawn LUCI CQ
parent ad0602fbf2
commit 2fb28e008d
4 changed files with 114 additions and 99 deletions

View File

@ -39,6 +39,7 @@ import (
"time" "time"
"unicode/utf8" "unicode/utf8"
"dawn.googlesource.com/dawn/tools/src/utils"
"github.com/mattn/go-colorable" "github.com/mattn/go-colorable"
"github.com/mattn/go-isatty" "github.com/mattn/go-isatty"
) )
@ -1160,8 +1161,7 @@ func saveExpectations(path string, ex testcaseStatuses) error {
// directory, falling back to PATH. This is used as the default for the --node // directory, falling back to PATH. This is used as the default for the --node
// command line flag. // command line flag.
func defaultNodePath() string { func defaultNodePath() string {
if dir := thisDir(); dir != "" { if dawnRoot := utils.DawnRoot(); dawnRoot != "" {
if dawnRoot := getDawnRoot(); dawnRoot != "" {
node := filepath.Join(dawnRoot, "third_party/node") node := filepath.Join(dawnRoot, "third_party/node")
if info, err := os.Stat(node); err == nil && info.IsDir() { if info, err := os.Stat(node); err == nil && info.IsDir() {
path := "" path := ""
@ -1180,7 +1180,6 @@ func defaultNodePath() string {
} }
} }
} }
}
if path, err := exec.LookPath("node"); err == nil { if path, err := exec.LookPath("node"); err == nil {
return path return path
@ -1192,52 +1191,15 @@ func defaultNodePath() string {
// defaultCtsPath looks for the webgpu-cts directory in dawn's third_party // 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. // directory. This is used as the default for the --cts command line flag.
func defaultCtsPath() string { func defaultCtsPath() string {
if dir := thisDir(); dir != "" { if dawnRoot := utils.DawnRoot(); dawnRoot != "" {
if dawnRoot := getDawnRoot(); dawnRoot != "" {
cts := filepath.Join(dawnRoot, "third_party/webgpu-cts") cts := filepath.Join(dawnRoot, "third_party/webgpu-cts")
if info, err := os.Stat(cts); err == nil && info.IsDir() { if info, err := os.Stat(cts); err == nil && info.IsDir() {
return cts return cts
} }
} }
}
return "" 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 { type muxWriter struct {
data chan []byte data chan []byte
err chan error err chan error

View File

@ -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)
}

77
tools/src/utils/paths.go Normal file
View File

@ -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
}

View File

@ -15,15 +15,17 @@
package utils_test package utils_test
import ( import (
"path/filepath"
"strings" "strings"
"testing" "testing"
"dawn.googlesource.com/dawn/tools/src/utils" "dawn.googlesource.com/dawn/tools/src/utils"
"github.com/google/go-cmp/cmp"
) )
func TestThisLine(t *testing.T) { func TestThisLine(t *testing.T) {
td := utils.ThisLine() 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) t.Errorf("TestThisLine() returned %v", td)
} }
} }
@ -34,3 +36,16 @@ func TestThisDir(t *testing.T) {
t.Errorf("ThisDir() returned %v", td) 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)
}
}