fix(sympath): walk symbolic links one once

Signed-off-by: Matthew Fisher <matt.fisher@microsoft.com>
pull/6702/head
Matthew Fisher 5 years ago
parent c3e356faba
commit ee8cd8bffb
No known key found for this signature in database
GPG Key ID: 92AA783CBAAE8E3B

@ -73,9 +73,10 @@ func symwalk(path string, info os.FileInfo, walkFn filepath.WalkFunc) error {
if info, err = os.Lstat(resolved); err != nil { if info, err = os.Lstat(resolved); err != nil {
return err return err
} }
if err := symwalk(resolved, info, walkFn); err != nil && err != filepath.SkipDir { if err := symwalk(path, info, walkFn); err != nil && err != filepath.SkipDir {
return err return err
} }
return nil
} }
if err := walkFn(path, info, nil); err != nil { if err := walkFn(path, info, nil); err != nil {

@ -27,36 +27,45 @@ import (
) )
type Node struct { type Node struct {
name string name string
entries []*Node // nil if the entry is a file entries []*Node // nil if the entry is a file
mark int marks int
expectedMarks int
symLinkedTo string
} }
var tree = &Node{ var tree = &Node{
"testdata", "testdata",
[]*Node{ []*Node{
{"a", nil, 0}, {"a", nil, 0, 1, ""},
{"b", []*Node{}, 0}, {"b", []*Node{}, 0, 1, ""},
{"c", nil, 0}, {"c", nil, 0, 2, ""},
{"d", nil, 0, 0, "c"},
{ {
"d", "e",
[]*Node{ []*Node{
{"x", nil, 0}, {"x", nil, 0, 1, ""},
{"y", []*Node{}, 0}, {"y", []*Node{}, 0, 1, ""},
{ {
"z", "z",
[]*Node{ []*Node{
{"u", nil, 0}, {"u", nil, 0, 1, ""},
{"v", nil, 0}, {"v", nil, 0, 1, ""},
{"w", nil, 0}, {"w", nil, 0, 1, ""},
}, },
0, 0,
1,
"",
}, },
}, },
0, 0,
1,
"",
}, },
}, },
0, 0,
1,
"",
} }
func walkTree(n *Node, path string, f func(path string, n *Node)) { func walkTree(n *Node, path string, f func(path string, n *Node)) {
@ -69,24 +78,32 @@ func walkTree(n *Node, path string, f func(path string, n *Node)) {
func makeTree(t *testing.T) { func makeTree(t *testing.T) {
walkTree(tree, tree.name, func(path string, n *Node) { walkTree(tree, tree.name, func(path string, n *Node) {
if n.entries == nil { if n.entries == nil {
fd, err := os.Create(path) if n.symLinkedTo != "" {
if err != nil { if err := os.Symlink(n.symLinkedTo, path); err != nil {
t.Errorf("makeTree: %v", err) t.Fatalf("makeTree: %v", err)
return }
} else {
fd, err := os.Create(path)
if err != nil {
t.Fatalf("makeTree: %v", err)
return
}
fd.Close()
} }
fd.Close()
} else { } else {
os.Mkdir(path, 0770) if err := os.Mkdir(path, 0770); err != nil {
t.Fatalf("makeTree: %v", err)
}
} }
}) })
} }
func checkMarks(t *testing.T, report bool) { func checkMarks(t *testing.T, report bool) {
walkTree(tree, tree.name, func(path string, n *Node) { walkTree(tree, tree.name, func(path string, n *Node) {
if n.mark != 1 && report { if n.marks != n.expectedMarks && report {
t.Errorf("node %s mark = %d; expected 1", path, n.mark) t.Errorf("node %s mark = %d; expected %d", path, n.marks, n.expectedMarks)
} }
n.mark = 0 n.marks = 0
}) })
} }
@ -104,7 +121,7 @@ func mark(info os.FileInfo, err error, errors *[]error, clear bool) error {
name := info.Name() name := info.Name()
walkTree(tree, tree.name, func(path string, n *Node) { walkTree(tree, tree.name, func(path string, n *Node) {
if n.name == name { if n.name == name {
n.mark++ n.marks++
} }
}) })
return nil return nil

Loading…
Cancel
Save