Skip to content

Commit f1980ef

Browse files
committedDec 9, 2020
all: update to use os.ReadDir where appropriate
os.ReadDir is a replacement for ioutil.ReadDir that returns a slice of fs.DirEntry instead of fs.FileInfo, meaning it is the more efficient form. This CL updates call sites throughout the Go source tree wherever possible. As usual, code built using the Go 1.4 bootstrap toolchain is not included. There is also a use in go/build that appears in the public API and can't be changed, at least not without additional changes. Fixes #42026. Change-Id: Icfc9dd52c6045020f6830e22c72128499462d561 Reviewed-on: https://go-review.googlesource.com/c/go/+/266366 Trust: Russ Cox <[email protected]> Run-TryBot: Russ Cox <[email protected]> TryBot-Result: Go Bot <[email protected]> Reviewed-by: Ian Lance Taylor <[email protected]>
1 parent 4f1b0a4 commit f1980ef

File tree

19 files changed

+91
-94
lines changed

19 files changed

+91
-94
lines changed
 

Diff for: ‎src/cmd/go/internal/clean/clean.go

+1-2
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import (
99
"context"
1010
"fmt"
1111
"io"
12-
"io/ioutil"
1312
"os"
1413
"path/filepath"
1514
"strconv"
@@ -244,7 +243,7 @@ func clean(p *load.Package) {
244243
base.Errorf("%v", p.Error)
245244
return
246245
}
247-
dirs, err := ioutil.ReadDir(p.Dir)
246+
dirs, err := os.ReadDir(p.Dir)
248247
if err != nil {
249248
base.Errorf("go clean %s: %v", p.Dir, err)
250249
return

Diff for: ‎src/cmd/go/internal/imports/scan_test.go

+1-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ package imports
77
import (
88
"bytes"
99
"internal/testenv"
10-
"io/ioutil"
1110
"os"
1211
"path"
1312
"path/filepath"
@@ -58,7 +57,7 @@ func TestScan(t *testing.T) {
5857
func TestScanDir(t *testing.T) {
5958
testenv.MustHaveGoBuild(t)
6059

61-
dirs, err := ioutil.ReadDir("testdata")
60+
dirs, err := os.ReadDir("testdata")
6261
if err != nil {
6362
t.Fatal(err)
6463
}

Diff for: ‎src/cmd/go/internal/load/pkg.go

+3-4
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import (
1515
"go/scanner"
1616
"go/token"
1717
"io/fs"
18-
"io/ioutil"
1918
"os"
2019
"path"
2120
pathpkg "path"
@@ -1296,9 +1295,9 @@ HaveGoMod:
12961295
// Otherwise it is not possible to vendor just a/b/c and still import the
12971296
// non-vendored a/b. See golang.org/issue/13832.
12981297
func hasGoFiles(dir string) bool {
1299-
fis, _ := ioutil.ReadDir(dir)
1300-
for _, fi := range fis {
1301-
if !fi.IsDir() && strings.HasSuffix(fi.Name(), ".go") {
1298+
files, _ := os.ReadDir(dir)
1299+
for _, f := range files {
1300+
if !f.IsDir() && strings.HasSuffix(f.Name(), ".go") {
13021301
return true
13031302
}
13041303
}

Diff for: ‎src/cmd/go/internal/modcmd/vendor.go

+5-6
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import (
1010
"fmt"
1111
"io"
1212
"io/fs"
13-
"io/ioutil"
1413
"os"
1514
"path/filepath"
1615
"sort"
@@ -244,7 +243,7 @@ var metaPrefixes = []string{
244243
}
245244

246245
// matchMetadata reports whether info is a metadata file.
247-
func matchMetadata(dir string, info fs.FileInfo) bool {
246+
func matchMetadata(dir string, info fs.DirEntry) bool {
248247
name := info.Name()
249248
for _, p := range metaPrefixes {
250249
if strings.HasPrefix(name, p) {
@@ -255,7 +254,7 @@ func matchMetadata(dir string, info fs.FileInfo) bool {
255254
}
256255

257256
// matchPotentialSourceFile reports whether info may be relevant to a build operation.
258-
func matchPotentialSourceFile(dir string, info fs.FileInfo) bool {
257+
func matchPotentialSourceFile(dir string, info fs.DirEntry) bool {
259258
if strings.HasSuffix(info.Name(), "_test.go") {
260259
return false
261260
}
@@ -281,16 +280,16 @@ func matchPotentialSourceFile(dir string, info fs.FileInfo) bool {
281280
}
282281

283282
// copyDir copies all regular files satisfying match(info) from src to dst.
284-
func copyDir(dst, src string, match func(dir string, info fs.FileInfo) bool) {
285-
files, err := ioutil.ReadDir(src)
283+
func copyDir(dst, src string, match func(dir string, info fs.DirEntry) bool) {
284+
files, err := os.ReadDir(src)
286285
if err != nil {
287286
base.Fatalf("go mod vendor: %v", err)
288287
}
289288
if err := os.MkdirAll(dst, 0777); err != nil {
290289
base.Fatalf("go mod vendor: %v", err)
291290
}
292291
for _, file := range files {
293-
if file.IsDir() || !file.Mode().IsRegular() || !match(src, file) {
292+
if file.IsDir() || !file.Type().IsRegular() || !match(src, file) {
294293
continue
295294
}
296295
r, err := os.Open(filepath.Join(src, file.Name()))

Diff for: ‎src/cmd/go/internal/modfetch/cache.go

+1-2
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import (
1111
"fmt"
1212
"io"
1313
"io/fs"
14-
"io/ioutil"
1514
"os"
1615
"path/filepath"
1716
"strings"
@@ -598,7 +597,7 @@ func rewriteVersionList(dir string) {
598597
}
599598
defer unlock()
600599

601-
infos, err := ioutil.ReadDir(dir)
600+
infos, err := os.ReadDir(dir)
602601
if err != nil {
603602
return
604603
}

Diff for: ‎src/cmd/go/internal/modload/init.go

+8-9
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import (
1212
"fmt"
1313
"go/build"
1414
"internal/lazyregexp"
15-
"io/ioutil"
1615
"os"
1716
"path"
1817
"path/filepath"
@@ -445,13 +444,13 @@ func CreateModFile(ctx context.Context, modPath string) {
445444
// this is an existing project. Walking the tree for packages would be more
446445
// accurate, but could take much longer.
447446
empty := true
448-
fis, _ := ioutil.ReadDir(modRoot)
449-
for _, fi := range fis {
450-
name := fi.Name()
447+
files, _ := os.ReadDir(modRoot)
448+
for _, f := range files {
449+
name := f.Name()
451450
if strings.HasPrefix(name, ".") || strings.HasPrefix(name, "_") {
452451
continue
453452
}
454-
if strings.HasSuffix(name, ".go") || fi.IsDir() {
453+
if strings.HasSuffix(name, ".go") || f.IsDir() {
455454
empty = false
456455
break
457456
}
@@ -731,19 +730,19 @@ func findModulePath(dir string) (string, error) {
731730

732731
// Cast about for import comments,
733732
// first in top-level directory, then in subdirectories.
734-
list, _ := ioutil.ReadDir(dir)
733+
list, _ := os.ReadDir(dir)
735734
for _, info := range list {
736-
if info.Mode().IsRegular() && strings.HasSuffix(info.Name(), ".go") {
735+
if info.Type().IsRegular() && strings.HasSuffix(info.Name(), ".go") {
737736
if com := findImportComment(filepath.Join(dir, info.Name())); com != "" {
738737
return com, nil
739738
}
740739
}
741740
}
742741
for _, info1 := range list {
743742
if info1.IsDir() {
744-
files, _ := ioutil.ReadDir(filepath.Join(dir, info1.Name()))
743+
files, _ := os.ReadDir(filepath.Join(dir, info1.Name()))
745744
for _, info2 := range files {
746-
if info2.Mode().IsRegular() && strings.HasSuffix(info2.Name(), ".go") {
745+
if info2.Type().IsRegular() && strings.HasSuffix(info2.Name(), ".go") {
747746
if com := findImportComment(filepath.Join(dir, info1.Name(), info2.Name())); com != "" {
748747
return path.Dir(com), nil
749748
}

Diff for: ‎src/cmd/go/internal/test/test.go

+8-4
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import (
1313
"go/build"
1414
"io"
1515
"io/fs"
16-
"io/ioutil"
1716
"os"
1817
"os/exec"
1918
"path"
@@ -1561,13 +1560,18 @@ func hashOpen(name string) (cache.ActionID, error) {
15611560
}
15621561
hashWriteStat(h, info)
15631562
if info.IsDir() {
1564-
names, err := ioutil.ReadDir(name)
1563+
files, err := os.ReadDir(name)
15651564
if err != nil {
15661565
fmt.Fprintf(h, "err %v\n", err)
15671566
}
1568-
for _, f := range names {
1567+
for _, f := range files {
15691568
fmt.Fprintf(h, "file %s ", f.Name())
1570-
hashWriteStat(h, f)
1569+
finfo, err := f.Info()
1570+
if err != nil {
1571+
fmt.Fprintf(h, "err %v\n", err)
1572+
} else {
1573+
hashWriteStat(h, finfo)
1574+
}
15711575
}
15721576
} else if info.Mode().IsRegular() {
15731577
// Because files might be very large, do not attempt

Diff for: ‎src/cmd/go/proxy_test.go

+3-4
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import (
1313
"fmt"
1414
"io"
1515
"io/fs"
16-
"io/ioutil"
1716
"log"
1817
"net"
1918
"net/http"
@@ -75,12 +74,12 @@ func StartProxy() {
7574
var modList []module.Version
7675

7776
func readModList() {
78-
infos, err := ioutil.ReadDir("testdata/mod")
77+
files, err := os.ReadDir("testdata/mod")
7978
if err != nil {
8079
log.Fatal(err)
8180
}
82-
for _, info := range infos {
83-
name := info.Name()
81+
for _, f := range files {
82+
name := f.Name()
8483
if !strings.HasSuffix(name, ".txt") {
8584
continue
8685
}

Diff for: ‎src/crypto/x509/root_unix.go

+10-11
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ package x509
88

99
import (
1010
"io/fs"
11-
"io/ioutil"
1211
"os"
1312
"path/filepath"
1413
"strings"
@@ -82,28 +81,28 @@ func loadSystemRoots() (*CertPool, error) {
8281
return nil, firstErr
8382
}
8483

85-
// readUniqueDirectoryEntries is like ioutil.ReadDir but omits
84+
// readUniqueDirectoryEntries is like os.ReadDir but omits
8685
// symlinks that point within the directory.
87-
func readUniqueDirectoryEntries(dir string) ([]fs.FileInfo, error) {
88-
fis, err := ioutil.ReadDir(dir)
86+
func readUniqueDirectoryEntries(dir string) ([]fs.DirEntry, error) {
87+
files, err := os.ReadDir(dir)
8988
if err != nil {
9089
return nil, err
9190
}
92-
uniq := fis[:0]
93-
for _, fi := range fis {
94-
if !isSameDirSymlink(fi, dir) {
95-
uniq = append(uniq, fi)
91+
uniq := files[:0]
92+
for _, f := range files {
93+
if !isSameDirSymlink(f, dir) {
94+
uniq = append(uniq, f)
9695
}
9796
}
9897
return uniq, nil
9998
}
10099

101100
// isSameDirSymlink reports whether fi in dir is a symlink with a
102101
// target not containing a slash.
103-
func isSameDirSymlink(fi fs.FileInfo, dir string) bool {
104-
if fi.Mode()&fs.ModeSymlink == 0 {
102+
func isSameDirSymlink(f fs.DirEntry, dir string) bool {
103+
if f.Type()&fs.ModeSymlink == 0 {
105104
return false
106105
}
107-
target, err := os.Readlink(filepath.Join(dir, fi.Name()))
106+
target, err := os.Readlink(filepath.Join(dir, f.Name()))
108107
return err == nil && !strings.Contains(target, "/")
109108
}

Diff for: ‎src/go/build/deps_test.go

+1-2
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import (
1212
"fmt"
1313
"internal/testenv"
1414
"io/fs"
15-
"io/ioutil"
1615
"os"
1716
"path/filepath"
1817
"runtime"
@@ -597,7 +596,7 @@ func findImports(pkg string) ([]string, error) {
597596
vpkg = "vendor/" + pkg
598597
}
599598
dir := filepath.Join(Default.GOROOT, "src", vpkg)
600-
files, err := ioutil.ReadDir(dir)
599+
files, err := os.ReadDir(dir)
601600
if err != nil {
602601
return nil, err
603602
}

Diff for: ‎src/go/internal/gcimporter/gcimporter_test.go

+2-3
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import (
88
"bytes"
99
"fmt"
1010
"internal/testenv"
11-
"io/ioutil"
1211
"os"
1312
"os/exec"
1413
"path/filepath"
@@ -66,7 +65,7 @@ const maxTime = 30 * time.Second
6665

6766
func testDir(t *testing.T, dir string, endTime time.Time) (nimports int) {
6867
dirname := filepath.Join(runtime.GOROOT(), "pkg", runtime.GOOS+"_"+runtime.GOARCH, dir)
69-
list, err := ioutil.ReadDir(dirname)
68+
list, err := os.ReadDir(dirname)
7069
if err != nil {
7170
t.Fatalf("testDir(%s): %s", dirname, err)
7271
}
@@ -144,7 +143,7 @@ func TestVersionHandling(t *testing.T) {
144143
}
145144

146145
const dir = "./testdata/versions"
147-
list, err := ioutil.ReadDir(dir)
146+
list, err := os.ReadDir(dir)
148147
if err != nil {
149148
t.Fatal(err)
150149
}

Diff for: ‎src/go/internal/srcimporter/srcimporter_test.go

+1-2
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import (
1010
"go/token"
1111
"go/types"
1212
"internal/testenv"
13-
"io/ioutil"
1413
"os"
1514
"path"
1615
"path/filepath"
@@ -59,7 +58,7 @@ func walkDir(t *testing.T, path string, endTime time.Time) (int, bool) {
5958
return 0, false
6059
}
6160

62-
list, err := ioutil.ReadDir(filepath.Join(runtime.GOROOT(), "src", path))
61+
list, err := os.ReadDir(filepath.Join(runtime.GOROOT(), "src", path))
6362
if err != nil {
6463
t.Fatalf("walkDir %s failed (%v)", path, err)
6564
}

Diff for: ‎src/go/parser/error_test.go

+5-5
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ package parser
2525
import (
2626
"go/scanner"
2727
"go/token"
28-
"io/ioutil"
28+
"os"
2929
"path/filepath"
3030
"regexp"
3131
"strings"
@@ -174,13 +174,13 @@ func checkErrors(t *testing.T, filename string, input interface{}) {
174174
}
175175

176176
func TestErrors(t *testing.T) {
177-
list, err := ioutil.ReadDir(testdata)
177+
list, err := os.ReadDir(testdata)
178178
if err != nil {
179179
t.Fatal(err)
180180
}
181-
for _, fi := range list {
182-
name := fi.Name()
183-
if !fi.IsDir() && !strings.HasPrefix(name, ".") && strings.HasSuffix(name, ".src") {
181+
for _, d := range list {
182+
name := d.Name()
183+
if !d.IsDir() && !strings.HasPrefix(name, ".") && strings.HasSuffix(name, ".src") {
184184
checkErrors(t, filepath.Join(testdata, name), nil)
185185
}
186186
}

0 commit comments

Comments
 (0)