vendor: update fsutil to cb2ad947b

Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>
docker-18.09
Tonis Tiigi 2018-07-10 15:33:44 -07:00
parent 98f1604134
commit 5c3cfe5553
6 changed files with 90 additions and 21 deletions

View File

@ -13,6 +13,7 @@ import (
"github.com/moby/buildkit/snapshot" "github.com/moby/buildkit/snapshot"
"github.com/moby/buildkit/util/progress" "github.com/moby/buildkit/util/progress"
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/tonistiigi/fsutil"
"golang.org/x/time/rate" "golang.org/x/time/rate"
) )
@ -82,7 +83,7 @@ func (e *localExporterInstance) Export(ctx context.Context, ref cache.ImmutableR
} }
progress := newProgressHandler(ctx, "copying files") progress := newProgressHandler(ctx, "copying files")
if err := filesync.CopyToCaller(ctx, src, e.caller, progress); err != nil { if err := filesync.CopyToCaller(ctx, fsutil.NewFS(src, nil), e.caller, progress); err != nil {
return nil, err return nil, err
} }
return nil, nil return nil, nil

View File

@ -12,13 +12,8 @@ import (
"google.golang.org/grpc" "google.golang.org/grpc"
) )
func sendDiffCopy(stream grpc.Stream, dir string, includes, excludes, followPaths []string, progress progressCb, _map func(*fsutil.Stat) bool) error { func sendDiffCopy(stream grpc.Stream, fs fsutil.FS, progress progressCb) error {
return fsutil.Send(stream.Context(), stream, dir, &fsutil.WalkOpt{ return fsutil.Send(stream.Context(), stream, fs, progress)
ExcludePatterns: excludes,
IncludePatterns: includes,
FollowPaths: followPaths,
Map: _map,
}, progress)
} }
func newStreamWriter(stream grpc.ClientStream) io.WriteCloser { func newStreamWriter(stream grpc.ClientStream) io.WriteCloser {

View File

@ -101,7 +101,12 @@ func (sp *fsSyncProvider) handle(method string, stream grpc.ServerStream) (retEr
doneCh = sp.doneCh doneCh = sp.doneCh
sp.doneCh = nil sp.doneCh = nil
} }
err := pr.sendFn(stream, dir.Dir, includes, excludes, followPaths, progress, dir.Map) err := pr.sendFn(stream, fsutil.NewFS(dir.Dir, &fsutil.WalkOpt{
ExcludePatterns: excludes,
IncludePatterns: includes,
FollowPaths: followPaths,
Map: dir.Map,
}), progress)
if doneCh != nil { if doneCh != nil {
if err != nil { if err != nil {
doneCh <- err doneCh <- err
@ -120,7 +125,7 @@ type progressCb func(int, bool)
type protocol struct { type protocol struct {
name string name string
sendFn func(stream grpc.Stream, srcDir string, includes, excludes, followPaths []string, progress progressCb, _map func(*fsutil.Stat) bool) error sendFn func(stream grpc.Stream, fs fsutil.FS, progress progressCb) error
recvFn func(stream grpc.Stream, destDir string, cu CacheUpdater, progress progressCb) error recvFn func(stream grpc.Stream, destDir string, cu CacheUpdater, progress progressCb) error
} }
@ -256,7 +261,7 @@ func (sp *fsSyncTarget) DiffCopy(stream FileSend_DiffCopyServer) error {
return writeTargetFile(stream, sp.outfile) return writeTargetFile(stream, sp.outfile)
} }
func CopyToCaller(ctx context.Context, srcPath string, c session.Caller, progress func(int, bool)) error { func CopyToCaller(ctx context.Context, fs fsutil.FS, c session.Caller, progress func(int, bool)) error {
method := session.MethodURL(_FileSend_serviceDesc.ServiceName, "diffcopy") method := session.MethodURL(_FileSend_serviceDesc.ServiceName, "diffcopy")
if !c.Supports(method) { if !c.Supports(method) {
return errors.Errorf("method %s not supported by the client", method) return errors.Errorf("method %s not supported by the client", method)
@ -269,7 +274,7 @@ func CopyToCaller(ctx context.Context, srcPath string, c session.Caller, progres
return err return err
} }
return sendDiffCopy(cc, srcPath, nil, nil, nil, progress, nil) return sendDiffCopy(cc, fs, progress)
} }
func CopyFileWriter(ctx context.Context, c session.Caller) (io.WriteCloser, error) { func CopyFileWriter(ctx context.Context, c session.Caller) (io.WriteCloser, error) {

View File

@ -39,7 +39,7 @@ golang.org/x/time f51c12702a4d776e4c1fa9b0fabab841babae631
github.com/docker/docker 71cd53e4a197b303c6ba086bd584ffd67a884281 github.com/docker/docker 71cd53e4a197b303c6ba086bd584ffd67a884281
github.com/pkg/profile 5b67d428864e92711fcbd2f8629456121a56d91f github.com/pkg/profile 5b67d428864e92711fcbd2f8629456121a56d91f
github.com/tonistiigi/fsutil 8abad97ee3969cdf5e9c367f46adba2c212b3ddb github.com/tonistiigi/fsutil cb2ad947b24dff140361a3aaaba18b32275f7c0c
github.com/hashicorp/go-immutable-radix 826af9ccf0feeee615d546d69b11f8e98da8c8f1 git://github.com/tonistiigi/go-immutable-radix.git github.com/hashicorp/go-immutable-radix 826af9ccf0feeee615d546d69b11f8e98da8c8f1 git://github.com/tonistiigi/go-immutable-radix.git
github.com/hashicorp/golang-lru a0d98a5f288019575c6d1f4bb1573fef2d1fcdc4 github.com/hashicorp/golang-lru a0d98a5f288019575c6d1f4bb1573fef2d1fcdc4
github.com/mitchellh/hashstructure 2bca23e0e452137f789efbc8610126fd8b94f73b github.com/mitchellh/hashstructure 2bca23e0e452137f789efbc8610126fd8b94f73b

71
vendor/github.com/tonistiigi/fsutil/fs.go generated vendored Normal file
View File

@ -0,0 +1,71 @@
package fsutil
import (
"context"
"io"
"os"
"path"
"path/filepath"
"strings"
"github.com/pkg/errors"
)
type FS interface {
Walk(context.Context, filepath.WalkFunc) error
Open(string) (io.ReadCloser, error)
}
func NewFS(root string, opt *WalkOpt) FS {
return &fs{
root: root,
opt: opt,
}
}
type fs struct {
root string
opt *WalkOpt
}
func (fs *fs) Walk(ctx context.Context, fn filepath.WalkFunc) error {
return Walk(ctx, fs.root, fs.opt, fn)
}
func (fs *fs) Open(p string) (io.ReadCloser, error) {
return os.Open(filepath.Join(fs.root, p))
}
func SubDirFS(fs FS, stat Stat) FS {
return &subDirFS{fs: fs, stat: stat}
}
type subDirFS struct {
fs FS
stat Stat
}
func (fs *subDirFS) Walk(ctx context.Context, fn filepath.WalkFunc) error {
main := &StatInfo{Stat: &fs.stat}
if !main.IsDir() {
return errors.Errorf("fs subdir not mode directory")
}
if main.Name() != fs.stat.Path {
return errors.Errorf("subdir path must be single file")
}
if err := fn(fs.stat.Path, main, nil); err != nil {
return err
}
return fs.fs.Walk(ctx, func(p string, fi os.FileInfo, err error) error {
stat, ok := fi.Sys().(*Stat)
if !ok {
return errors.Wrapf(err, "invalid fileinfo without stat info: %s", p)
}
stat.Path = path.Join(fs.stat.Path, stat.Path)
return fn(filepath.Join(fs.stat.Path, p), &StatInfo{stat}, nil)
})
}
func (fs *subDirFS) Open(p string) (io.ReadCloser, error) {
return fs.fs.Open(strings.TrimPrefix(p, fs.stat.Path+"/"))
}

View File

@ -4,7 +4,6 @@ import (
"context" "context"
"io" "io"
"os" "os"
"path/filepath"
"sync" "sync"
"github.com/pkg/errors" "github.com/pkg/errors"
@ -23,11 +22,10 @@ type Stream interface {
Context() context.Context Context() context.Context
} }
func Send(ctx context.Context, conn Stream, root string, opt *WalkOpt, progressCb func(int, bool)) error { func Send(ctx context.Context, conn Stream, fs FS, progressCb func(int, bool)) error {
s := &sender{ s := &sender{
conn: &syncStream{Stream: conn}, conn: &syncStream{Stream: conn},
root: root, fs: fs,
opt: opt,
files: make(map[uint32]string), files: make(map[uint32]string),
progressCb: progressCb, progressCb: progressCb,
sendpipeline: make(chan *sendHandle, 128), sendpipeline: make(chan *sendHandle, 128),
@ -42,8 +40,7 @@ type sendHandle struct {
type sender struct { type sender struct {
conn Stream conn Stream
opt *WalkOpt fs FS
root string
files map[uint32]string files map[uint32]string
mu sync.RWMutex mu sync.RWMutex
progressCb func(int, bool) progressCb func(int, bool)
@ -130,7 +127,7 @@ func (s *sender) queue(id uint32) error {
} }
func (s *sender) sendFile(h *sendHandle) error { func (s *sender) sendFile(h *sendHandle) error {
f, err := os.Open(filepath.Join(s.root, h.path)) f, err := s.fs.Open(h.path)
if err == nil { if err == nil {
defer f.Close() defer f.Close()
buf := bufPool.Get().([]byte) buf := bufPool.Get().([]byte)
@ -144,7 +141,7 @@ func (s *sender) sendFile(h *sendHandle) error {
func (s *sender) walk(ctx context.Context) error { func (s *sender) walk(ctx context.Context) error {
var i uint32 = 0 var i uint32 = 0
err := Walk(ctx, s.root, s.opt, func(path string, fi os.FileInfo, err error) error { err := s.fs.Walk(ctx, func(path string, fi os.FileInfo, err error) error {
if err != nil { if err != nil {
return err return err
} }