Selaa lähdekoodia

make --status a multi-flag

Signed-off-by: Nicolas De Loof <[email protected]>
Nicolas De Loof 4 vuotta sitten
vanhempi
sitoutus
7f31fe678f
1 muutettua tiedostoa jossa 15 lisäystä ja 12 poistoa
  1. 15 12
      cmd/compose/ps.go

+ 15 - 12
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