Kaynağa Gözat

Merge pull request #42797 from thaJeztah/go116_compat

pkg/plugins: fix compatibility with go1.16
Brian Goff 3 yıl önce
ebeveyn
işleme
94e00d09da
3 değiştirilmiş dosya ile 56 ekleme ve 2 silme
  1. 1 2
      pkg/plugins/discovery.go
  2. 8 0
      pkg/plugins/utils.go
  3. 47 0
      pkg/plugins/utils_go1.16.go

+ 1 - 2
pkg/plugins/discovery.go

@@ -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 - 0
pkg/plugins/utils.go

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

+ 47 - 0
pkg/plugins/utils_go1.16.go

@@ -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}
+}