diff --git a/cli/cmd/compose/up.go b/cli/cmd/compose/up.go index 5f58da97..18d8af0e 100644 --- a/cli/cmd/compose/up.go +++ b/cli/cmd/compose/up.go @@ -30,10 +30,8 @@ package compose import ( "context" "errors" - "os" "github.com/spf13/cobra" - "golang.org/x/sync/errgroup" "github.com/docker/api/client" "github.com/docker/api/compose" @@ -67,22 +65,7 @@ func runUp(ctx context.Context, opts compose.ProjectOptions) error { return errors.New("compose not implemented in current context") } - eg, _ := errgroup.WithContext(ctx) - w, err := progress.NewWriter(os.Stderr) - if err != nil { - return err - } - eg.Go(func() error { - return w.Start(context.Background()) + return progress.Run(ctx, func(ctx context.Context) error { + return composeService.Up(ctx, opts) }) - - ctx = progress.WithContextWriter(ctx, w) - - eg.Go(func() error { - defer w.Stop() - err := composeService.Up(ctx, opts) - return err - }) - - return eg.Wait() } diff --git a/cli/cmd/run/run.go b/cli/cmd/run/run.go index 49032c04..cad343d0 100644 --- a/cli/cmd/run/run.go +++ b/cli/cmd/run/run.go @@ -30,10 +30,8 @@ package run import ( "context" "fmt" - "os" "github.com/spf13/cobra" - "golang.org/x/sync/errgroup" "github.com/docker/api/cli/options/run" "github.com/docker/api/client" @@ -71,23 +69,11 @@ func runRun(ctx context.Context, image string, opts run.Opts) error { return err } - eg, _ := errgroup.WithContext(ctx) - w, err := progress.NewWriter(os.Stderr) - if err != nil { - return err - } - eg.Go(func() error { - return w.Start(context.Background()) - }) - - ctx = progress.WithContextWriter(ctx, w) - - eg.Go(func() error { - defer w.Stop() + err = progress.Run(ctx, func(ctx context.Context) error { return c.ContainerService().Run(ctx, containerConfig) }) - - err = eg.Wait() - fmt.Println(opts.Name) + if err == nil { + fmt.Println(opts.Name) + } return err } diff --git a/progress/writer.go b/progress/writer.go index 5d0fec78..a5b8e1cd 100644 --- a/progress/writer.go +++ b/progress/writer.go @@ -2,11 +2,13 @@ package progress import ( "context" + "os" "sync" "time" "github.com/containerd/console" "github.com/moby/term" + "golang.org/x/sync/errgroup" ) // EventStatus indicates the status of an action @@ -59,6 +61,30 @@ func ContextWriter(ctx context.Context) Writer { return s } +type progressFunc func(context.Context) error + +// Run will run a writer and the progress function +// in parallel +func Run(ctx context.Context, pf progressFunc) error { + eg, _ := errgroup.WithContext(ctx) + w, err := NewWriter(os.Stderr) + if err != nil { + return err + } + eg.Go(func() error { + return w.Start(context.Background()) + }) + + ctx = WithContextWriter(ctx, w) + + eg.Go(func() error { + defer w.Stop() + return pf(ctx) + }) + + return eg.Wait() +} + // NewWriter returns a new multi-progress writer func NewWriter(out console.File) (Writer, error) { _, isTerminal := term.GetFdInfo(out)