diff --git a/go.mod b/go.mod index 6d461de0ef0..369484f5a08 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/Microsoft/go-winio v0.6.1 github.com/adrg/xdg v0.4.0 github.com/buger/goterm v1.0.4 - github.com/compose-spec/compose-go v1.18.4 + github.com/compose-spec/compose-go v1.19.0 github.com/containerd/console v1.0.3 github.com/containerd/containerd v1.7.6 github.com/cucumber/godog v0.0.0-00010101000000-000000000000 // replaced; see replace for the actual version used diff --git a/go.sum b/go.sum index 09c1aefdf40..fe1ffdcd8cb 100644 --- a/go.sum +++ b/go.sum @@ -139,8 +139,8 @@ github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 h1:/inchEIKaYC1Akx+H+g github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb h1:EDmT6Q9Zs+SbUoc7Ik9EfrFqcylYqgPZ9ANSbTAntnE= github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb/go.mod h1:ZjrT6AXHbDs86ZSdt/osfBi5qfexBrKUdONk989Wnk4= -github.com/compose-spec/compose-go v1.18.4 h1:yLYfsc3ATAYZVAJcXyx/V847/JVBmf3pfKfR13mXU4s= -github.com/compose-spec/compose-go v1.18.4/go.mod h1:+MdqXV4RA7wdFsahh/Kb8U0pAJqkg7mr4PM9tFKU8RM= +github.com/compose-spec/compose-go v1.19.0 h1:t68gAcwStDg0hy2kFvqHJIksf6xkqRnlSKfL45/ETqo= +github.com/compose-spec/compose-go v1.19.0/go.mod h1:+MdqXV4RA7wdFsahh/Kb8U0pAJqkg7mr4PM9tFKU8RM= github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM= github.com/containerd/cgroups v1.1.0/go.mod h1:6ppBcbh/NOOUU+dMKrykgaBnK9lCIBxHqJDGwsa1mIw= github.com/containerd/console v1.0.3 h1:lIr7SlA5PxZyMV30bDW0MGbiOPXwc63yRuCP0ARubLw= diff --git a/pkg/compose/watch.go b/pkg/compose/watch.go index 39f762d2c0e..29b0fe33e30 100644 --- a/pkg/compose/watch.go +++ b/pkg/compose/watch.go @@ -38,30 +38,12 @@ import ( "golang.org/x/sync/errgroup" ) -type DevelopmentConfig struct { - Watch []Trigger `json:"watch,omitempty"` -} - -type WatchAction string - -const ( - WatchActionSync WatchAction = "sync" - WatchActionRebuild WatchAction = "rebuild" -) - -type Trigger struct { - Path string `json:"path,omitempty"` - Action string `json:"action,omitempty"` - Target string `json:"target,omitempty"` - Ignore []string `json:"ignore,omitempty"` -} - const quietPeriod = 500 * time.Millisecond // fileEvent contains the Compose service and modified host system path. type fileEvent struct { sync.PathMapping - Action WatchAction + Action types.WatchAction } // getSyncImplementation returns the the tar-based syncer unless it has been explicitly @@ -95,6 +77,10 @@ func (s *composeService) Watch(ctx context.Context, project *types.Project, serv return err } + if service.Develop != nil { + config = service.Develop + } + if config == nil { continue } @@ -169,7 +155,7 @@ func (s *composeService) Watch(ctx context.Context, project *types.Project, serv return eg.Wait() } -func (s *composeService) watch(ctx context.Context, project *types.Project, name string, options api.WatchOptions, watcher watch.Notify, syncer sync.Syncer, triggers []Trigger) error { +func (s *composeService) watch(ctx context.Context, project *types.Project, name string, options api.WatchOptions, watcher watch.Notify, syncer sync.Syncer, triggers []types.Trigger) error { ctx, cancel := context.WithCancel(ctx) defer cancel() @@ -223,7 +209,7 @@ func (s *composeService) watch(ctx context.Context, project *types.Project, name // rules. // // Any errors are logged as warnings and nil (no file event) is returned. -func maybeFileEvent(trigger Trigger, hostPath string, ignore watch.PathMatcher) *fileEvent { +func maybeFileEvent(trigger types.Trigger, hostPath string, ignore watch.PathMatcher) *fileEvent { if !watch.IsChild(trigger.Path, hostPath) { return nil } @@ -250,7 +236,7 @@ func maybeFileEvent(trigger Trigger, hostPath string, ignore watch.PathMatcher) } return &fileEvent{ - Action: WatchAction(trigger.Action), + Action: trigger.Action, PathMapping: sync.PathMapping{ HostPath: hostPath, ContainerPath: containerPath, @@ -258,12 +244,13 @@ func maybeFileEvent(trigger Trigger, hostPath string, ignore watch.PathMatcher) } } -func loadDevelopmentConfig(service types.ServiceConfig, project *types.Project) (*DevelopmentConfig, error) { - var config DevelopmentConfig +func loadDevelopmentConfig(service types.ServiceConfig, project *types.Project) (*types.DevelopConfig, error) { + var config types.DevelopConfig y, ok := service.Extensions["x-develop"] if !ok { return nil, nil } + logrus.Warnf("x-develop is DEPRECATED, please use the official `develop` attribute") err := mapstructure.Decode(y, &config) if err != nil { return nil, err @@ -286,7 +273,7 @@ func loadDevelopmentConfig(service types.ServiceConfig, project *types.Project) return nil, errors.New("watch rules MUST define a path") } - if trigger.Action == string(WatchActionRebuild) && service.Build == nil { + if trigger.Action == types.WatchActionRebuild && service.Build == nil { return nil, fmt.Errorf("service %s doesn't have a build section, can't apply 'rebuild' on watch", service.Name) } @@ -429,7 +416,7 @@ func (t tarDockerClient) Exec(ctx context.Context, containerID string, cmd []str func (s *composeService) handleWatchBatch(ctx context.Context, project *types.Project, serviceName string, build api.BuildOptions, batch []fileEvent, syncer sync.Syncer) error { pathMappings := make([]sync.PathMapping, len(batch)) for i := range batch { - if batch[i].Action == WatchActionRebuild { + if batch[i].Action == types.WatchActionRebuild { fmt.Fprintf( s.stdinfo(), "Rebuilding %s after changes were detected:%s\n", diff --git a/pkg/compose/watch_test.go b/pkg/compose/watch_test.go index 61785a505a1..678a2ef8a4b 100644 --- a/pkg/compose/watch_test.go +++ b/pkg/compose/watch_test.go @@ -40,7 +40,7 @@ func TestDebounceBatching(t *testing.T) { eventBatchCh := batchDebounceEvents(ctx, clock, quietPeriod, ch) for i := 0; i < 100; i++ { - var action WatchAction = "a" + var action types.WatchAction = "a" if i%2 == 0 { action = "b" } @@ -124,7 +124,7 @@ func TestWatch_Sync(t *testing.T) { dockerCli: cli, clock: clock, } - err := service.watch(ctx, &proj, "test", api.WatchOptions{}, watcher, syncer, []Trigger{ + err := service.watch(ctx, &proj, "test", api.WatchOptions{}, watcher, syncer, []types.Trigger{ { Path: "/sync", Action: "sync",