diff --git a/internal/desktop/file_shares.go b/internal/desktop/file_shares.go index cf4af09c3..8c5c6e603 100644 --- a/internal/desktop/file_shares.go +++ b/internal/desktop/file_shares.go @@ -139,9 +139,6 @@ func NewFileShareManager(cli *Client, projectName string, hostPaths []string) *F // flow can continue. func (m *FileShareManager) EnsureExists(ctx context.Context) (err error) { w := progress.ContextWriter(ctx) - // TODO(milas): this should be a per-node option, not global - w.HasMore(false) - w.Event(progress.NewEvent(fileShareProgressID, progress.Working, "")) defer func() { if err != nil { diff --git a/pkg/compose/create.go b/pkg/compose/create.go index 7dc3b115b..ad78c329f 100644 --- a/pkg/compose/create.go +++ b/pkg/compose/create.go @@ -68,11 +68,11 @@ type createConfigs struct { func (s *composeService) Create(ctx context.Context, project *types.Project, createOpts api.CreateOptions) error { return progress.RunWithTitle(ctx, func(ctx context.Context) error { - return s.create(ctx, project, createOpts, false) + return s.create(ctx, project, createOpts) }, s.stdinfo(), "Creating") } -func (s *composeService) create(ctx context.Context, project *types.Project, options api.CreateOptions, willAttach bool) error { +func (s *composeService) create(ctx context.Context, project *types.Project, options api.CreateOptions) error { if len(options.Services) == 0 { options.Services = project.ServiceNames() } @@ -113,10 +113,6 @@ func (s *composeService) create(ctx context.Context, project *types.Project, opt "--remove-orphans flag to clean it up.", orphans.names()) } } - - if willAttach { - progress.ContextWriter(ctx).HasMore(willAttach) - } return newConvergence(options.Services, observedState, s).apply(ctx, project, options) } diff --git a/pkg/compose/scale.go b/pkg/compose/scale.go index b10aea095..985cc129d 100644 --- a/pkg/compose/scale.go +++ b/pkg/compose/scale.go @@ -26,7 +26,7 @@ import ( func (s *composeService) Scale(ctx context.Context, project *types.Project, options api.ScaleOptions) error { return progress.Run(ctx, tracing.SpanWrapFunc("project/scale", tracing.ProjectOptions(ctx, project), func(ctx context.Context) error { - err := s.create(ctx, project, api.CreateOptions{Services: options.Services}, true) + err := s.create(ctx, project, api.CreateOptions{Services: options.Services}) if err != nil { return err } diff --git a/pkg/compose/up.go b/pkg/compose/up.go index 97c07368b..1a3e92895 100644 --- a/pkg/compose/up.go +++ b/pkg/compose/up.go @@ -37,8 +37,7 @@ import ( func (s *composeService) Up(ctx context.Context, project *types.Project, options api.UpOptions) error { //nolint:gocyclo err := progress.Run(ctx, tracing.SpanWrapFunc("project/up", tracing.ProjectOptions(ctx, project), func(ctx context.Context) error { - w := progress.ContextWriter(ctx) - err := s.create(ctx, project, options.Create, options.Start.Attach != nil) + err := s.create(ctx, project, options.Create) if err != nil { return err } diff --git a/pkg/compose/watch.go b/pkg/compose/watch.go index 1cf61157e..3654e5e7c 100644 --- a/pkg/compose/watch.go +++ b/pkg/compose/watch.go @@ -470,7 +470,7 @@ func (s *composeService) handleWatchBatch(ctx context.Context, project *types.Pr Services: []string{serviceName}, Inherit: true, Recreate: api.RecreateForce, - }, true) + }) if err != nil { options.LogTo.Log(api.WatchLogger, fmt.Sprintf("Failed to recreate service after update. Error: %v", err)) return err diff --git a/pkg/progress/event.go b/pkg/progress/event.go index 26aca98d8..267dbe192 100644 --- a/pkg/progress/event.go +++ b/pkg/progress/event.go @@ -176,6 +176,10 @@ func (e *Event) stop() { e.spinner.Stop() } +func (e *Event) hasMore() { + e.spinner.Restart() +} + var ( spinnerDone = "✔" spinnerWarning = "!" @@ -191,6 +195,6 @@ func (e *Event) Spinner() any { case Error: return ErrorColor(spinnerError) default: - return e.spinner.String() + return CountColor(e.spinner.String()) } } diff --git a/pkg/progress/spinner.go b/pkg/progress/spinner.go index 3e757acf4..3756e944f 100644 --- a/pkg/progress/spinner.go +++ b/pkg/progress/spinner.go @@ -64,3 +64,7 @@ func (s *spinner) String() string { func (s *spinner) Stop() { s.stop = true } + +func (s *spinner) Restart() { + s.stop = false +} diff --git a/pkg/progress/tty.go b/pkg/progress/tty.go index 4544d47c7..87a3b2d6b 100644 --- a/pkg/progress/tty.go +++ b/pkg/progress/tty.go @@ -84,14 +84,11 @@ func (w *ttyWriter) event(e Event) { last := w.events[e.ID] switch e.Status { case Done, Error, Warning: - if last.endTime.IsZero() { + if last.Status != e.Status { last.stop() } case Working: - if !last.endTime.IsZero() { - // already done, don't overwrite - return - } + last.hasMore() } last.Status = e.Status last.Text = e.Text diff --git a/pkg/progress/tty_test.go b/pkg/progress/tty_test.go index 6ffdf2bec..fc484b7c0 100644 --- a/pkg/progress/tty_test.go +++ b/pkg/progress/tty_test.go @@ -42,7 +42,7 @@ func TestLineText(t *testing.T) { lineWidth := len(fmt.Sprintf("%s %s", ev.ID, ev.Text)) out := tty().lineText(ev, "", 50, lineWidth, false) - assert.Equal(t, out, " . id Text Status \x1b[34m0.0s \x1b[0m\n") + assert.Equal(t, out, " \x1b[33m.\x1b[0m id Text Status \x1b[34m0.0s \x1b[0m\n") ev.Status = Done out = tty().lineText(ev, "", 50, lineWidth, false)