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:
parent
ad0602fbf2
commit
2fb28e008d
|
@ -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
|
||||||
|
|
|
@ -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)
|
|
||||||
}
|
|
|
@ -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
|
||||||
|
}
|
|
@ -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)
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue