From 850db30bd01a6b472b6aab4c2d42d25a58ab5eb7 Mon Sep 17 00:00:00 2001 From: Adam Reese Date: Thu, 11 Jan 2018 15:19:53 -0800 Subject: [PATCH] fix(helm): filter helm list to print latest release `helm list` should only list latest release fixes #3208 --- cmd/helm/list.go | 26 +++++++++++++++++++++++++- cmd/helm/list_test.go | 8 ++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/cmd/helm/list.go b/cmd/helm/list.go index 2666893e8b4..bf543df5ebd 100644 --- a/cmd/helm/list.go +++ b/cmd/helm/list.go @@ -156,7 +156,7 @@ func (l *listCmd) run() error { fmt.Fprintf(l.out, "\tnext: %s\n", res.Next) } - rels := res.Releases + rels := filterList(res.Releases) if l.short { for _, r := range rels { @@ -168,6 +168,30 @@ func (l *listCmd) run() error { return nil } +// filterList returns a list scrubbed of old releases. +func filterList(rels []*release.Release) []*release.Release { + idx := map[string]int32{} + + for _, r := range rels { + name, version := r.GetName(), r.GetVersion() + if max, ok := idx[name]; ok { + // check if we have a greater version already + if max > version { + continue + } + } + idx[name] = version + } + + uniq := make([]*release.Release, 0, len(idx)) + for _, r := range rels { + if idx[r.GetName()] == r.GetVersion() { + uniq = append(uniq, r) + } + } + return uniq +} + // statusCodes gets the list of status codes that are to be included in the results. func (l *listCmd) statusCodes() []release.Status_Code { if l.all { diff --git a/cmd/helm/list_test.go b/cmd/helm/list_test.go index 587a7c39c48..6e3321664c4 100644 --- a/cmd/helm/list_test.go +++ b/cmd/helm/list_test.go @@ -118,6 +118,14 @@ func TestListCmd(t *testing.T) { }, expected: "thomas-guide\nwild-idea\ncrazy-maps", }, + { + name: "with old releases", + resp: []*release.Release{ + helm.ReleaseMock(&helm.MockReleaseOptions{Name: "thomas-guide"}), + helm.ReleaseMock(&helm.MockReleaseOptions{Name: "thomas-guide", StatusCode: release.Status_FAILED}), + }, + expected: "thomas-guide", + }, } var buf bytes.Buffer