Refactor calling the progress writer to make it easier

This commit is contained in:
Djordje Lukic 2020-06-18 12:10:36 +02:00
parent b55267739a
commit a1bb04ebe1
3 changed files with 32 additions and 37 deletions

View File

@ -30,10 +30,8 @@ package compose
import ( import (
"context" "context"
"errors" "errors"
"os"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"golang.org/x/sync/errgroup"
"github.com/docker/api/client" "github.com/docker/api/client"
"github.com/docker/api/compose" "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") return errors.New("compose not implemented in current context")
} }
eg, _ := errgroup.WithContext(ctx) return progress.Run(ctx, func(ctx context.Context) error {
w, err := progress.NewWriter(os.Stderr) return composeService.Up(ctx, opts)
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 := composeService.Up(ctx, opts)
return err
})
return eg.Wait()
} }

View File

@ -30,10 +30,8 @@ package run
import ( import (
"context" "context"
"fmt" "fmt"
"os"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"golang.org/x/sync/errgroup"
"github.com/docker/api/cli/options/run" "github.com/docker/api/cli/options/run"
"github.com/docker/api/client" "github.com/docker/api/client"
@ -71,23 +69,11 @@ func runRun(ctx context.Context, image string, opts run.Opts) error {
return err return err
} }
eg, _ := errgroup.WithContext(ctx) err = progress.Run(ctx, func(ctx context.Context) error {
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()
return c.ContainerService().Run(ctx, containerConfig) return c.ContainerService().Run(ctx, containerConfig)
}) })
if err == nil {
err = eg.Wait() fmt.Println(opts.Name)
fmt.Println(opts.Name) }
return err return err
} }

View File

@ -2,11 +2,13 @@ package progress
import ( import (
"context" "context"
"os"
"sync" "sync"
"time" "time"
"github.com/containerd/console" "github.com/containerd/console"
"github.com/moby/term" "github.com/moby/term"
"golang.org/x/sync/errgroup"
) )
// EventStatus indicates the status of an action // EventStatus indicates the status of an action
@ -59,6 +61,30 @@ func ContextWriter(ctx context.Context) Writer {
return s 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 // NewWriter returns a new multi-progress writer
func NewWriter(out console.File) (Writer, error) { func NewWriter(out console.File) (Writer, error) {
_, isTerminal := term.GetFdInfo(out) _, isTerminal := term.GetFdInfo(out)