Skip to content

Commit aff5c11

Browse files
ndeloofglours
authored andcommitted
move progress UI components into cmd
Signed-off-by: Nicolas De Loof <[email protected]>
1 parent 5ef495c commit aff5c11

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+619
-596
lines changed

cmd/compose/build.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ import (
2626
"github.com/compose-spec/compose-go/v2/types"
2727
"github.com/docker/cli/cli/command"
2828
cliopts "github.com/docker/cli/opts"
29+
"github.com/docker/compose/v2/cmd/display"
2930
"github.com/docker/compose/v2/pkg/compose"
30-
ui "github.com/docker/compose/v2/pkg/progress"
3131
"github.com/spf13/cobra"
3232

3333
"github.com/docker/compose/v2/pkg/api"
@@ -67,8 +67,8 @@ func (opts buildOptions) toAPIBuildOptions(services []string) (api.BuildOptions,
6767
builderName = os.Getenv("BUILDX_BUILDER")
6868
}
6969

70-
uiMode := ui.Mode
71-
if uiMode == ui.ModeJSON {
70+
uiMode := display.Mode
71+
if uiMode == display.ModeJSON {
7272
uiMode = "rawjson"
7373
}
7474

@@ -100,7 +100,7 @@ func buildCommand(p *ProjectOptions, dockerCli command.Cli, backendOptions *Back
100100
Short: "Build or rebuild services",
101101
PreRunE: Adapt(func(ctx context.Context, args []string) error {
102102
if opts.quiet {
103-
ui.Mode = ui.ModeQuiet
103+
display.Mode = display.ModeQuiet
104104
devnull, err := os.Open(os.DevNull)
105105
if err != nil {
106106
return err
@@ -151,7 +151,7 @@ func buildCommand(p *ProjectOptions, dockerCli command.Cli, backendOptions *Back
151151

152152
func runBuild(ctx context.Context, dockerCli command.Cli, backendOptions *BackendOptions, opts buildOptions, services []string) error {
153153
if opts.print {
154-
backendOptions.Add(compose.WithEventProcessor(ui.NewQuietWriter()))
154+
backendOptions.Add(compose.WithEventProcessor(display.Quiet()))
155155
}
156156
backend, err := compose.NewComposeService(dockerCli, backendOptions.Options...)
157157
if err != nil {

cmd/compose/compose.go

Lines changed: 41 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,11 @@ import (
3939
"github.com/docker/cli/cli-plugins/metadata"
4040
"github.com/docker/cli/cli/command"
4141
"github.com/docker/cli/pkg/kvfile"
42+
"github.com/docker/compose/v2/cmd/display"
4243
"github.com/docker/compose/v2/cmd/formatter"
4344
"github.com/docker/compose/v2/internal/tracing"
4445
"github.com/docker/compose/v2/pkg/api"
4546
"github.com/docker/compose/v2/pkg/compose"
46-
ui "github.com/docker/compose/v2/pkg/progress"
4747
"github.com/docker/compose/v2/pkg/remote"
4848
"github.com/docker/compose/v2/pkg/utils"
4949
"github.com/morikuni/aec"
@@ -84,10 +84,16 @@ func rawEnv(r io.Reader, filename string, vars map[string]string, lookup func(ke
8484
return nil
8585
}
8686

87+
var stdioToStdout bool
88+
8789
func init() {
8890
// compose evaluates env file values for interpolation
8991
// `raw` format allows to load env_file with the same parser used by docker run --env-file
9092
dotenv.RegisterFormat("raw", rawEnv)
93+
94+
if v, ok := os.LookupEnv("COMPOSE_STATUS_STDOUT"); ok {
95+
stdioToStdout, _ = strconv.ParseBool(v)
96+
}
9197
}
9298

9399
// Command defines a compose CLI command as a func with args
@@ -116,7 +122,7 @@ func AdaptCmd(fn CobraCommand) func(cmd *cobra.Command, args []string) error {
116122
StatusCode: 130,
117123
}
118124
}
119-
if ui.Mode == ui.ModeJSON {
125+
if display.Mode == display.ModeJSON {
120126
err = makeJSONError(err)
121127
}
122128
return err
@@ -486,49 +492,49 @@ func RootCommand(dockerCli command.Cli, backendOptions *BackendOptions) *cobra.C
486492
formatter.SetANSIMode(dockerCli, ansi)
487493

488494
if noColor, ok := os.LookupEnv("NO_COLOR"); ok && noColor != "" {
489-
ui.NoColor()
495+
display.NoColor()
490496
formatter.SetANSIMode(dockerCli, formatter.Never)
491497
}
492498

493499
switch ansi {
494500
case "never":
495-
ui.Mode = ui.ModePlain
501+
display.Mode = display.ModePlain
496502
case "always":
497-
ui.Mode = ui.ModeTTY
503+
display.Mode = display.ModeTTY
498504
}
499505

500-
var ep ui.EventProcessor
506+
var ep api.EventProcessor
501507
switch opts.Progress {
502-
case "", ui.ModeAuto:
508+
case "", display.ModeAuto:
503509
switch {
504510
case ansi == "never":
505-
ui.Mode = ui.ModePlain
506-
ep = ui.NewPlainWriter(dockerCli.Err())
511+
display.Mode = display.ModePlain
512+
ep = display.Plain(dockerCli.Err())
507513
case dockerCli.Out().IsTerminal():
508-
ep = ui.NewTTYWriter(dockerCli.Err())
514+
ep = display.Full(dockerCli.Err(), stdinfo(dockerCli))
509515
default:
510-
ep = ui.NewPlainWriter(dockerCli.Err())
516+
ep = display.Plain(dockerCli.Err())
511517
}
512-
case ui.ModeTTY:
518+
case display.ModeTTY:
513519
if ansi == "never" {
514520
return fmt.Errorf("can't use --progress tty while ANSI support is disabled")
515521
}
516-
ui.Mode = ui.ModeTTY
517-
ep = ui.NewTTYWriter(dockerCli.Err())
522+
display.Mode = display.ModeTTY
523+
ep = display.Full(dockerCli.Err(), stdinfo(dockerCli))
518524

519-
case ui.ModePlain:
525+
case display.ModePlain:
520526
if ansi == "always" {
521527
return fmt.Errorf("can't use --progress plain while ANSI support is forced")
522528
}
523-
ui.Mode = ui.ModePlain
524-
ep = ui.NewPlainWriter(dockerCli.Err())
525-
case ui.ModeQuiet, "none":
526-
ui.Mode = ui.ModeQuiet
527-
ep = ui.NewQuietWriter()
528-
case ui.ModeJSON:
529-
ui.Mode = ui.ModeJSON
529+
display.Mode = display.ModePlain
530+
ep = display.Plain(dockerCli.Err())
531+
case display.ModeQuiet, "none":
532+
display.Mode = display.ModeQuiet
533+
ep = display.Quiet()
534+
case display.ModeJSON:
535+
display.Mode = display.ModeJSON
530536
logrus.SetFormatter(&logrus.JSONFormatter{})
531-
ep = ui.NewJSONWriter(dockerCli.Err())
537+
ep = display.JSON(dockerCli.Err())
532538
default:
533539
return fmt.Errorf("unsupported --progress value %q", opts.Progress)
534540
}
@@ -658,6 +664,13 @@ func RootCommand(dockerCli command.Cli, backendOptions *BackendOptions) *cobra.C
658664
return c
659665
}
660666

667+
func stdinfo(dockerCli command.Cli) io.Writer {
668+
if stdioToStdout {
669+
return dockerCli.Out()
670+
}
671+
return dockerCli.Err()
672+
}
673+
661674
func setEnvWithDotEnv(opts ProjectOptions) error {
662675
options, err := cli.NewProjectOptions(opts.ConfigPaths,
663676
cli.WithWorkingDirectory(opts.ProjectDir),
@@ -683,9 +696,9 @@ func setEnvWithDotEnv(opts ProjectOptions) error {
683696
}
684697

685698
var printerModes = []string{
686-
ui.ModeAuto,
687-
ui.ModeTTY,
688-
ui.ModePlain,
689-
ui.ModeJSON,
690-
ui.ModeQuiet,
699+
display.ModeAuto,
700+
display.ModeTTY,
701+
display.ModePlain,
702+
display.ModeJSON,
703+
display.ModeQuiet,
691704
}

cmd/compose/kill.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ package compose
1818

1919
import (
2020
"context"
21+
"errors"
22+
"fmt"
2123
"os"
2224

2325
"github.com/docker/cli/cli/command"
@@ -65,10 +67,15 @@ func runKill(ctx context.Context, dockerCli command.Cli, backendOptions *Backend
6567
if err != nil {
6668
return err
6769
}
68-
return backend.Kill(ctx, name, api.KillOptions{
70+
err = backend.Kill(ctx, name, api.KillOptions{
6971
RemoveOrphans: opts.removeOrphans,
7072
Project: project,
7173
Services: services,
7274
Signal: opts.signal,
7375
})
76+
if errors.Is(err, api.ErrNoResources) {
77+
_, _ = fmt.Fprintln(stdinfo(dockerCli), "No container to kill")
78+
return nil
79+
}
80+
return err
7481
}

cmd/compose/logs.go

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import (
2222

2323
"github.com/docker/cli/cli/command"
2424
"github.com/docker/compose/v2/pkg/compose"
25-
"github.com/docker/compose/v2/pkg/progress"
2625
"github.com/spf13/cobra"
2726

2827
"github.com/docker/compose/v2/cmd/formatter"
@@ -107,28 +106,28 @@ func runLogs(ctx context.Context, dockerCli command.Cli, backendOptions *Backend
107106
var _ api.LogConsumer = &logConsumer{}
108107

109108
type logConsumer struct {
110-
events progress.EventProcessor
109+
events api.EventProcessor
111110
}
112111

113112
func (l logConsumer) Log(containerName, message string) {
114-
l.events.On(progress.Event{
113+
l.events.On(api.Resource{
115114
ID: containerName,
116115
Text: message,
117116
})
118117
}
119118

120119
func (l logConsumer) Err(containerName, message string) {
121-
l.events.On(progress.Event{
120+
l.events.On(api.Resource{
122121
ID: containerName,
123-
Status: progress.Error,
122+
Status: api.Error,
124123
Text: message,
125124
})
126125
}
127126

128127
func (l logConsumer) Status(containerName, message string) {
129-
l.events.On(progress.Event{
128+
l.events.On(api.Resource{
130129
ID: containerName,
131-
Status: progress.Error,
130+
Status: api.Error,
132131
Text: message,
133132
})
134133
}

cmd/compose/options.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,9 @@ import (
3030
"github.com/compose-spec/compose-go/v2/template"
3131
"github.com/compose-spec/compose-go/v2/types"
3232
"github.com/docker/cli/cli/command"
33+
"github.com/docker/compose/v2/cmd/display"
3334
"github.com/docker/compose/v2/cmd/prompt"
3435
"github.com/docker/compose/v2/internal/tracing"
35-
ui "github.com/docker/compose/v2/pkg/progress"
3636
)
3737

3838
func applyPlatforms(project *types.Project, buildForSinglePlatform bool) error {
@@ -247,7 +247,7 @@ func displayInterpolationVariables(writer io.Writer, varsInfo []varInfo) {
247247

248248
func displayLocationRemoteStack(dockerCli command.Cli, project *types.Project, options buildOptions) {
249249
mainComposeFile := options.ProjectOptions.ConfigPaths[0] //nolint:staticcheck
250-
if ui.Mode != ui.ModeQuiet && ui.Mode != ui.ModeJSON {
250+
if display.Mode != display.ModeQuiet && display.Mode != display.ModeJSON {
251251
_, _ = fmt.Fprintf(dockerCli.Out(), "Your compose stack %q is stored in %q\n", mainComposeFile, project.WorkingDir)
252252
}
253253
}

cmd/compose/remove.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ package compose
1818

1919
import (
2020
"context"
21+
"errors"
22+
"fmt"
2123

2224
"github.com/docker/cli/cli/command"
2325
"github.com/docker/compose/v2/pkg/api"
@@ -70,11 +72,16 @@ func runRemove(ctx context.Context, dockerCli command.Cli, backendOptions *Backe
7072
if err != nil {
7173
return err
7274
}
73-
return backend.Remove(ctx, name, api.RemoveOptions{
75+
err = backend.Remove(ctx, name, api.RemoveOptions{
7476
Services: services,
7577
Force: opts.force,
7678
Volumes: opts.volumes,
7779
Project: project,
7880
Stop: opts.stop,
7981
})
82+
if errors.Is(err, api.ErrNoResources) {
83+
_, _ = fmt.Fprintln(stdinfo(dockerCli), "No stopped containers")
84+
return nil
85+
}
86+
return err
8087
}

cmd/compose/run.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ import (
2525
composecli "github.com/compose-spec/compose-go/v2/cli"
2626
"github.com/compose-spec/compose-go/v2/dotenv"
2727
"github.com/compose-spec/compose-go/v2/format"
28+
"github.com/docker/compose/v2/cmd/display"
2829
"github.com/docker/compose/v2/pkg/compose"
29-
"github.com/docker/compose/v2/pkg/progress"
3030
xprogress "github.com/moby/buildkit/util/progress/progressui"
3131
"github.com/sirupsen/logrus"
3232

@@ -193,7 +193,7 @@ func runCommand(p *ProjectOptions, dockerCli command.Cli, backendOptions *Backen
193193
}
194194

195195
if options.quiet {
196-
progress.Mode = progress.ModeQuiet
196+
display.Mode = display.ModeQuiet
197197
devnull, err := os.Open(os.DevNull)
198198
if err != nil {
199199
return err

cmd/compose/up.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ import (
2626

2727
"github.com/compose-spec/compose-go/v2/types"
2828
"github.com/docker/cli/cli/command"
29+
"github.com/docker/compose/v2/cmd/display"
2930
"github.com/docker/compose/v2/pkg/compose"
30-
ui "github.com/docker/compose/v2/pkg/progress"
3131
xprogress "github.com/moby/buildkit/util/progress/progressui"
3232
"github.com/sirupsen/logrus"
3333
"github.com/spf13/cobra"
@@ -341,7 +341,7 @@ func runUp(
341341
WaitTimeout: timeout,
342342
Watch: upOptions.watch,
343343
Services: services,
344-
NavigationMenu: upOptions.navigationMenu && ui.Mode != "plain" && dockerCli.In().IsTerminal(),
344+
NavigationMenu: upOptions.navigationMenu && display.Mode != "plain" && dockerCli.In().IsTerminal(),
345345
},
346346
})
347347
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
limitations under the License.
1515
*/
1616

17-
package progress
17+
package display
1818

1919
import (
2020
"github.com/morikuni/aec"
Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,18 @@
1414
limitations under the License.
1515
*/
1616

17-
package progress
17+
package display
1818

1919
import (
2020
"context"
2121
"encoding/json"
2222
"fmt"
2323
"io"
24+
25+
"github.com/docker/compose/v2/pkg/api"
2426
)
2527

26-
func NewJSONWriter(out io.Writer) EventProcessor {
28+
func JSON(out io.Writer) api.EventProcessor {
2729
return &jsonWriter{
2830
out: out,
2931
}
@@ -50,7 +52,7 @@ type jsonMessage struct {
5052
func (p *jsonWriter) Start(ctx context.Context, operation string) {
5153
}
5254

53-
func (p *jsonWriter) Event(e Event) {
55+
func (p *jsonWriter) Event(e api.Resource) {
5456
message := &jsonMessage{
5557
DryRun: p.dryRun,
5658
Tail: false,
@@ -69,7 +71,7 @@ func (p *jsonWriter) Event(e Event) {
6971
}
7072
}
7173

72-
func (p *jsonWriter) On(events ...Event) {
74+
func (p *jsonWriter) On(events ...api.Resource) {
7375
for _, e := range events {
7476
p.Event(e)
7577
}

0 commit comments

Comments
 (0)