From a0f3e729eb61fc5008d572949b2237ff9a3416dc Mon Sep 17 00:00:00 2001 From: dongjiang1989 Date: Wed, 10 Dec 2025 12:45:08 +0800 Subject: [PATCH] change sort to slices Signed-off-by: dongjiang1989 --- .golangci.yml | 7 ++++ .../internal/controller/cronjob_controller.go | 34 ++++++++++++++----- .../internal/controller/cronjob_controller.go | 34 ++++++++++++++----- .../controller_implementation.go | 34 ++++++++++++++----- .../alpha/internal/update/helpers/conflict.go | 6 ++-- .../internal/update/helpers/open_gh_issue.go | 14 ++++---- pkg/cli/init.go | 4 +-- pkg/cli/root.go | 4 +-- pkg/config/v3/config_test.go | 6 ++-- pkg/config/version_test.go | 6 ++-- pkg/model/stage/stage_test.go | 6 ++-- pkg/plugin/bundle_test.go | 34 +++++++++---------- pkg/plugin/helpers.go | 5 ++- pkg/plugin/helpers_test.go | 6 ++-- pkg/plugin/version_test.go | 6 ++-- pkg/plugins/golang/go_version_test.go | 6 ++-- 16 files changed, 133 insertions(+), 79 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index 238b5592972..cde840abdf3 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -7,6 +7,7 @@ linters: - asciicheck - bidichk - copyloopvar + - depguard - dupl - errcheck - ginkgolinter @@ -29,6 +30,12 @@ linters: - wrapcheck - whitespace settings: + depguard: + rules: + forbid-pkg-errors: + deny: + - pkg: sort + desc: Should be replaced with slices package ginkgolinter: forbid-focus-container: true forbid-spec-pollution: true diff --git a/docs/book/src/cronjob-tutorial/testdata/project/internal/controller/cronjob_controller.go b/docs/book/src/cronjob-tutorial/testdata/project/internal/controller/cronjob_controller.go index 20a5220b1d8..55d88d950a0 100644 --- a/docs/book/src/cronjob-tutorial/testdata/project/internal/controller/cronjob_controller.go +++ b/docs/book/src/cronjob-tutorial/testdata/project/internal/controller/cronjob_controller.go @@ -26,7 +26,7 @@ import ( "context" "fmt" "maps" - "sort" + "slices" "time" "github.com/robfig/cron" @@ -373,11 +373,19 @@ func (r *CronJobReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct // NB: deleting these are "best effort" -- if we fail on a particular one, // we won't requeue just to finish the deleting. if cronJob.Spec.FailedJobsHistoryLimit != nil { - sort.Slice(failedJobs, func(i, j int) bool { - if failedJobs[i].Status.StartTime == nil { - return failedJobs[j].Status.StartTime != nil + slices.SortStableFunc(failedJobs, func(a, b *kbatch.Job) int { + aStartTime := a.Status.StartTime + bStartTime := b.Status.StartTime + if aStartTime == nil && bStartTime != nil { + return 1 } - return failedJobs[i].Status.StartTime.Before(failedJobs[j].Status.StartTime) + + if aStartTime.Before(bStartTime) { + return -1 + } else if bStartTime.Before(aStartTime) { + return 1 + } + return 0 }) for i, job := range failedJobs { if int32(i) >= int32(len(failedJobs))-*cronJob.Spec.FailedJobsHistoryLimit { @@ -392,11 +400,19 @@ func (r *CronJobReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct } if cronJob.Spec.SuccessfulJobsHistoryLimit != nil { - sort.Slice(successfulJobs, func(i, j int) bool { - if successfulJobs[i].Status.StartTime == nil { - return successfulJobs[j].Status.StartTime != nil + slices.SortStableFunc(successfulJobs, func(a, b *kbatch.Job) int { + aStartTime := a.Status.StartTime + bStartTime := b.Status.StartTime + if aStartTime == nil && bStartTime != nil { + return 1 + } + + if aStartTime.Before(bStartTime) { + return -1 + } else if bStartTime.Before(aStartTime) { + return 1 } - return successfulJobs[i].Status.StartTime.Before(successfulJobs[j].Status.StartTime) + return 0 }) for i, job := range successfulJobs { if int32(i) >= int32(len(successfulJobs))-*cronJob.Spec.SuccessfulJobsHistoryLimit { diff --git a/docs/book/src/multiversion-tutorial/testdata/project/internal/controller/cronjob_controller.go b/docs/book/src/multiversion-tutorial/testdata/project/internal/controller/cronjob_controller.go index 20a5220b1d8..55d88d950a0 100644 --- a/docs/book/src/multiversion-tutorial/testdata/project/internal/controller/cronjob_controller.go +++ b/docs/book/src/multiversion-tutorial/testdata/project/internal/controller/cronjob_controller.go @@ -26,7 +26,7 @@ import ( "context" "fmt" "maps" - "sort" + "slices" "time" "github.com/robfig/cron" @@ -373,11 +373,19 @@ func (r *CronJobReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct // NB: deleting these are "best effort" -- if we fail on a particular one, // we won't requeue just to finish the deleting. if cronJob.Spec.FailedJobsHistoryLimit != nil { - sort.Slice(failedJobs, func(i, j int) bool { - if failedJobs[i].Status.StartTime == nil { - return failedJobs[j].Status.StartTime != nil + slices.SortStableFunc(failedJobs, func(a, b *kbatch.Job) int { + aStartTime := a.Status.StartTime + bStartTime := b.Status.StartTime + if aStartTime == nil && bStartTime != nil { + return 1 } - return failedJobs[i].Status.StartTime.Before(failedJobs[j].Status.StartTime) + + if aStartTime.Before(bStartTime) { + return -1 + } else if bStartTime.Before(aStartTime) { + return 1 + } + return 0 }) for i, job := range failedJobs { if int32(i) >= int32(len(failedJobs))-*cronJob.Spec.FailedJobsHistoryLimit { @@ -392,11 +400,19 @@ func (r *CronJobReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct } if cronJob.Spec.SuccessfulJobsHistoryLimit != nil { - sort.Slice(successfulJobs, func(i, j int) bool { - if successfulJobs[i].Status.StartTime == nil { - return successfulJobs[j].Status.StartTime != nil + slices.SortStableFunc(successfulJobs, func(a, b *kbatch.Job) int { + aStartTime := a.Status.StartTime + bStartTime := b.Status.StartTime + if aStartTime == nil && bStartTime != nil { + return 1 + } + + if aStartTime.Before(bStartTime) { + return -1 + } else if bStartTime.Before(aStartTime) { + return 1 } - return successfulJobs[i].Status.StartTime.Before(successfulJobs[j].Status.StartTime) + return 0 }) for i, job := range successfulJobs { if int32(i) >= int32(len(successfulJobs))-*cronJob.Spec.SuccessfulJobsHistoryLimit { diff --git a/hack/docs/internal/cronjob-tutorial/controller_implementation.go b/hack/docs/internal/cronjob-tutorial/controller_implementation.go index 4ad1bf1e312..2312bebd33d 100644 --- a/hack/docs/internal/cronjob-tutorial/controller_implementation.go +++ b/hack/docs/internal/cronjob-tutorial/controller_implementation.go @@ -28,7 +28,7 @@ const controllerImport = `import ( "context" "fmt" "maps" - "sort" + "slices" "time" "github.com/robfig/cron" @@ -362,11 +362,19 @@ const controllerReconcileLogic = `log := logf.FromContext(ctx) // NB: deleting these are "best effort" -- if we fail on a particular one, // we won't requeue just to finish the deleting. if cronJob.Spec.FailedJobsHistoryLimit != nil { - sort.Slice(failedJobs, func(i, j int) bool { - if failedJobs[i].Status.StartTime == nil { - return failedJobs[j].Status.StartTime != nil + slices.SortStableFunc(failedJobs, func(a, b *kbatch.Job) int { + aStartTime := a.Status.StartTime + bStartTime := b.Status.StartTime + if aStartTime == nil && bStartTime != nil { + return 1 } - return failedJobs[i].Status.StartTime.Before(failedJobs[j].Status.StartTime) + + if aStartTime.Before(bStartTime) { + return -1 + } else if bStartTime.Before(aStartTime) { + return 1 + } + return 0 }) for i, job := range failedJobs { if int32(i) >= int32(len(failedJobs))-*cronJob.Spec.FailedJobsHistoryLimit { @@ -381,11 +389,19 @@ const controllerReconcileLogic = `log := logf.FromContext(ctx) } if cronJob.Spec.SuccessfulJobsHistoryLimit != nil { - sort.Slice(successfulJobs, func(i, j int) bool { - if successfulJobs[i].Status.StartTime == nil { - return successfulJobs[j].Status.StartTime != nil + slices.SortStableFunc(successfulJobs, func(a, b *kbatch.Job) int { + aStartTime := a.Status.StartTime + bStartTime := b.Status.StartTime + if aStartTime == nil && bStartTime != nil { + return 1 + } + + if aStartTime.Before(bStartTime) { + return -1 + } else if bStartTime.Before(aStartTime) { + return 1 } - return successfulJobs[i].Status.StartTime.Before(successfulJobs[j].Status.StartTime) + return 0 }) for i, job := range successfulJobs { if int32(i) >= int32(len(successfulJobs))-*cronJob.Spec.SuccessfulJobsHistoryLimit { diff --git a/pkg/cli/alpha/internal/update/helpers/conflict.go b/pkg/cli/alpha/internal/update/helpers/conflict.go index 0ba4a3c0223..aa677ef07ba 100644 --- a/pkg/cli/alpha/internal/update/helpers/conflict.go +++ b/pkg/cli/alpha/internal/update/helpers/conflict.go @@ -24,7 +24,7 @@ import ( "os" "os/exec" "path/filepath" - "sort" + "slices" "strings" ) @@ -83,8 +83,8 @@ func FindConflictFiles() ConflictResult { } } - sort.Strings(result.SourceFiles) - sort.Strings(result.GeneratedFiles) + slices.Sort(result.SourceFiles) + slices.Sort(result.GeneratedFiles) // Build summary for existing conflict.go usage result.Summary = ConflictSummary{ diff --git a/pkg/cli/alpha/internal/update/helpers/open_gh_issue.go b/pkg/cli/alpha/internal/update/helpers/open_gh_issue.go index f4a0659f281..bad4b3953cb 100644 --- a/pkg/cli/alpha/internal/update/helpers/open_gh_issue.go +++ b/pkg/cli/alpha/internal/update/helpers/open_gh_issue.go @@ -22,7 +22,7 @@ import ( "fmt" "os/exec" "regexp" - "sort" + "slices" "strings" ) @@ -225,8 +225,8 @@ func listChangedFiles(base, head string) (src []string, gen []string) { src = append(src, p) } } - sort.Strings(src) - sort.Strings(gen) + slices.Sort(src) + slices.Sort(gen) return src, gen } @@ -500,12 +500,12 @@ func concatSelectedDiffs(base, head string, files []string, perFileLineCap, tota candidates = append(candidates, p) } } - sort.Slice(candidates, func(i, j int) bool { - pi, pj := filePriority(candidates[i]), filePriority(candidates[j]) + slices.SortStableFunc(candidates, func(a, b string) int { + pi, pj := filePriority(a), filePriority(b) if pi != pj { - return pi < pj + return pi - pj } - return candidates[i] < candidates[j] // stable alphabetical within same priority + return strings.Compare(a, b) // stable alphabetical within same priority }) // Emit diffs until the global budget is hit diff --git a/pkg/cli/init.go b/pkg/cli/init.go index 1ad2a678357..0e9d36b958b 100644 --- a/pkg/cli/init.go +++ b/pkg/cli/init.go @@ -18,7 +18,7 @@ package cli import ( "fmt" - "sort" + "slices" "strconv" "strings" @@ -101,6 +101,6 @@ func (c CLI) getAvailableProjectVersions() (projectVersions []string) { for version := range versionSet { projectVersions = append(projectVersions, strconv.Quote(version.String())) } - sort.Strings(projectVersions) + slices.Sort(projectVersions) return projectVersions } diff --git a/pkg/cli/root.go b/pkg/cli/root.go index c73191196ec..e69337f23c0 100644 --- a/pkg/cli/root.go +++ b/pkg/cli/root.go @@ -18,7 +18,7 @@ package cli import ( "fmt" - "sort" + "slices" "strings" "github.com/spf13/cobra" @@ -115,7 +115,7 @@ func (c CLI) getPluginTable() string { lines = append(lines, strings.Repeat("-", maxPluginKeyLength+2)+"+"+ strings.Repeat("-", maxProjectVersionLength+2)) - sort.Strings(pluginKeys) + slices.Sort(pluginKeys) for _, pluginKey := range pluginKeys { supportedProjectVersions := projectVersions[pluginKey] lines = append(lines, fmt.Sprintf(" %[1]*[2]s | %[3]*[4]s", diff --git a/pkg/config/v3/config_test.go b/pkg/config/v3/config_test.go index f9216fb6fa2..9eff1296fb6 100644 --- a/pkg/config/v3/config_test.go +++ b/pkg/config/v3/config_test.go @@ -17,7 +17,7 @@ limitations under the License. package v3 import ( - "sort" + "slices" "testing" . "github.com/onsi/ginkgo/v2" @@ -314,7 +314,7 @@ var _ = Describe("Cfg", func() { }, ) versions := c.ListCRDVersions() - sort.Strings(versions) // ListCRDVersions has no order guarantee so sorting for reproducibility + slices.Sort(versions) // ListCRDVersions has no order guarantee so sorting for reproducibility Expect(versions).To(Equal([]string{"v1", "v1beta1"})) }) @@ -342,7 +342,7 @@ var _ = Describe("Cfg", func() { }, ) versions := c.ListWebhookVersions() - sort.Strings(versions) // ListWebhookVersions has no order guarantee so sorting for reproducibility + slices.Sort(versions) // ListWebhookVersions has no order guarantee so sorting for reproducibility Expect(versions).To(Equal([]string{"v1", "v1beta1"})) }) }) diff --git a/pkg/config/version_test.go b/pkg/config/version_test.go index d608a521f3b..2e1dd98b8bb 100644 --- a/pkg/config/version_test.go +++ b/pkg/config/version_test.go @@ -17,7 +17,7 @@ limitations under the License. package config import ( - "sort" + "slices" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" @@ -64,8 +64,8 @@ var _ = Describe("Version", func() { }) It("sorts a valid list of versions correctly", func() { - sort.Slice(versions, func(i int, j int) bool { - return versions[i].Compare(versions[j]) == -1 + slices.SortStableFunc(versions, func(a, b Version) int { + return a.Compare(b) }) Expect(versions).To(Equal(sortedVersions)) }) diff --git a/pkg/model/stage/stage_test.go b/pkg/model/stage/stage_test.go index 88d13d1173a..b079a3279b7 100644 --- a/pkg/model/stage/stage_test.go +++ b/pkg/model/stage/stage_test.go @@ -17,7 +17,7 @@ limitations under the License. package stage import ( - "sort" + "slices" "testing" . "github.com/onsi/ginkgo/v2" // An alias is required because Context is defined elsewhere in this package. @@ -115,8 +115,8 @@ var _ = Describe("Stage", func() { }) It("sorts stages correctly", func() { - sort.Slice(stages, func(i int, j int) bool { - return stages[i].Compare(stages[j]) == -1 + slices.SortStableFunc(stages, func(a, b Stage) int { + return a.Compare(b) }) Expect(stages).To(Equal(sortedStages)) }) diff --git a/pkg/plugin/bundle_test.go b/pkg/plugin/bundle_test.go index 18c718b626e..c4052a7b9ad 100644 --- a/pkg/plugin/bundle_test.go +++ b/pkg/plugin/bundle_test.go @@ -17,7 +17,7 @@ limitations under the License. package plugin import ( - "sort" + "slices" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" @@ -84,12 +84,12 @@ var _ = Describe("Bundle", func() { Expect(b.Name()).To(Equal(name)) Expect(b.Version().Compare(v)).To(Equal(0)) versions := b.SupportedProjectVersions() - sort.Slice(versions, func(i int, j int) bool { - return versions[i].Compare(versions[j]) == -1 + slices.SortStableFunc(versions, func(a, b config.Version) int { + return a.Compare(b) }) expectedVersions := CommonSupportedProjectVersions(plugins...) - sort.Slice(expectedVersions, func(i int, j int) bool { - return expectedVersions[i].Compare(expectedVersions[j]) == -1 + slices.SortStableFunc(expectedVersions, func(a, b config.Version) int { + return a.Compare(b) }) Expect(versions).To(Equal(expectedVersions)) Expect(b.Plugins()).To(Equal(plugins)) @@ -109,12 +109,12 @@ var _ = Describe("Bundle", func() { WithPlugins(a, p3)) Expect(err).NotTo(HaveOccurred()) versions := b.SupportedProjectVersions() - sort.Slice(versions, func(i int, j int) bool { - return versions[i].Compare(versions[j]) == -1 + slices.SortStableFunc(versions, func(a, b config.Version) int { + return a.Compare(b) }) expectedVersions := CommonSupportedProjectVersions(plugins...) - sort.Slice(expectedVersions, func(i int, j int) bool { - return expectedVersions[i].Compare(expectedVersions[j]) == -1 + slices.SortStableFunc(expectedVersions, func(a, b config.Version) int { + return a.Compare(b) }) Expect(versions).To(Equal(expectedVersions)) Expect(b.Plugins()).To(Equal(plugins)) @@ -159,12 +159,12 @@ var _ = Describe("Bundle", func() { Expect(b.Name()).To(Equal(name)) Expect(b.Version().Compare(v)).To(Equal(0)) versions := b.SupportedProjectVersions() - sort.Slice(versions, func(i int, j int) bool { - return versions[i].Compare(versions[j]) == -1 + slices.SortStableFunc(versions, func(a, b config.Version) int { + return a.Compare(b) }) expectedVersions := CommonSupportedProjectVersions(plugins...) - sort.Slice(expectedVersions, func(i int, j int) bool { - return expectedVersions[i].Compare(expectedVersions[j]) == -1 + slices.SortStableFunc(expectedVersions, func(a, b config.Version) int { + return a.Compare(b) }) Expect(versions).To(Equal(expectedVersions)) Expect(b.Plugins()).To(Equal(plugins)) @@ -188,12 +188,12 @@ var _ = Describe("Bundle", func() { ) Expect(err).NotTo(HaveOccurred()) versions := b.SupportedProjectVersions() - sort.Slice(versions, func(i int, j int) bool { - return versions[i].Compare(versions[j]) == -1 + slices.SortStableFunc(versions, func(a, b config.Version) int { + return a.Compare(b) }) expectedVersions := CommonSupportedProjectVersions(plugins...) - sort.Slice(expectedVersions, func(i int, j int) bool { - return expectedVersions[i].Compare(expectedVersions[j]) == -1 + slices.SortStableFunc(expectedVersions, func(a, b config.Version) int { + return a.Compare(b) }) Expect(versions).To(Equal(expectedVersions)) Expect(b.Plugins()).To(Equal(plugins)) diff --git a/pkg/plugin/helpers.go b/pkg/plugin/helpers.go index e199f0a1fc6..b28620c0ee3 100644 --- a/pkg/plugin/helpers.go +++ b/pkg/plugin/helpers.go @@ -20,7 +20,6 @@ import ( "fmt" "path" "slices" - "sort" "strings" "sigs.k8s.io/kubebuilder/v4/pkg/config" @@ -161,8 +160,8 @@ func CommonSupportedProjectVersions(plugins ...Plugin) []config.Version { } // Sort the output to guarantee consistency - sort.Slice(supportedProjectVersions, func(i int, j int) bool { - return supportedProjectVersions[i].Compare(supportedProjectVersions[j]) == -1 + slices.SortStableFunc(supportedProjectVersions, func(a, b config.Version) int { + return a.Compare(b) }) return supportedProjectVersions diff --git a/pkg/plugin/helpers_test.go b/pkg/plugin/helpers_test.go index 61883db26b9..15cfd6240b0 100644 --- a/pkg/plugin/helpers_test.go +++ b/pkg/plugin/helpers_test.go @@ -17,7 +17,7 @@ limitations under the License. package plugin import ( - "sort" + "slices" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" @@ -178,8 +178,8 @@ var _ = Describe("CommonSupportedProjectVersions", func() { {plugins: []Plugin{p1, p2, p3, p4}, versions: []config.Version{}}, } { versions := CommonSupportedProjectVersions(tc.plugins...) - sort.Slice(versions, func(i int, j int) bool { - return versions[i].Compare(versions[j]) == -1 + slices.SortStableFunc(versions, func(a, b config.Version) int { + return a.Compare(b) }) Expect(versions).To(Equal(tc.versions)) } diff --git a/pkg/plugin/version_test.go b/pkg/plugin/version_test.go index f5b41dfc376..b5396954e32 100644 --- a/pkg/plugin/version_test.go +++ b/pkg/plugin/version_test.go @@ -17,7 +17,7 @@ limitations under the License. package plugin import ( - "sort" + "slices" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" @@ -154,8 +154,8 @@ var _ = Describe("Version", func() { }) It("sorts a valid list of versions correctly", func() { - sort.Slice(versions, func(i int, j int) bool { - return versions[i].Compare(versions[j]) == -1 + slices.SortStableFunc(versions, func(a, b Version) int { + return a.Compare(b) }) Expect(versions).To(Equal(sortedVersions)) }) diff --git a/pkg/plugins/golang/go_version_test.go b/pkg/plugins/golang/go_version_test.go index 4153dded316..0dc334474e8 100644 --- a/pkg/plugins/golang/go_version_test.go +++ b/pkg/plugins/golang/go_version_test.go @@ -18,7 +18,7 @@ package golang import ( "errors" - "sort" + "slices" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" @@ -150,8 +150,8 @@ var _ = Describe("GoVersion", func() { }) It("sorts a valid list of versions correctly", func() { - sort.Slice(versions, func(i int, j int) bool { - return versions[i].Compare(versions[j]) == -1 + slices.SortStableFunc(versions, func(a, b GoVersion) int { + return a.Compare(b) }) Expect(versions).To(Equal(sortedVersions)) })