mirror of
https://github.com/golang/go
synced 2024-11-15 02:40:32 -07:00
[release-branch.go1.2] os: do not return Lstat errors from Readdir
««« CL 18870043 / eca0ca43a863 os: do not return Lstat errors from Readdir This CL restores the Go 1.1.2 semantics for os.File's Readdir method. The code in Go 1.1.2 was rewritten mainly because it looked buggy. This new version attempts to be clearer but still provide the 1.1.2 results. The important diff is not this CL's version against tip but this CL's version against Go 1.1.2. Go 1.1.2: names, err := f.Readdirnames(n) fi = make([]FileInfo, len(names)) for i, filename := range names { fip, err := Lstat(dirname + filename) if err == nil { fi[i] = fip } else { fi[i] = &fileStat{name: filename} } } return fi, err This CL: names, err := f.Readdirnames(n) fi = make([]FileInfo, len(names)) for i, filename := range names { fip, lerr := lstat(dirname + filename) if lerr != nil { fi[i] = &fileStat{name: filename} continue } fi[i] = fip } return fi, err The changes from Go 1.1.2 are stylistic, not semantic: 1. Use lstat instead of Lstat, for testing (done before this CL). 2. Make error handling in loop body look more like an error case. 3. Use separate error variable name in loop body, to be clear we are not trying to influence the final return result. Fixes #6656. Fixes #6680. R=golang-dev, bradfitz CC=golang-dev https://golang.org/cl/18870043 »»» R=golang-dev CC=golang-dev https://golang.org/cl/20110045
This commit is contained in:
parent
d4bc355c56
commit
a4085fdf10
@ -165,14 +165,11 @@ func (f *File) readdir(n int) (fi []FileInfo, err error) {
|
||||
fi = make([]FileInfo, len(names))
|
||||
for i, filename := range names {
|
||||
fip, lerr := lstat(dirname + filename)
|
||||
if lerr == nil {
|
||||
fi[i] = fip
|
||||
} else {
|
||||
if lerr != nil {
|
||||
fi[i] = &fileStat{name: filename}
|
||||
if err == nil {
|
||||
err = lerr
|
||||
}
|
||||
continue
|
||||
}
|
||||
fi[i] = fip
|
||||
}
|
||||
return fi, err
|
||||
}
|
||||
|
@ -92,8 +92,8 @@ func TestReaddirWithBadLstat(t *testing.T) {
|
||||
defer func() { *LstatP = Lstat }()
|
||||
|
||||
dirs, err := handle.Readdir(-1)
|
||||
if err != ErrInvalid {
|
||||
t.Fatalf("Expected Readdir to return ErrInvalid, got %v", err)
|
||||
if err != nil {
|
||||
t.Fatalf("Expected Readdir to return no error, got %v", err)
|
||||
}
|
||||
foundfail := false
|
||||
for _, dir := range dirs {
|
||||
|
Loading…
Reference in New Issue
Block a user