diff --git a/builder/dockerfile/builder.go b/builder/dockerfile/builder.go index cee1436f92..fb1786225a 100644 --- a/builder/dockerfile/builder.go +++ b/builder/dockerfile/builder.go @@ -140,8 +140,7 @@ func (bm *BuildManager) initializeClientSession(ctx context.Context, cancel func }() if options.RemoteContext == remotecontext.ClientSessionRemote { st := time.Now() - csi, err := NewClientSessionSourceIdentifier(ctx, bm.sg, - options.SessionID, []string{"/"}) + csi, err := NewClientSessionSourceIdentifier(ctx, bm.sg, options.SessionID) if err != nil { return nil, err } diff --git a/builder/dockerfile/clientsession.go b/builder/dockerfile/clientsession.go index 647e4537c3..a7709ce517 100644 --- a/builder/dockerfile/clientsession.go +++ b/builder/dockerfile/clientsession.go @@ -30,26 +30,25 @@ func (cst *ClientSessionTransport) Copy(ctx context.Context, id fscache.RemoteId } return filesync.FSSync(ctx, csi.caller, filesync.FSSendRequestOpt{ - SrcPaths: csi.srcPaths, - DestDir: dest, - CacheUpdater: cu, + IncludePatterns: csi.includePatterns, + DestDir: dest, + CacheUpdater: cu, }) } // ClientSessionSourceIdentifier is an identifier that can be used for requesting // files from remote client type ClientSessionSourceIdentifier struct { - srcPaths []string - caller session.Caller - sharedKey string - uuid string + includePatterns []string + caller session.Caller + sharedKey string + uuid string } // NewClientSessionSourceIdentifier returns new ClientSessionSourceIdentifier instance -func NewClientSessionSourceIdentifier(ctx context.Context, sg SessionGetter, uuid string, sources []string) (*ClientSessionSourceIdentifier, error) { +func NewClientSessionSourceIdentifier(ctx context.Context, sg SessionGetter, uuid string) (*ClientSessionSourceIdentifier, error) { csi := &ClientSessionSourceIdentifier{ - uuid: uuid, - srcPaths: sources, + uuid: uuid, } caller, err := sg.Get(ctx, uuid) if err != nil { diff --git a/client/session/filesync/diffcopy.go b/client/session/filesync/diffcopy.go index b15e4ee4bf..533847acdf 100644 --- a/client/session/filesync/diffcopy.go +++ b/client/session/filesync/diffcopy.go @@ -9,9 +9,10 @@ import ( "github.com/tonistiigi/fsutil" ) -func sendDiffCopy(stream grpc.Stream, dir string, excludes []string, progress progressCb) error { +func sendDiffCopy(stream grpc.Stream, dir string, includes, excludes []string, progress progressCb) error { return fsutil.Send(stream.Context(), stream, dir, &fsutil.WalkOpt{ ExcludePatterns: excludes, + IncludePaths: includes, // TODO: rename IncludePatterns }, progress) } diff --git a/client/session/filesync/filesync.go b/client/session/filesync/filesync.go index fa6dafb6b0..9a2ffc8578 100644 --- a/client/session/filesync/filesync.go +++ b/client/session/filesync/filesync.go @@ -12,6 +12,11 @@ import ( "google.golang.org/grpc/metadata" ) +const ( + keyOverrideExcludes = "override-excludes" + keyIncludePatterns = "include-patterns" +) + type fsSyncProvider struct { root string excludes []string @@ -54,9 +59,10 @@ func (sp *fsSyncProvider) handle(method string, stream grpc.ServerStream) error opts, _ := metadata.FromContext(stream.Context()) // if no metadata continue with empty object var excludes []string - if len(opts["Override-Excludes"]) == 0 || opts["Override-Excludes"][0] != "true" { + if len(opts[keyOverrideExcludes]) == 0 || opts[keyOverrideExcludes][0] != "true" { excludes = sp.excludes } + includes := opts[keyIncludePatterns] var progress progressCb if sp.p != nil { @@ -69,7 +75,7 @@ func (sp *fsSyncProvider) handle(method string, stream grpc.ServerStream) error doneCh = sp.doneCh sp.doneCh = nil } - err := pr.sendFn(stream, sp.root, excludes, progress) + err := pr.sendFn(stream, sp.root, includes, excludes, progress) if doneCh != nil { if err != nil { doneCh <- err @@ -88,7 +94,7 @@ type progressCb func(int, bool) type protocol struct { name string - sendFn func(stream grpc.Stream, srcDir string, excludes []string, progress progressCb) error + sendFn func(stream grpc.Stream, srcDir string, includes, excludes []string, progress progressCb) error recvFn func(stream grpc.Stream, destDir string, cu CacheUpdater) error } @@ -115,7 +121,7 @@ var supportedProtocols = []protocol{ // FSSendRequestOpt defines options for FSSend request type FSSendRequestOpt struct { - SrcPaths []string + IncludePatterns []string OverrideExcludes bool DestDir string CacheUpdater CacheUpdater @@ -142,7 +148,11 @@ func FSSync(ctx context.Context, c session.Caller, opt FSSendRequestOpt) error { opts := make(map[string][]string) if opt.OverrideExcludes { - opts["Override-Excludes"] = []string{"true"} + opts[keyOverrideExcludes] = []string{"true"} + } + + if opt.IncludePatterns != nil { + opts[keyIncludePatterns] = opt.IncludePatterns } ctx, cancel := context.WithCancel(ctx) diff --git a/client/session/filesync/tarstream.go b/client/session/filesync/tarstream.go index ee01e30a75..da139ebf5d 100644 --- a/client/session/filesync/tarstream.go +++ b/client/session/filesync/tarstream.go @@ -10,7 +10,7 @@ import ( "google.golang.org/grpc" ) -func sendTarStream(stream grpc.Stream, dir string, excludes []string, progress progressCb) error { +func sendTarStream(stream grpc.Stream, dir string, includes, excludes []string, progress progressCb) error { a, err := archive.TarWithOptions(dir, &archive.TarOptions{ ExcludePatterns: excludes, })