diff --git a/pkg/action/list.go b/pkg/action/list.go index 7902837fd..70dd31bae 100644 --- a/pkg/action/list.go +++ b/pkg/action/list.go @@ -99,8 +99,8 @@ const ( // List is the action for listing releases. // // It provides, for example, the implementation of 'helm list'. -// It returns no more than one revision of every release in one specific, or in -// all, namespaces. +// It returns the latest revision of every release in one specific, or in all, +// namespaces, unless superseded releases are requested. // To list all the revisions of a specific release, see the History action. type List struct { cfg *Configuration @@ -117,7 +117,7 @@ type List struct { ByDate bool SortReverse bool // StateMask accepts a bitmask of states for items to show. - // The default is ListDeployed + // The default is ListAll. StateMask ListStates // Limit is the number of items to return per Run() Limit int @@ -185,10 +185,11 @@ func (l *List) Run() ([]ri.Releaser, error) { return nil, err } - // by definition, superseded releases are never shown if - // only the latest releases are returned. so if requested statemask - // is _only_ ListSuperseded, skip the latest release filter - if l.StateMask != ListSuperseded { + // By definition, superseded releases are never shown if only the latest + // releases are returned. Skip the latest release filter whenever the state + // mask includes superseded releases, including in combination with other + // states. + if l.StateMask&ListSuperseded == 0 { rresults = filterLatestReleases(rresults) } diff --git a/pkg/action/list_test.go b/pkg/action/list_test.go index 1c849028d..b7e65b97b 100644 --- a/pkg/action/list_test.go +++ b/pkg/action/list_test.go @@ -249,6 +249,74 @@ func TestList_StateMaskWithStaleRevisions(t *testing.T) { is.Equal("failed", ac0.Name()) } +func TestList_StateMaskWithSupersededRevisions(t *testing.T) { + tests := []struct { + name string + stateMask ListStates + expected map[int]common.Status + }{ + { + name: "superseded only", + stateMask: ListSuperseded, + expected: map[int]common.Status{ + 1: common.StatusSuperseded, + }, + }, + { + name: "superseded and deployed", + stateMask: ListSuperseded | ListDeployed, + expected: map[int]common.Status{ + 1: common.StatusSuperseded, + 2: common.StatusDeployed, + }, + }, + { + name: "all states", + stateMask: ListAll, + expected: map[int]common.Status{ + 1: common.StatusSuperseded, + 2: common.StatusDeployed, + }, + }, + { + name: "deployed only", + stateMask: ListDeployed, + expected: map[int]common.Status{ + 2: common.StatusDeployed, + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + lister := newListFixture(t) + lister.StateMask = tt.stateMask + + oldRelease := namedReleaseStub("release", common.StatusSuperseded) + oldRelease.Namespace = "default" + oldRelease.Version = 1 + currentRelease := namedReleaseStub("release", common.StatusDeployed) + currentRelease.Namespace = "default" + currentRelease.Version = 2 + + for _, rel := range []*release.Release{oldRelease, currentRelease} { + require.NoError(t, lister.cfg.Releases.Create(rel)) + } + + results, err := lister.Run() + require.NoError(t, err) + + actual := make(map[int]common.Status, len(results)) + for _, result := range results { + accessor, err := ri.NewAccessor(result) + require.NoError(t, err) + actual[accessor.Version()] = common.Status(accessor.Status()) + } + assert.Equal(t, tt.expected, actual) + }) + } +} + func makeMeSomeReleasesWithStaleFailure(t *testing.T, store *storage.Storage) { t.Helper() one := namedReleaseStub("clean", common.StatusDeployed) diff --git a/pkg/cmd/list.go b/pkg/cmd/list.go index 00465d232..cd5da6199 100644 --- a/pkg/cmd/list.go +++ b/pkg/cmd/list.go @@ -280,7 +280,21 @@ func compListReleases(toComplete string, ignoredReleaseNames []string, cfg *acti var choices []string filteredReleases := filterReleases(releases, ignoredReleaseNames) + // Completions are release names, so keep only the latest revision of each + // release even though ListAll also returns superseded revisions. + latestReleases := make([]*release.Release, 0, len(filteredReleases)) + indices := make(map[string]int, len(filteredReleases)) for _, rel := range filteredReleases { + if index, ok := indices[rel.Name]; ok { + if rel.Version > latestReleases[index].Version { + latestReleases[index] = rel + } + continue + } + indices[rel.Name] = len(latestReleases) + latestReleases = append(latestReleases, rel) + } + for _, rel := range latestReleases { choices = append(choices, fmt.Sprintf("%s\t%s-%s -> %s", rel.Name, rel.Chart.Metadata.Name, rel.Chart.Metadata.Version, rel.Info.Status.String())) } diff --git a/pkg/cmd/list_test.go b/pkg/cmd/list_test.go index 41426fedb..03dae373e 100644 --- a/pkg/cmd/list_test.go +++ b/pkg/cmd/list_test.go @@ -222,6 +222,11 @@ func TestListCmd(t *testing.T) { cmd: "list --superseded", golden: "output/list-superseded.txt", rels: releaseFixture, + }, { + name: "list deployed and superseded releases", + cmd: "list --deployed --superseded", + golden: "output/list-deployed-superseded.txt", + rels: releaseFixture, }, { name: "list uninstalled releases", cmd: "list --uninstalled", diff --git a/pkg/cmd/testdata/output/list-all-date-reversed.txt b/pkg/cmd/testdata/output/list-all-date-reversed.txt index d185334a2..689a12042 100644 --- a/pkg/cmd/testdata/output/list-all-date-reversed.txt +++ b/pkg/cmd/testdata/output/list-all-date-reversed.txt @@ -4,6 +4,7 @@ hummingbird default 1 2016-01-16 00:00:03 +0000 UTC deployed chi rocket default 1 2016-01-16 00:00:02 +0000 UTC failed chickadee-1.0.0 0.0.1 thanos default 1 2016-01-16 00:00:01 +0000 UTC pending-install chickadee-1.0.0 0.0.1 starlord default 2 2016-01-16 00:00:01 +0000 UTC deployed chickadee-1.0.0 0.0.1 +starlord default 1 2016-01-16 00:00:01 +0000 UTC superseded chickadee-1.0.0 0.0.1 groot default 1 2016-01-16 00:00:01 +0000 UTC uninstalled chickadee-1.0.0 0.0.1 gamora default 1 2016-01-16 00:00:01 +0000 UTC superseded chickadee-1.0.0 0.0.1 drax default 1 2016-01-16 00:00:01 +0000 UTC uninstalling chickadee-1.0.0 0.0.1 diff --git a/pkg/cmd/testdata/output/list-all-date.txt b/pkg/cmd/testdata/output/list-all-date.txt index 5e5f9efee..3793afeca 100644 --- a/pkg/cmd/testdata/output/list-all-date.txt +++ b/pkg/cmd/testdata/output/list-all-date.txt @@ -2,6 +2,7 @@ NAME NAMESPACE REVISION UPDATED STATUS CHA drax default 1 2016-01-16 00:00:01 +0000 UTC uninstalling chickadee-1.0.0 0.0.1 gamora default 1 2016-01-16 00:00:01 +0000 UTC superseded chickadee-1.0.0 0.0.1 groot default 1 2016-01-16 00:00:01 +0000 UTC uninstalled chickadee-1.0.0 0.0.1 +starlord default 1 2016-01-16 00:00:01 +0000 UTC superseded chickadee-1.0.0 0.0.1 starlord default 2 2016-01-16 00:00:01 +0000 UTC deployed chickadee-1.0.0 0.0.1 thanos default 1 2016-01-16 00:00:01 +0000 UTC pending-install chickadee-1.0.0 0.0.1 rocket default 1 2016-01-16 00:00:02 +0000 UTC failed chickadee-1.0.0 0.0.1 diff --git a/pkg/cmd/testdata/output/list-all-no-headers.txt b/pkg/cmd/testdata/output/list-all-no-headers.txt index 33581d8c5..e6a118d85 100644 --- a/pkg/cmd/testdata/output/list-all-no-headers.txt +++ b/pkg/cmd/testdata/output/list-all-no-headers.txt @@ -4,5 +4,6 @@ groot default 1 2016-01-16 00:00:01 +0000 UTC uninstalled chickadee-1. hummingbird default 1 2016-01-16 00:00:03 +0000 UTC deployed chickadee-1.0.0 0.0.1 iguana default 2 2016-01-16 00:00:04 +0000 UTC deployed chickadee-1.0.0 0.0.1 rocket default 1 2016-01-16 00:00:02 +0000 UTC failed chickadee-1.0.0 0.0.1 +starlord default 1 2016-01-16 00:00:01 +0000 UTC superseded chickadee-1.0.0 0.0.1 starlord default 2 2016-01-16 00:00:01 +0000 UTC deployed chickadee-1.0.0 0.0.1 thanos default 1 2016-01-16 00:00:01 +0000 UTC pending-install chickadee-1.0.0 0.0.1 diff --git a/pkg/cmd/testdata/output/list-all-offset.txt b/pkg/cmd/testdata/output/list-all-offset.txt index e17fd7b00..83bf6e8d4 100644 --- a/pkg/cmd/testdata/output/list-all-offset.txt +++ b/pkg/cmd/testdata/output/list-all-offset.txt @@ -4,5 +4,6 @@ groot default 1 2016-01-16 00:00:01 +0000 UTC uninstalled chi hummingbird default 1 2016-01-16 00:00:03 +0000 UTC deployed chickadee-1.0.0 0.0.1 iguana default 2 2016-01-16 00:00:04 +0000 UTC deployed chickadee-1.0.0 0.0.1 rocket default 1 2016-01-16 00:00:02 +0000 UTC failed chickadee-1.0.0 0.0.1 +starlord default 1 2016-01-16 00:00:01 +0000 UTC superseded chickadee-1.0.0 0.0.1 starlord default 2 2016-01-16 00:00:01 +0000 UTC deployed chickadee-1.0.0 0.0.1 thanos default 1 2016-01-16 00:00:01 +0000 UTC pending-install chickadee-1.0.0 0.0.1 diff --git a/pkg/cmd/testdata/output/list-all-reverse.txt b/pkg/cmd/testdata/output/list-all-reverse.txt index 31bb3de96..66d93e2cc 100644 --- a/pkg/cmd/testdata/output/list-all-reverse.txt +++ b/pkg/cmd/testdata/output/list-all-reverse.txt @@ -1,6 +1,7 @@ NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION thanos default 1 2016-01-16 00:00:01 +0000 UTC pending-install chickadee-1.0.0 0.0.1 starlord default 2 2016-01-16 00:00:01 +0000 UTC deployed chickadee-1.0.0 0.0.1 +starlord default 1 2016-01-16 00:00:01 +0000 UTC superseded chickadee-1.0.0 0.0.1 rocket default 1 2016-01-16 00:00:02 +0000 UTC failed chickadee-1.0.0 0.0.1 iguana default 2 2016-01-16 00:00:04 +0000 UTC deployed chickadee-1.0.0 0.0.1 hummingbird default 1 2016-01-16 00:00:03 +0000 UTC deployed chickadee-1.0.0 0.0.1 diff --git a/pkg/cmd/testdata/output/list-all-short-json.txt b/pkg/cmd/testdata/output/list-all-short-json.txt index 6dac52c43..85a285c43 100644 --- a/pkg/cmd/testdata/output/list-all-short-json.txt +++ b/pkg/cmd/testdata/output/list-all-short-json.txt @@ -1 +1 @@ -["drax","gamora","groot","hummingbird","iguana","rocket","starlord","thanos"] +["drax","gamora","groot","hummingbird","iguana","rocket","starlord","starlord","thanos"] diff --git a/pkg/cmd/testdata/output/list-all-short-yaml.txt b/pkg/cmd/testdata/output/list-all-short-yaml.txt index 2ae0e88ad..ceb6003dd 100644 --- a/pkg/cmd/testdata/output/list-all-short-yaml.txt +++ b/pkg/cmd/testdata/output/list-all-short-yaml.txt @@ -5,4 +5,5 @@ - iguana - rocket - starlord +- starlord - thanos diff --git a/pkg/cmd/testdata/output/list-all-short.txt b/pkg/cmd/testdata/output/list-all-short.txt index 52871d8b4..97e89fcf9 100644 --- a/pkg/cmd/testdata/output/list-all-short.txt +++ b/pkg/cmd/testdata/output/list-all-short.txt @@ -5,4 +5,5 @@ hummingbird iguana rocket starlord +starlord thanos diff --git a/pkg/cmd/testdata/output/list-all.txt b/pkg/cmd/testdata/output/list-all.txt index ef6d44cd5..c41aa35cd 100644 --- a/pkg/cmd/testdata/output/list-all.txt +++ b/pkg/cmd/testdata/output/list-all.txt @@ -5,5 +5,6 @@ groot default 1 2016-01-16 00:00:01 +0000 UTC uninstalled chi hummingbird default 1 2016-01-16 00:00:03 +0000 UTC deployed chickadee-1.0.0 0.0.1 iguana default 2 2016-01-16 00:00:04 +0000 UTC deployed chickadee-1.0.0 0.0.1 rocket default 1 2016-01-16 00:00:02 +0000 UTC failed chickadee-1.0.0 0.0.1 +starlord default 1 2016-01-16 00:00:01 +0000 UTC superseded chickadee-1.0.0 0.0.1 starlord default 2 2016-01-16 00:00:01 +0000 UTC deployed chickadee-1.0.0 0.0.1 thanos default 1 2016-01-16 00:00:01 +0000 UTC pending-install chickadee-1.0.0 0.0.1 diff --git a/pkg/cmd/testdata/output/list-deployed-superseded.txt b/pkg/cmd/testdata/output/list-deployed-superseded.txt new file mode 100644 index 000000000..cb8573ee2 --- /dev/null +++ b/pkg/cmd/testdata/output/list-deployed-superseded.txt @@ -0,0 +1,6 @@ +NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION +gamora default 1 2016-01-16 00:00:01 +0000 UTC superseded chickadee-1.0.0 0.0.1 +hummingbird default 1 2016-01-16 00:00:03 +0000 UTC deployed chickadee-1.0.0 0.0.1 +iguana default 2 2016-01-16 00:00:04 +0000 UTC deployed chickadee-1.0.0 0.0.1 +starlord default 1 2016-01-16 00:00:01 +0000 UTC superseded chickadee-1.0.0 0.0.1 +starlord default 2 2016-01-16 00:00:01 +0000 UTC deployed chickadee-1.0.0 0.0.1