summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Gerrand <adg@golang.org>2013-11-01 11:26:31 +1100
committerAndrew Gerrand <adg@golang.org>2013-11-01 11:26:31 +1100
commitb2c6aac6c47eab505e3e9fa0cf9c58b841f404fc (patch)
treeb51ad22979fbe3da92e8d1822a7fad94a96465e3
parent4a550d00032bd80f7c3b685370ece7fa9094eb5a (diff)
downloadgo-b2c6aac6c47eab505e3e9fa0cf9c58b841f404fc.tar.gz
[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 issue 6656. Fixes issue 6680. R=golang-dev, bradfitz CC=golang-dev https://codereview.appspot.com/18870043 ??? R=golang-dev CC=golang-dev https://codereview.appspot.com/20110045
-rw-r--r--src/pkg/os/file_unix.go9
-rw-r--r--src/pkg/os/os_unix_test.go4
2 files changed, 5 insertions, 8 deletions
diff --git a/src/pkg/os/file_unix.go b/src/pkg/os/file_unix.go
index 376e380bc..ff1a597e7 100644
--- a/src/pkg/os/file_unix.go
+++ b/src/pkg/os/file_unix.go
@@ -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
}
diff --git a/src/pkg/os/os_unix_test.go b/src/pkg/os/os_unix_test.go
index 80d57aa42..b0fc0256d 100644
--- a/src/pkg/os/os_unix_test.go
+++ b/src/pkg/os/os_unix_test.go
@@ -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 {