pkg/plugins: fix compatibility with go1.16

commit c55a4ac779 changed the ioutil utilities
to use the new os variants, per recommendation from the go 1.16 release notes:
https://golang.org/doc/go1.16#ioutil

> we encourage new code to use the new definitions in the io and os packages.
> Here is a list of the new locations of the names exported by io/ioutil:

However, the devil is in the detail, and io.ReadDir() is not a direct
replacement for ioutil.ReadDir();

> ReadDir => os.ReadDir (note: returns a slice of os.DirEntry rather than a slice of fs.FileInfo)

go1.16 added a io.FileInfoToDirEntry() utility to concert a DirEntry to
a FileInfo, but it's not available in go1.16

This patch copies the FileInfoToDirEntry code, and uses it for go1.16.

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
This commit is contained in:
Sebastiaan van Stijn 2021-08-27 23:52:39 +02:00
parent 7bdf98276c
commit 303ea8e820
No known key found for this signature in database
GPG key ID: 76698F39D527CE8C
3 changed files with 56 additions and 2 deletions

View file

@ -3,7 +3,6 @@ package plugins // import "github.com/docker/docker/pkg/plugins"
import (
"encoding/json"
"fmt"
"io/fs"
"net/url"
"os"
"path/filepath"
@ -41,7 +40,7 @@ func Scan() ([]string, error) {
continue
}
entry = fs.FileInfoToDirEntry(fi)
entry = fileInfoToDirEntry(fi)
}
if entry.Type()&os.ModeSocket != 0 {

8
pkg/plugins/utils.go Normal file
View file

@ -0,0 +1,8 @@
//go:build go1.17
// +build go1.17
package plugins
import "io/fs"
var fileInfoToDirEntry = fs.FileInfoToDirEntry

View file

@ -0,0 +1,47 @@
//go:build !go1.17
// +build !go1.17
// This code is taken from https://github.com/golang/go/blob/go1.17/src/io/fs/readdir.go#L49-L77
// and provides the io/fs.FileInfoToDirEntry() utility for go1.16. Go 1.16 and up
// provide a new implementation of ioutil.ReadDir() (in os.ReadDir()) that returns
// an os.DirEntry instead of fs.FileInfo. go1.17 added the io/fs.FileInfoToDirEntry()
// utility to allow existing uses of ReadDir() to get the old type. This utility
// is not available in go1.16, so we copied it to assist the migration to os.ReadDir().
// Copyright 2020 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package plugins
import "os"
// dirInfo is a DirEntry based on a FileInfo.
type dirInfo struct {
fileInfo os.FileInfo
}
func (di dirInfo) IsDir() bool {
return di.fileInfo.IsDir()
}
func (di dirInfo) Type() os.FileMode {
return di.fileInfo.Mode().Type()
}
func (di dirInfo) Info() (os.FileInfo, error) {
return di.fileInfo, nil
}
func (di dirInfo) Name() string {
return di.fileInfo.Name()
}
// fileInfoToDirEntry returns a DirEntry that returns information from info.
// If info is nil, fileInfoToDirEntry returns nil.
func fileInfoToDirEntry(info os.FileInfo) os.DirEntry {
if info == nil {
return nil
}
return dirInfo{fileInfo: info}
}