Stop the resource timer after last expected event

Signed-off-by: Nicolas De Loof <nicolas.deloof@gmail.com>
This commit is contained in:
Nicolas De Loof 2024-01-11 17:03:40 +01:00
parent 2bf2b22fbe
commit a4ddbcb6b2
No known key found for this signature in database
GPG Key ID: 9858809D6F8F6E7E
10 changed files with 54 additions and 16 deletions

View File

@ -737,7 +737,7 @@ func (s *composeService) isServiceCompleted(ctx context.Context, containers Cont
return false, 0, nil
}
func (s *composeService) startService(ctx context.Context, project *types.Project, service types.ServiceConfig, containers Containers) error {
func (s *composeService) startService(ctx context.Context, project *types.Project, service types.ServiceConfig, containers Containers, wait bool) error {
if service.Deploy != nil && service.Deploy.Replicas != nil && *service.Deploy.Replicas == 0 {
return nil
}
@ -765,11 +765,28 @@ func (s *composeService) startService(ctx context.Context, project *types.Projec
if err != nil {
return err
}
w.Event(progress.StartedEvent(eventName))
status := progress.Done
if wait || dependencyWaiting(project, service.Name) {
status = progress.Working
}
w.Event(progress.NewEvent(eventName, status, "Started"))
}
return nil
}
func dependencyWaiting(project *types.Project, name string) bool {
for _, service := range project.Services {
depends, ok := service.DependsOn[name]
if !ok {
continue
}
if depends.Condition == types.ServiceConditionHealthy {
return true
}
}
return false
}
func mergeLabels(ls ...types.Labels) types.Labels {
merged := types.Labels{}
for _, l := range ls {

View File

@ -129,7 +129,7 @@ func (s *composeService) start(ctx context.Context, projectName string, options
return err
}
return s.startService(ctx, project, service, containers)
return s.startService(ctx, project, service, containers, options.Wait)
})
if err != nil {
return err

View File

@ -33,11 +33,14 @@ 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(project), func(ctx context.Context) error {
w := progress.ContextWriter(ctx)
w.HasMore(options.Start.Attach == nil)
err := s.create(ctx, project, options.Create)
if err != nil {
return err
}
if options.Start.Attach == nil {
w.HasMore(false)
return s.start(ctx, project.Name, options.Start, nil)
}
return nil

View File

@ -191,6 +191,6 @@ func (e *Event) Spinner() any {
case Error:
return ErrorColor(spinnerError)
default:
return e.spinner.String()
return CountColor(e.spinner.String())
}
}

View File

@ -38,3 +38,6 @@ func (p *noopWriter) TailMsgf(_ string, _ ...interface{}) {
func (p *noopWriter) Stop() {
}
func (p *noopWriter) HasMore(bool) {
}

View File

@ -64,3 +64,6 @@ func (p *plainWriter) TailMsgf(msg string, args ...interface{}) {
func (p *plainWriter) Stop() {
p.done <- true
}
func (p *plainWriter) HasMore(bool) {
}

View File

@ -35,3 +35,6 @@ func (q quiet) Events(_ []Event) {
func (q quiet) TailMsgf(_ string, _ ...interface{}) {
}
func (q quiet) HasMore(bool) {
}

View File

@ -33,17 +33,18 @@ import (
)
type ttyWriter struct {
out io.Writer
events map[string]Event
eventIDs []string
repeated bool
numLines int
done chan bool
mtx *sync.Mutex
tailEvents []string
dryRun bool
skipChildEvents bool
progressTitle string
out io.Writer
events map[string]Event
eventIDs []string
repeated bool
numLines int
done chan bool
mtx *sync.Mutex
tailEvents []string
dryRun bool
skipChildEvents bool
progressTitle string
hasFollowupAction bool
}
func (w *ttyWriter) Start(ctx context.Context) error {
@ -70,6 +71,10 @@ func (w *ttyWriter) Stop() {
w.done <- true
}
func (w *ttyWriter) HasMore(b bool) {
w.hasFollowupAction = b
}
func (w *ttyWriter) Event(e Event) {
w.mtx.Lock()
defer w.mtx.Unlock()
@ -82,6 +87,9 @@ func (w *ttyWriter) event(e Event) {
}
if _, ok := w.events[e.ID]; ok {
last := w.events[e.ID]
if e.Status == Done && w.hasFollowupAction {
e.Status = Working
}
switch e.Status {
case Done, Error, Warning:
if last.endTime.IsZero() {

View File

@ -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)

View File

@ -36,6 +36,7 @@ type Writer interface {
Event(Event)
Events([]Event)
TailMsgf(string, ...interface{})
HasMore(more bool)
}
type writerKey struct{}