From 7f31fe678f4366cd48f5e61e057fed1da263f5b9 Mon Sep 17 00:00:00 2001 From: Nicolas De Loof Date: Wed, 29 Sep 2021 17:12:41 +0200 Subject: [PATCH] make --status a multi-flag Signed-off-by: Nicolas De Loof --- cmd/compose/ps.go | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/cmd/compose/ps.go b/cmd/compose/ps.go index 27a0c812..c32c39e9 100644 --- a/cmd/compose/ps.go +++ b/cmd/compose/ps.go @@ -42,7 +42,7 @@ type psOptions struct { Quiet bool Services bool Filter string - Status string + Status []string } func (p *psOptions) parseFilter() error { @@ -55,7 +55,7 @@ func (p *psOptions) parseFilter() error { } switch parts[0] { case "status": - p.Status = parts[1] + p.Status = append(p.Status, parts[1]) case "source": return api.ErrNotImplemented default: @@ -82,7 +82,7 @@ func psCommand(p *projectOptions, backend api.Service) *cobra.Command { flags := psCmd.Flags() flags.StringVar(&opts.Format, "format", "pretty", "Format the output. Values: [pretty | json]") flags.StringVar(&opts.Filter, "filter", "", "Filter services by a property. Deprecated, use --status instead") - flags.StringVar(&opts.Status, "status", "", "Filter services by status. Values: [paused | restarting | removing | running | dead | created | exited]") + flags.StringArrayVar(&opts.Status, "status", []string{}, "Filter services by status. Values: [paused | restarting | removing | running | dead | created | exited]") flags.BoolVarP(&opts.Quiet, "quiet", "q", false, "Only display IDs") flags.BoolVar(&opts.Services, "services", false, "Display services") flags.BoolVarP(&opts.All, "all", "a", false, "Show all stopped containers (including those created by the run command)") @@ -124,7 +124,7 @@ SERVICES: return fmt.Errorf("no such service: %s", s) } - if opts.Status != "" { + if len(opts.Status) != 0 { containers = filterByStatus(containers, opts.Status) } @@ -160,22 +160,25 @@ func writter(containers []api.ContainerSummary) func(w io.Writer) { } } -func filterByStatus(containers []api.ContainerSummary, status string) []api.ContainerSummary { - hasContainerWithState := map[string]struct{}{} - for _, c := range containers { - if c.State == status { - hasContainerWithState[c.Service] = struct{}{} - } - } +func filterByStatus(containers []api.ContainerSummary, statuses []string) []api.ContainerSummary { var filtered []api.ContainerSummary for _, c := range containers { - if _, ok := hasContainerWithState[c.Service]; ok { + if hasStatus(c, statuses) { filtered = append(filtered, c) } } return filtered } +func hasStatus(c api.ContainerSummary, statuses []string) bool { + for _, status := range statuses { + if c.State == status { + return true + } + } + return false +} + type portRange struct { pStart int pEnd int