From 2dd9b34d28338e24a646d393ed4e522be55b7851 Mon Sep 17 00:00:00 2001
From: fibonacci1729 <brian@deis.com>
Date: Wed, 28 Mar 2018 15:43:23 -0600
Subject: [PATCH] stream releases when listing

---
 cmd/helm/list.go           | 18 +++++++++++-------
 pkg/helm/client.go         | 18 ++++++++++++++++--
 pkg/tiller/release_list.go | 17 +++++++++++------
 3 files changed, 38 insertions(+), 15 deletions(-)

diff --git a/cmd/helm/list.go b/cmd/helm/list.go
index 0219d60f2..4332ceb21 100644
--- a/cmd/helm/list.go
+++ b/cmd/helm/list.go
@@ -148,7 +148,7 @@ func (l *listCmd) run() error {
 		return prettyError(err)
 	}
 
-	if len(res.Releases) == 0 {
+	if len(res.GetReleases()) == 0 {
 		return nil
 	}
 
@@ -239,12 +239,16 @@ func formatList(rels []*release.Release, colWidth uint) string {
 	table.MaxColWidth = colWidth
 	table.AddRow("NAME", "REVISION", "UPDATED", "STATUS", "CHART", "NAMESPACE")
 	for _, r := range rels {
-		c := fmt.Sprintf("%s-%s", r.Chart.Metadata.Name, r.Chart.Metadata.Version)
-		t := timeconv.String(r.Info.LastDeployed)
-		s := r.Info.Status.Code.String()
-		v := r.Version
-		n := r.Namespace
-		table.AddRow(r.Name, v, t, s, c, n)
+		md := r.GetChart().GetMetadata()
+		c := fmt.Sprintf("%s-%s", md.GetName(), md.GetVersion())
+		t := "-"
+		if tspb := r.GetInfo().GetLastDeployed(); tspb != nil {
+			t = timeconv.String(tspb)
+		}
+		s := r.GetInfo().GetStatus().GetCode().String()
+		v := r.GetVersion()
+		n := r.GetNamespace()
+		table.AddRow(r.GetName(), v, t, s, c, n)
 	}
 	return table.String()
 }
diff --git a/pkg/helm/client.go b/pkg/helm/client.go
index 2fb1e54e4..43e9f4daf 100644
--- a/pkg/helm/client.go
+++ b/pkg/helm/client.go
@@ -346,8 +346,22 @@ func (h *Client) list(ctx context.Context, req *rls.ListReleasesRequest) (*rls.L
 	if err != nil {
 		return nil, err
 	}
-
-	return s.Recv()
+	var resp *rls.ListReleasesResponse
+	for {
+		r, err := s.Recv()
+		if err == io.EOF {
+			break
+		}
+		if err != nil {
+			return nil, err
+		}
+		if resp == nil {
+			resp = r
+			continue
+		}
+		resp.Releases = append(resp.Releases, r.GetReleases()[0])
+	}
+	return resp, nil
 }
 
 // Executes tiller.InstallRelease RPC.
diff --git a/pkg/tiller/release_list.go b/pkg/tiller/release_list.go
index 9ccc8a686..ec4dbfb39 100644
--- a/pkg/tiller/release_list.go
+++ b/pkg/tiller/release_list.go
@@ -108,13 +108,18 @@ func (s *ReleaseServer) ListReleases(req *services.ListReleasesRequest, stream s
 		l = int64(len(rels))
 	}
 
-	res := &services.ListReleasesResponse{
-		Next:     next,
-		Count:    l,
-		Total:    total,
-		Releases: rels,
+	for i := 0; i < min(len(rels), int(req.Limit)); i++ {
+		res := &services.ListReleasesResponse{
+			Next:     next,
+			Count:    l,
+			Total:    total,
+			Releases: []*release.Release{rels[i]},
+		}
+		if err := stream.Send(res); err != nil {
+			return err
+		}
 	}
-	return stream.Send(res)
+	return nil
 }
 
 func filterByNamespace(namespace string, rels []*release.Release) ([]*release.Release, error) {
-- 
GitLab