]> source.dussan.org Git - gitea.git/commitdiff
Replace `util.SliceXxx` with `slices.Xxx` (#26958)
authorCaiCandong <50507092+CaiCandong@users.noreply.github.com>
Thu, 7 Sep 2023 09:37:47 +0000 (17:37 +0800)
committerGitHub <noreply@github.com>
Thu, 7 Sep 2023 09:37:47 +0000 (09:37 +0000)
16 files changed:
models/actions/run.go
models/actions/run_job.go
models/git/protected_branch.go
models/issues/issue.go
models/repo/repo_unit.go
modules/indexer/code/indexer.go
modules/indexer/issues/internal/tests/tests.go
modules/templates/base.go
modules/util/slice.go
modules/util/slice_test.go
routers/api/packages/chef/auth.go
routers/api/v1/repo/repo.go
routers/web/repo/issue.go
routers/web/repo/repo.go
routers/web/repo/view.go
routers/web/user/home.go

index 18ed447e80214b5687d1293f2a1e1605bcc56e65..4853afc15b09b3764a30952fe93a103aed47f892 100644 (file)
@@ -6,6 +6,7 @@ package actions
 import (
        "context"
        "fmt"
+       "slices"
        "strings"
        "time"
 
@@ -350,7 +351,7 @@ func UpdateRun(ctx context.Context, run *ActionRun, cols ...string) error {
                // It's impossible that the run is not found, since Gitea never deletes runs.
        }
 
-       if run.Status != 0 || util.SliceContains(cols, "status") {
+       if run.Status != 0 || slices.Contains(cols, "status") {
                if run.RepoID == 0 {
                        run, err = GetRunByID(ctx, run.ID)
                        if err != nil {
index 1da58bb65922d53cc2d490824ae32d0ce7f88563..4b8664077dca9a9d0519c66c85d719521eb46677 100644 (file)
@@ -6,6 +6,7 @@ package actions
 import (
        "context"
        "fmt"
+       "slices"
        "time"
 
        "code.gitea.io/gitea/models/db"
@@ -107,11 +108,11 @@ func UpdateRunJob(ctx context.Context, job *ActionRunJob, cond builder.Cond, col
                return 0, err
        }
 
-       if affected == 0 || (!util.SliceContains(cols, "status") && job.Status == 0) {
+       if affected == 0 || (!slices.Contains(cols, "status") && job.Status == 0) {
                return affected, nil
        }
 
-       if affected != 0 && util.SliceContains(cols, "status") && job.Status.IsWaiting() {
+       if affected != 0 && slices.Contains(cols, "status") && job.Status.IsWaiting() {
                // if the status of job changes to waiting again, increase tasks version.
                if err := IncreaseTaskVersion(ctx, job.OwnerID, job.RepoID); err != nil {
                        return 0, err
index eef7e3935af87c353cec55dc2a089b2918e61727..5ed1003749749c3385be31fb95330b8115c162a8 100644 (file)
@@ -7,6 +7,7 @@ import (
        "context"
        "errors"
        "fmt"
+       "slices"
        "strings"
 
        "code.gitea.io/gitea/models/db"
@@ -435,7 +436,7 @@ func updateTeamWhitelist(ctx context.Context, repo *repo_model.Repository, curre
 
        whitelist = make([]int64, 0, len(teams))
        for i := range teams {
-               if util.SliceContains(newWhitelist, teams[i].ID) {
+               if slices.Contains(newWhitelist, teams[i].ID) {
                        whitelist = append(whitelist, teams[i].ID)
                }
        }
index f000f4c66029add03b41e17729d50be8eac26b41..8f59c9cb42e4b09ae1bee7271f3060c80acc73f6 100644 (file)
@@ -8,6 +8,7 @@ import (
        "context"
        "fmt"
        "regexp"
+       "slices"
 
        "code.gitea.io/gitea/models/db"
        project_model "code.gitea.io/gitea/models/project"
@@ -605,7 +606,7 @@ func IsUserParticipantsOfIssue(user *user_model.User, issue *Issue) bool {
                log.Error(err.Error())
                return false
        }
-       return util.SliceContains(userIDs, user.ID)
+       return slices.Contains(userIDs, user.ID)
 }
 
 // DependencyInfo represents high level information about an issue which is a dependency of another issue.
@@ -630,7 +631,7 @@ func (issue *Issue) GetParticipantIDsByIssue(ctx context.Context) ([]int64, erro
                Find(&userIDs); err != nil {
                return nil, fmt.Errorf("get poster IDs: %w", err)
        }
-       if !util.SliceContains(userIDs, issue.PosterID) {
+       if !slices.Contains(userIDs, issue.PosterID) {
                return append(userIDs, issue.PosterID), nil
        }
        return userIDs, nil
index cf9ff93d32153d68ed734cacc3428623c679082d..b8804c6df11946330e86f4eb34ad43f04a7d78d3 100644 (file)
@@ -6,6 +6,7 @@ package repo
 import (
        "context"
        "fmt"
+       "slices"
        "strings"
 
        "code.gitea.io/gitea/models/db"
@@ -176,7 +177,7 @@ func (cfg *ActionsConfig) ToString() string {
 }
 
 func (cfg *ActionsConfig) IsWorkflowDisabled(file string) bool {
-       return util.SliceContains(cfg.DisabledWorkflows, file)
+       return slices.Contains(cfg.DisabledWorkflows, file)
 }
 
 func (cfg *ActionsConfig) DisableWorkflow(file string) {
index 13d06874c96dc5f0ea58726610998ffd17313001..80bde7614f2b15c35aa8dfa9b2f9c1eb5c75eb1c 100644 (file)
@@ -7,6 +7,7 @@ import (
        "context"
        "os"
        "runtime/pprof"
+       "slices"
        "sync/atomic"
        "time"
 
@@ -20,7 +21,6 @@ import (
        "code.gitea.io/gitea/modules/process"
        "code.gitea.io/gitea/modules/queue"
        "code.gitea.io/gitea/modules/setting"
-       "code.gitea.io/gitea/modules/util"
 )
 
 var (
@@ -54,22 +54,22 @@ func index(ctx context.Context, indexer internal.Indexer, repoID int64) error {
        }
 
        // skip forks from being indexed if unit is not present
-       if !util.SliceContains(repoTypes, "forks") && repo.IsFork {
+       if !slices.Contains(repoTypes, "forks") && repo.IsFork {
                return nil
        }
 
        // skip mirrors from being indexed if unit is not present
-       if !util.SliceContains(repoTypes, "mirrors") && repo.IsMirror {
+       if !slices.Contains(repoTypes, "mirrors") && repo.IsMirror {
                return nil
        }
 
        // skip templates from being indexed if unit is not present
-       if !util.SliceContains(repoTypes, "templates") && repo.IsTemplate {
+       if !slices.Contains(repoTypes, "templates") && repo.IsTemplate {
                return nil
        }
 
        // skip regular repos from being indexed if unit is not present
-       if !util.SliceContains(repoTypes, "sources") && !repo.IsFork && !repo.IsMirror && !repo.IsTemplate {
+       if !slices.Contains(repoTypes, "sources") && !repo.IsFork && !repo.IsMirror && !repo.IsTemplate {
                return nil
        }
 
index 93d38a0b37996d52b94ac7e866f205f5af29d5aa..06fddeb65b627cf8c8a99db0bc05a76de7d7b9c6 100644 (file)
@@ -10,6 +10,7 @@ package tests
 import (
        "context"
        "fmt"
+       "slices"
        "testing"
        "time"
 
@@ -457,7 +458,7 @@ var cases = []*testIndexerCase{
                                assert.Contains(t, data[v.ID].MentionIDs, int64(1))
                        }
                        assert.Equal(t, countIndexerData(data, func(v *internal.IndexerData) bool {
-                               return util.SliceContains(v.MentionIDs, 1)
+                               return slices.Contains(v.MentionIDs, 1)
                        }), result.Total)
                },
        },
@@ -478,7 +479,7 @@ var cases = []*testIndexerCase{
                                assert.Contains(t, data[v.ID].ReviewedIDs, int64(1))
                        }
                        assert.Equal(t, countIndexerData(data, func(v *internal.IndexerData) bool {
-                               return util.SliceContains(v.ReviewedIDs, 1)
+                               return slices.Contains(v.ReviewedIDs, 1)
                        }), result.Total)
                },
        },
@@ -499,7 +500,7 @@ var cases = []*testIndexerCase{
                                assert.Contains(t, data[v.ID].ReviewRequestedIDs, int64(1))
                        }
                        assert.Equal(t, countIndexerData(data, func(v *internal.IndexerData) bool {
-                               return util.SliceContains(v.ReviewRequestedIDs, 1)
+                               return slices.Contains(v.ReviewRequestedIDs, 1)
                        }), result.Total)
                },
        },
@@ -520,7 +521,7 @@ var cases = []*testIndexerCase{
                                assert.Contains(t, data[v.ID].SubscriberIDs, int64(1))
                        }
                        assert.Equal(t, countIndexerData(data, func(v *internal.IndexerData) bool {
-                               return util.SliceContains(v.SubscriberIDs, 1)
+                               return slices.Contains(v.SubscriberIDs, 1)
                        }), result.Total)
                },
        },
index ef28cc03f45d7b5bf4c89d51dfe26ca983243a4f..2c2f35bbed3971f9bad319dc7f55b3133babe20d 100644 (file)
@@ -4,11 +4,11 @@
 package templates
 
 import (
+       "slices"
        "strings"
 
        "code.gitea.io/gitea/modules/assetfs"
        "code.gitea.io/gitea/modules/setting"
-       "code.gitea.io/gitea/modules/util"
 )
 
 func AssetFS() *assetfs.LayeredFS {
@@ -24,7 +24,7 @@ func ListWebTemplateAssetNames(assets *assetfs.LayeredFS) ([]string, error) {
        if err != nil {
                return nil, err
        }
-       return util.SliceRemoveAllFunc(files, func(file string) bool {
+       return slices.DeleteFunc(files, func(file string) bool {
                return strings.HasPrefix(file, "mail/") || !strings.HasSuffix(file, ".tmpl")
        }), nil
 }
@@ -34,7 +34,7 @@ func ListMailTemplateAssetNames(assets *assetfs.LayeredFS) ([]string, error) {
        if err != nil {
                return nil, err
        }
-       return util.SliceRemoveAllFunc(files, func(file string) bool {
+       return slices.DeleteFunc(files, func(file string) bool {
                return !strings.HasPrefix(file, "mail/") || !strings.HasSuffix(file, ".tmpl")
        }), nil
 }
index 74356f5496205d254eead2f14892d3c57328e57a..6d63ab4a7771ce07140a4c327e21c443b6153b01 100644 (file)
@@ -1,37 +1,21 @@
 // Copyright 2022 The Gitea Authors. All rights reserved.
 // SPDX-License-Identifier: MIT
 
-// Most of the functions in this file can have better implementations with "golang.org/x/exp/slices".
-// However, "golang.org/x/exp" is experimental and unreliable, we shouldn't use it.
-// So lets waiting for the "slices" has be promoted to the main repository one day.
-
 package util
 
-import "strings"
-
-// SliceContains returns true if the target exists in the slice.
-func SliceContains[T comparable](slice []T, target T) bool {
-       return SliceContainsFunc(slice, func(t T) bool { return t == target })
-}
-
-// SliceContainsFunc returns true if any element in the slice satisfies the targetFunc.
-func SliceContainsFunc[T any](slice []T, targetFunc func(T) bool) bool {
-       for _, v := range slice {
-               if targetFunc(v) {
-                       return true
-               }
-       }
-       return false
-}
+import (
+       "slices"
+       "strings"
+)
 
 // SliceContainsString sequential searches if string exists in slice.
 func SliceContainsString(slice []string, target string, insensitive ...bool) bool {
        if len(insensitive) != 0 && insensitive[0] {
                target = strings.ToLower(target)
-               return SliceContainsFunc(slice, func(t string) bool { return strings.ToLower(t) == target })
+               return slices.ContainsFunc(slice, func(t string) bool { return strings.ToLower(t) == target })
        }
 
-       return SliceContains(slice, target)
+       return slices.Contains(slice, target)
 }
 
 // SliceSortedEqual returns true if the two slices will be equal when they get sorted.
@@ -57,34 +41,7 @@ func SliceSortedEqual[T comparable](s1, s2 []T) bool {
        return true
 }
 
-// SliceEqual returns true if the two slices are equal.
-func SliceEqual[T comparable](s1, s2 []T) bool {
-       if len(s1) != len(s2) {
-               return false
-       }
-
-       for i, v := range s1 {
-               if s2[i] != v {
-                       return false
-               }
-       }
-       return true
-}
-
 // SliceRemoveAll removes all the target elements from the slice.
 func SliceRemoveAll[T comparable](slice []T, target T) []T {
-       return SliceRemoveAllFunc(slice, func(t T) bool { return t == target })
-}
-
-// SliceRemoveAllFunc removes all elements which satisfy the targetFunc from the slice.
-func SliceRemoveAllFunc[T comparable](slice []T, targetFunc func(T) bool) []T {
-       idx := 0
-       for _, v := range slice {
-               if targetFunc(v) {
-                       continue
-               }
-               slice[idx] = v
-               idx++
-       }
-       return slice[:idx]
+       return slices.DeleteFunc(slice, func(t T) bool { return t == target })
 }
index 373c1a3b7b15cc4d06480d5dd267f174885f98a4..a910f5edfe161c3d05d27474df404b1f141505e3 100644 (file)
@@ -9,20 +9,6 @@ import (
        "github.com/stretchr/testify/assert"
 )
 
-func TestSliceContains(t *testing.T) {
-       assert.True(t, SliceContains([]int{2, 0, 2, 3}, 2))
-       assert.True(t, SliceContains([]int{2, 0, 2, 3}, 0))
-       assert.True(t, SliceContains([]int{2, 0, 2, 3}, 3))
-
-       assert.True(t, SliceContains([]string{"2", "0", "2", "3"}, "0"))
-       assert.True(t, SliceContains([]float64{2, 0, 2, 3}, 0))
-       assert.True(t, SliceContains([]bool{false, true, false}, true))
-
-       assert.False(t, SliceContains([]int{2, 0, 2, 3}, 4))
-       assert.False(t, SliceContains([]int{}, 4))
-       assert.False(t, SliceContains(nil, 4))
-}
-
 func TestSliceContainsString(t *testing.T) {
        assert.True(t, SliceContainsString([]string{"c", "b", "a", "b"}, "a"))
        assert.True(t, SliceContainsString([]string{"c", "b", "a", "b"}, "b"))
@@ -54,25 +40,6 @@ func TestSliceSortedEqual(t *testing.T) {
        assert.False(t, SliceSortedEqual([]int{2, 0, 0, 3}, []int{2, 0, 2, 3}))
 }
 
-func TestSliceEqual(t *testing.T) {
-       assert.True(t, SliceEqual([]int{2, 0, 2, 3}, []int{2, 0, 2, 3}))
-       assert.True(t, SliceEqual([]int{}, []int{}))
-       assert.True(t, SliceEqual([]int(nil), nil))
-       assert.True(t, SliceEqual([]int(nil), []int{}))
-       assert.True(t, SliceEqual([]int{}, []int{}))
-
-       assert.True(t, SliceEqual([]string{"2", "0", "2", "3"}, []string{"2", "0", "2", "3"}))
-       assert.True(t, SliceEqual([]float64{2, 0, 2, 3}, []float64{2, 0, 2, 3}))
-       assert.True(t, SliceEqual([]bool{false, true, false}, []bool{false, true, false}))
-
-       assert.False(t, SliceEqual([]int{3, 0, 2, 2}, []int{2, 0, 2, 3}))
-       assert.False(t, SliceEqual([]int{2, 0, 2}, []int{2, 0, 2, 3}))
-       assert.False(t, SliceEqual([]int{}, []int{2, 0, 2, 3}))
-       assert.False(t, SliceEqual(nil, []int{2, 0, 2, 3}))
-       assert.False(t, SliceEqual([]int{2, 0, 2, 4}, []int{2, 0, 2, 3}))
-       assert.False(t, SliceEqual([]int{2, 0, 0, 3}, []int{2, 0, 2, 3}))
-}
-
 func TestSliceRemoveAll(t *testing.T) {
        assert.ElementsMatch(t, []int{2, 2, 3}, SliceRemoveAll([]int{2, 0, 2, 3}, 0))
        assert.ElementsMatch(t, []int{0, 3}, SliceRemoveAll([]int{2, 0, 2, 3}, 2))
index d895640894141fe544eb93b6b2391ae49a89ceb1..53055bb6829e057d091d355cdca6bb5fe428ed0e 100644 (file)
@@ -16,6 +16,7 @@ import (
        "net/http"
        "path"
        "regexp"
+       "slices"
        "strconv"
        "strings"
        "time"
@@ -265,7 +266,7 @@ func verifyDataOld(signature, data []byte, pub *rsa.PublicKey) error {
                }
        }
 
-       if !util.SliceEqual(out[skip:], data) {
+       if !slices.Equal(out[skip:], data) {
                return fmt.Errorf("could not verify signature")
        }
 
index 29f6a675d4fde69bc38037030b0b938829c28435..e86743d55a075f74952d9979741f4a7e482b1ff9 100644 (file)
@@ -7,6 +7,7 @@ package repo
 import (
        "fmt"
        "net/http"
+       "slices"
        "strings"
        "time"
 
@@ -235,7 +236,7 @@ func CreateUserRepo(ctx *context.APIContext, owner *user_model.User, opt api.Cre
        }
 
        // If the readme template does not exist, a 400 will be returned.
-       if opt.AutoInit && len(opt.Readme) > 0 && !util.SliceContains(repo_module.Readmes, opt.Readme) {
+       if opt.AutoInit && len(opt.Readme) > 0 && !slices.Contains(repo_module.Readmes, opt.Readme) {
                ctx.Error(http.StatusBadRequest, "", fmt.Errorf("readme template does not exist, available templates: %v", repo_module.Readmes))
                return
        }
index f5e8f80ddfe2e8c9970047af4a828aca8f2dbf4e..c95d54532aad1e08957b999654e7a769687b3d65 100644 (file)
@@ -12,6 +12,7 @@ import (
        "math/big"
        "net/http"
        "net/url"
+       "slices"
        "sort"
        "strconv"
        "strings"
@@ -3628,7 +3629,7 @@ func issuePosters(ctx *context.Context, isPullList bool) {
        if search == "" && ctx.Doer != nil {
                // the returned posters slice only contains limited number of users,
                // to make the current user (doer) can quickly filter their own issues, always add doer to the posters slice
-               if !util.SliceContainsFunc(posters, func(user *user_model.User) bool { return user.ID == ctx.Doer.ID }) {
+               if !slices.ContainsFunc(posters, func(user *user_model.User) bool { return user.ID == ctx.Doer.ID }) {
                        posters = append(posters, ctx.Doer)
                }
        }
index 12cd477926c2e22a605ff5f6f572d34b273d1fa5..3ed7ca1c91737aa2f70ce0657db1294ad344f0c9 100644 (file)
@@ -8,6 +8,7 @@ import (
        "errors"
        "fmt"
        "net/http"
+       "slices"
        "strings"
 
        "code.gitea.io/gitea/models"
@@ -659,7 +660,7 @@ func GetBranchesList(ctx *context.Context) {
        }
        resp := &branchTagSearchResponse{}
        // always put default branch on the top if it exists
-       if util.SliceContains(branches, ctx.Repo.Repository.DefaultBranch) {
+       if slices.Contains(branches, ctx.Repo.Repository.DefaultBranch) {
                branches = util.SliceRemoveAll(branches, ctx.Repo.Repository.DefaultBranch)
                branches = append([]string{ctx.Repo.Repository.DefaultBranch}, branches...)
        }
@@ -693,7 +694,7 @@ func PrepareBranchList(ctx *context.Context) {
                return
        }
        // always put default branch on the top if it exists
-       if util.SliceContains(brs, ctx.Repo.Repository.DefaultBranch) {
+       if slices.Contains(brs, ctx.Repo.Repository.DefaultBranch) {
                brs = util.SliceRemoveAll(brs, ctx.Repo.Repository.DefaultBranch)
                brs = append([]string{ctx.Repo.Repository.DefaultBranch}, brs...)
        }
index 15c85f6427cec29a5c4e7b5275ca63071158e5fb..f0fe6140dfb8e752fb7bd6679d726e5c299d1087 100644 (file)
@@ -14,6 +14,7 @@ import (
        "net/http"
        "net/url"
        "path"
+       "slices"
        "strings"
        "time"
 
@@ -370,7 +371,7 @@ func renderFile(ctx *context.Context, entry *git.TreeEntry, treeLink, rawLink st
                if workFlowErr != nil {
                        ctx.Data["FileError"] = ctx.Locale.Tr("actions.runs.invalid_workflow_helper", workFlowErr.Error())
                }
-       } else if util.SliceContains([]string{"CODEOWNERS", "docs/CODEOWNERS", ".gitea/CODEOWNERS"}, ctx.Repo.TreePath) {
+       } else if slices.Contains([]string{"CODEOWNERS", "docs/CODEOWNERS", ".gitea/CODEOWNERS"}, ctx.Repo.TreePath) {
                if data, err := blob.GetBlobContent(setting.UI.MaxDisplayFileSize); err == nil {
                        _, warnings := issue_model.GetCodeOwnersFromContent(ctx, data)
                        if len(warnings) > 0 {
index a7f6a52f1b1109424be9fe51119fb54428be858d..a88479e1293a97cd91a1be68487c88ca3cb7cbde 100644 (file)
@@ -9,6 +9,7 @@ import (
        "fmt"
        "net/http"
        "regexp"
+       "slices"
        "sort"
        "strconv"
        "strings"
@@ -290,7 +291,7 @@ func Milestones(ctx *context.Context) {
        if len(repoIDs) == 0 {
                repoIDs = showRepoIds.Values()
        }
-       repoIDs = util.SliceRemoveAllFunc(repoIDs, func(v int64) bool {
+       repoIDs = slices.DeleteFunc(repoIDs, func(v int64) bool {
                return !showRepoIds.Contains(v)
        })
 
@@ -534,7 +535,7 @@ func buildIssueOverview(ctx *context.Context, unitType unit.Type) {
        // Gets set when clicking filters on the issues overview page.
        selectedRepoIDs := getRepoIDs(ctx.FormString("repos"))
        // Remove repo IDs that are not accessible to the user.
-       selectedRepoIDs = util.SliceRemoveAllFunc(selectedRepoIDs, func(v int64) bool {
+       selectedRepoIDs = slices.DeleteFunc(selectedRepoIDs, func(v int64) bool {
                return !accessibleRepos.Contains(v)
        })
        if len(selectedRepoIDs) > 0 {