diff --git a/kind_sorter.go b/kind_sorter.go index f5136f4..b2db8ee 100644 --- a/kind_sorter.go +++ b/kind_sorter.go @@ -113,15 +113,15 @@ var UninstallOrder KindSortOrder = []string{ // sort manifests by kind. // // Results are sorted by 'ordering', keeping order of items with equal kind/priority -func sortManifestsByKind(manifests []releaseutil.Manifest, ordering KindSortOrder) []releaseutil.Manifest { +func sortManifestsByKind(manifests []releaseutil.Manifest, ordering KindSortOrder, alphabetical bool) []releaseutil.Manifest { sort.SliceStable(manifests, func(i, j int) bool { - return lessByKind(manifests[i], manifests[j], manifests[i].Head.Kind, manifests[j].Head.Kind, ordering) + return lessByKind(manifests[i], manifests[j], manifests[i].Head.Kind, manifests[j].Head.Kind, ordering, alphabetical) }) return manifests } -func lessByKind(a interface{}, b interface{}, kindA string, kindB string, o KindSortOrder) bool { +func lessByKind(a interface{}, b interface{}, kindA string, kindB string, o KindSortOrder, alphabetical bool) bool { ordering := make(map[string]int, len(o)) for v, k := range o { ordering[k] = v @@ -144,6 +144,12 @@ func lessByKind(a interface{}, b interface{}, kindA string, kindB string, o Kind if !bok { return true } + if alphabetical && kindA == kindB { + // sort alphabetically only if kind is equal + manifestA, _ := a.(releaseutil.Manifest) + manifestB, _ := b.(releaseutil.Manifest) + return manifestA.Name < manifestB.Name + } // sort different kinds, keep original order if same priority return first < second } diff --git a/ksort.go b/ksort.go index 1177558..2ef8fb8 100644 --- a/ksort.go +++ b/ksort.go @@ -55,6 +55,7 @@ type options struct { filenameOptions resource.FilenameOptions delete bool nameOnly bool + alphabetical bool genericclioptions.IOStreams } @@ -108,6 +109,7 @@ func NewCommand(streams genericclioptions.IOStreams) *cobra.Command { o.filenameFlags.AddFlags(cmd.Flags()) cmd.Flags().BoolVarP(&o.delete, "delete", "d", o.delete, "Sort manifests in uninstall order") cmd.Flags().BoolVarP(&o.nameOnly, "name-only", "n", o.nameOnly, "Print only the name of the sorted manifests") + cmd.Flags().BoolVarP(&o.alphabetical, "alphabetical", "a", o.alphabetical, "Sort manifests alphabetically within kinds") cmd.Flags().BoolVar(&printVersion, "version", printVersion, "Print the version and exit") cmd.Flags().AddGoFlagSet(flag.CommandLine) @@ -215,7 +217,7 @@ func (o *options) run() error { } a := make([]string, len(manifests)) - for i, m := range sortManifestsByKind(manifests, sortOrder) { + for i, m := range sortManifestsByKind(manifests, sortOrder, o.alphabetical) { // If manifest data is read from stdin, m.Name is empty if m.Name != "" { a[i] += fmt.Sprintf("# Source: %s\n", m.Name) @@ -230,7 +232,7 @@ func (o *options) run() error { } if o.nameOnly { - for _, m := range sortManifestsByKind(manifests, sortOrder) { + for _, m := range sortManifestsByKind(manifests, sortOrder, o.alphabetical) { fmt.Println(m.Name) } } else {