Browse Source

Run modernize tool across codebase (#8147)

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Joe Chen <jc@unknwon.io>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: deepsource-autofix[bot] <62050782+deepsource-autofix[bot]@users.noreply.github.com>
Copilot 3 days ago
parent
commit
6d56105f8f

+ 2 - 2
cmd/gogs/cert.go

@@ -121,8 +121,8 @@ func runCert(ctx *cli.Context) error {
 		BasicConstraintsValid: true,
 	}
 
-	hosts := strings.Split(ctx.String("host"), ",")
-	for _, h := range hosts {
+	hosts := strings.SplitSeq(ctx.String("host"), ",")
+	for h := range hosts {
 		if ip := net.ParseIP(h); ip != nil {
 			template.IPAddresses = append(template.IPAddresses, ip)
 		} else {

+ 5 - 10
internal/auth/smtp/provider.go

@@ -3,6 +3,7 @@ package smtp
 import (
 	"net/smtp"
 	"net/textproto"
+	"slices"
 	"strings"
 
 	"github.com/cockroachdb/errors"
@@ -34,13 +35,7 @@ func (p *Provider) Authenticate(login, password string) (*auth.ExternalAccount,
 		}
 		domain := fields[1]
 
-		isAllowed := false
-		for _, allowed := range strings.Split(p.config.AllowedDomains, ",") {
-			if domain == allowed {
-				isAllowed = true
-				break
-			}
-		}
+		isAllowed := slices.Contains(strings.Split(p.config.AllowedDomains, ","), domain)
 
 		if !isAllowed {
 			return nil, auth.ErrBadCredentials{Args: map[string]any{"login": login}}
@@ -72,9 +67,9 @@ func (p *Provider) Authenticate(login, password string) (*auth.ExternalAccount,
 	username := login
 
 	// NOTE: It is not required to have "@" in `login` for a successful SMTP authentication.
-	idx := strings.Index(login, "@")
-	if idx > -1 {
-		username = login[:idx]
+	before, _, ok := strings.Cut(login, "@")
+	if ok {
+		username = before
 	}
 
 	return &auth.ExternalAccount{

+ 9 - 10
internal/context/repo.go

@@ -178,17 +178,16 @@ func RepoAssignment(pages ...bool) macaron.Handler {
 		// If the authenticated user has no direct access, see if the repository is a fork
 		// and whether the user has access to the base repository.
 		if c.Repo.AccessMode == database.AccessModeNone && repo.BaseRepo != nil {
-			mode := database.Handle.Permissions().AccessMode(c.Req.Context(), c.UserID(), repo.BaseRepo.ID,
-				database.AccessModeOptions{
-					OwnerID: repo.BaseRepo.OwnerID,
-					Private: repo.BaseRepo.IsPrivate,
-				},
+			mode := min(
+				// Users shouldn't have indirect access level higher than write.
+				database.Handle.Permissions().AccessMode(c.Req.Context(), c.UserID(), repo.BaseRepo.ID,
+					database.AccessModeOptions{
+						OwnerID: repo.BaseRepo.OwnerID,
+						Private: repo.BaseRepo.IsPrivate,
+					},
+				),
+				database.AccessModeWrite,
 			)
-
-			// Users shouldn't have indirect access level higher than write.
-			if mode > database.AccessModeWrite {
-				mode = database.AccessModeWrite
-			}
 			c.Repo.AccessMode = mode
 		}
 

+ 5 - 5
internal/database/issue.go

@@ -741,7 +741,7 @@ func newIssue(e *xorm.Session, opts NewIssueOptions) (err error) {
 			return errors.Newf("getAttachmentsByUUIDs [uuids: %v]: %v", opts.Attachments, err)
 		}
 
-		for i := 0; i < len(attachments); i++ {
+		for i := range attachments {
 			attachments[i].IssueID = opts.Issue.ID
 			if _, err = e.ID(attachments[i].ID).Update(attachments[i]); err != nil {
 				return errors.Newf("update attachment [id: %d]: %v", attachments[i].ID, err)
@@ -823,17 +823,17 @@ func (ErrIssueNotExist) NotFound() bool {
 
 // GetIssueByRef returns an Issue specified by a GFM reference, e.g. owner/repo#123.
 func GetIssueByRef(ref string) (*Issue, error) {
-	n := strings.IndexByte(ref, byte('#'))
-	if n == -1 {
+	before, after, ok := strings.Cut(ref, "#")
+	if !ok {
 		return nil, ErrIssueNotExist{args: map[string]any{"ref": ref}}
 	}
 
-	index := com.StrTo(ref[n+1:]).MustInt64()
+	index := com.StrTo(after).MustInt64()
 	if index == 0 {
 		return nil, ErrIssueNotExist{args: map[string]any{"ref": ref}}
 	}
 
-	repo, err := GetRepositoryByRef(ref[:n])
+	repo, err := GetRepositoryByRef(before)
 	if err != nil {
 		return nil, err
 	}

+ 1 - 1
internal/database/issue_label.go

@@ -28,7 +28,7 @@ func GetLabelTemplateFile(name string) ([][2]string, error) {
 
 	lines := strings.Split(string(data), "\n")
 	list := make([][2]string, 0, len(lines))
-	for i := 0; i < len(lines); i++ {
+	for i := range lines {
 		line := strings.TrimSpace(lines[i])
 		if line == "" {
 			continue

+ 3 - 3
internal/database/repo.go

@@ -909,7 +909,7 @@ func createDelegateHooks(repoPath string) (err error) {
 	for _, name := range git.ServerSideHooks {
 		hookPath := filepath.Join(repoPath, "hooks", string(name))
 		if err = os.WriteFile(hookPath,
-			[]byte(fmt.Sprintf(hooksTpls[name], conf.Repository.ScriptType, conf.AppPath(), conf.CustomConf)),
+			fmt.Appendf(nil, hooksTpls[name], conf.Repository.ScriptType, conf.AppPath(), conf.CustomConf),
 			os.ModePerm); err != nil {
 			return errors.Newf("create delegate hook '%s': %v", hookPath, err)
 		}
@@ -1016,8 +1016,8 @@ func prepareRepoCommit(repo *Repository, tmpDir, repoPath string, opts CreateRep
 	// .gitignore
 	if len(opts.Gitignores) > 0 {
 		var buf bytes.Buffer
-		names := strings.Split(opts.Gitignores, ",")
-		for _, name := range names {
+		names := strings.SplitSeq(opts.Gitignores, ",")
+		for name := range names {
 			data, err = getRepoInitFile("gitignore", name)
 			if err != nil {
 				return errors.Newf("getRepoInitFile[%s]: %v", name, err)

+ 1 - 1
internal/database/repo_editor.go

@@ -482,7 +482,7 @@ func DeleteUploads(uploads ...*Upload) (err error) {
 	}
 
 	ids := make([]int64, len(uploads))
-	for i := 0; i < len(uploads); i++ {
+	for i := range uploads {
 		ids[i] = uploads[i].ID
 	}
 	if _, err = sess.In("id", ids).Delete(new(Upload)); err != nil {

+ 1 - 1
internal/database/schemadoc/main.go

@@ -22,7 +22,7 @@ import (
 	"gogs.io/gogs/internal/database"
 )
 
-//go:generate go run main.go ../../../docs/dev/database_schema.md
+//go:generate go run main.go ../../../docs-old/dev/database_schema.md
 
 func main() {
 	w, err := os.Create(os.Args[1])

+ 1 - 1
internal/database/two_factors.go

@@ -135,7 +135,7 @@ func (s *TwoFactorsStore) UseRecoveryCode(ctx context.Context, userID int64, cod
 // generateRecoveryCodes generates N number of recovery codes for 2FA.
 func generateRecoveryCodes(userID int64, n int) ([]*TwoFactorRecoveryCode, error) {
 	recoveryCodes := make([]*TwoFactorRecoveryCode, n)
-	for i := 0; i < n; i++ {
+	for i := range n {
 		code, err := strutil.RandomChars(10)
 		if err != nil {
 			return nil, errors.Wrap(err, "generate random characters")

+ 3 - 3
internal/database/webhook_dingtalk.go

@@ -129,11 +129,11 @@ func getDingtalkPushPayload(p *api.PushPayload) *DingtalkPayload {
 		pusher = p.Pusher.UserName
 	}
 
-	var detail string
+	var detail strings.Builder
 	for i, commit := range p.Commits {
 		msg := strings.Split(commit.Message, "\n")[0]
 		commitLink := MarkdownLinkFormatter(commit.URL, commit.ID[:7])
-		detail += fmt.Sprintf("> %d. %s %s - %s\n", i, commitLink, commit.Author.Name, msg)
+		detail.WriteString(fmt.Sprintf("> %d. %s %s - %s\n", i, commitLink, commit.Author.Name, msg))
 	}
 
 	actionCard := NewDingtalkActionCard("View Changes", p.CompareURL)
@@ -142,7 +142,7 @@ func getDingtalkPushPayload(p *api.PushPayload) *DingtalkPayload {
 	actionCard.Text += "\n- Ref: **" + MarkdownLinkFormatter(p.Repo.HTMLURL+"/src/"+refName, refName) + "**"
 	actionCard.Text += "\n- Pusher: **" + pusher + "**"
 	actionCard.Text += "\n## " + fmt.Sprintf("Total %d commits(s)", len(p.Commits))
-	actionCard.Text += "\n" + detail
+	actionCard.Text += "\n" + detail.String()
 
 	return &DingtalkPayload{
 		MsgType:    "actionCard",

+ 5 - 4
internal/database/webhook_discord.go

@@ -140,14 +140,15 @@ func getDiscordPushPayload(p *api.PushPayload, slack *SlackMeta) *DiscordPayload
 
 	repoLink := DiscordLinkFormatter(p.Repo.HTMLURL, p.Repo.Name)
 	branchLink := DiscordLinkFormatter(p.Repo.HTMLURL+"/src/"+branchName, branchName)
-	content := fmt.Sprintf("Pushed %s to %s/%s\n", commitString, repoLink, branchLink)
+	var content strings.Builder
+	content.WriteString(fmt.Sprintf("Pushed %s to %s/%s\n", commitString, repoLink, branchLink))
 
 	// for each commit, generate attachment text
 	for i, commit := range p.Commits {
-		content += fmt.Sprintf("%s %s - %s", DiscordSHALinkFormatter(commit.URL, commit.ID[:7]), DiscordTextFormatter(commit.Message), commit.Author.Name)
+		content.WriteString(fmt.Sprintf("%s %s - %s", DiscordSHALinkFormatter(commit.URL, commit.ID[:7]), DiscordTextFormatter(commit.Message), commit.Author.Name))
 		// add linebreak to each commit but the last
 		if i < len(p.Commits)-1 {
-			content += "\n"
+			content.WriteString("\n")
 		}
 	}
 
@@ -156,7 +157,7 @@ func getDiscordPushPayload(p *api.PushPayload, slack *SlackMeta) *DiscordPayload
 		Username:  slack.Username,
 		AvatarURL: slack.IconURL,
 		Embeds: []*DiscordEmbedObject{{
-			Description: content,
+			Description: content.String(),
 			URL:         conf.Server.ExternalURL + p.Sender.UserName,
 			Color:       int(color),
 			Author: &DiscordEmbedAuthorObject{

+ 4 - 4
internal/database/webhook_slack.go

@@ -121,13 +121,13 @@ func getSlackPushPayload(p *api.PushPayload, slack *SlackMeta) *SlackPayload {
 	branchLink := SlackLinkFormatter(p.Repo.HTMLURL+"/src/"+branchName, branchName)
 	text := fmt.Sprintf("[%s:%s] %s pushed by %s", repoLink, branchLink, commitString, p.Pusher.UserName)
 
-	var attachmentText string
+	var attachmentText strings.Builder
 	// for each commit, generate attachment text
 	for i, commit := range p.Commits {
-		attachmentText += fmt.Sprintf("%s: %s - %s", SlackLinkFormatter(commit.URL, commit.ID[:7]), SlackShortTextFormatter(commit.Message), SlackTextFormatter(commit.Author.Name))
+		attachmentText.WriteString(fmt.Sprintf("%s: %s - %s", SlackLinkFormatter(commit.URL, commit.ID[:7]), SlackShortTextFormatter(commit.Message), SlackTextFormatter(commit.Author.Name)))
 		// add linebreak to each commit but the last
 		if i < len(p.Commits)-1 {
-			attachmentText += "\n"
+			attachmentText.WriteString("\n")
 		}
 	}
 
@@ -138,7 +138,7 @@ func getSlackPushPayload(p *api.PushPayload, slack *SlackMeta) *SlackPayload {
 		IconURL:  slack.IconURL,
 		Attachments: []*SlackAttachment{{
 			Color: slack.Color,
-			Text:  attachmentText,
+			Text:  attachmentText.String(),
 		}},
 	}
 }

+ 1 - 1
internal/form/form.go

@@ -62,7 +62,7 @@ func Assign(form any, data map[string]any) {
 }
 
 func getRuleBody(field reflect.StructField, prefix string) string {
-	for _, rule := range strings.Split(field.Tag.Get("binding"), ";") {
+	for rule := range strings.SplitSeq(field.Tag.Get("binding"), ";") {
 		if strings.HasPrefix(rule, prefix) {
 			return rule[len(prefix) : len(rule)-1]
 		}

+ 1 - 4
internal/gitutil/tag.go

@@ -37,10 +37,7 @@ func (module) ListTagsAfter(repoPath, after string, limit int) (*TagsPage, error
 
 	// No filter but has a limit, returns first X tags
 	if after == "" && limit > 0 {
-		endIdx := limit
-		if limit > total {
-			endIdx = total
-		}
+		endIdx := min(limit, total)
 		return &TagsPage{
 			Tags:      all[:endIdx],
 			HasLatest: true,

+ 1 - 1
internal/markup/markup.go

@@ -151,7 +151,7 @@ func RenderSpecialLink(rawBytes []byte, urlPrefix string, metas map[string]strin
 	ms := MentionPattern.FindAll(rawBytes, -1)
 	for _, m := range ms {
 		m = m[bytes.Index(m, []byte("@")):]
-		rawBytes = bytes.ReplaceAll(rawBytes, m, []byte(fmt.Sprintf(`<a href="%s/%s">%s</a>`, conf.Server.Subpath, m[1:], m)))
+		rawBytes = bytes.ReplaceAll(rawBytes, m, fmt.Appendf(nil, `<a href="%s/%s">%s</a>`, conf.Server.Subpath, m[1:], m))
 	}
 
 	rawBytes = RenderIssueIndexPattern(rawBytes, urlPrefix, metas)

+ 1 - 4
internal/route/admin/notice.go

@@ -22,10 +22,7 @@ func Notices(c *context.Context) {
 	c.Data["PageIsAdminNotices"] = true
 
 	total := database.Handle.Notices().Count(c.Req.Context())
-	page := c.QueryInt("page")
-	if page <= 1 {
-		page = 1
-	}
+	page := max(c.QueryInt("page"), 1)
 	c.Data["Page"] = paginater.New(int(total), conf.UI.Admin.NoticePagingNum, page, 5)
 
 	notices, err := database.Handle.Notices().List(c.Req.Context(), page, conf.UI.Admin.NoticePagingNum)

+ 4 - 4
internal/route/api/v1/repo/commits.go

@@ -82,11 +82,11 @@ func GetReferenceSHA(c *context.APIContext) {
 
 	ref := c.Params("*")
 	refType := 0 // 0-unknown, 1-branch, 2-tag
-	if strings.HasPrefix(ref, git.RefsHeads) {
-		ref = strings.TrimPrefix(ref, git.RefsHeads)
+	if after, ok := strings.CutPrefix(ref, git.RefsHeads); ok {
+		ref = after
 		refType = 1
-	} else if strings.HasPrefix(ref, git.RefsTags) {
-		ref = strings.TrimPrefix(ref, git.RefsTags)
+	} else if after, ok := strings.CutPrefix(ref, git.RefsTags); ok {
+		ref = after
 		refType = 2
 	} else {
 		if gitRepo.HasBranch(ref) {

+ 1 - 4
internal/route/home.go

@@ -89,10 +89,7 @@ type UserSearchOptions struct {
 }
 
 func RenderUserSearch(c *context.Context, opts *UserSearchOptions) {
-	page := c.QueryInt("page")
-	if page <= 1 {
-		page = 1
-	}
+	page := max(c.QueryInt("page"), 1)
 
 	var (
 		users []*database.User

+ 1 - 4
internal/route/repo/commit.go

@@ -41,10 +41,7 @@ func renderCommits(c *context.Context, filename string) {
 	c.Data["PageIsCommits"] = true
 	c.Data["FileName"] = filename
 
-	page := c.QueryInt("page")
-	if page < 1 {
-		page = 1
-	}
+	page := max(c.QueryInt("page"), 1)
 	pageSize := c.QueryInt("pageSize")
 	if pageSize < 1 {
 		pageSize = conf.UI.User.CommitsPagingNum

+ 4 - 5
internal/route/repo/editor.go

@@ -4,6 +4,7 @@ import (
 	"fmt"
 	"net/http"
 	"path"
+	"slices"
 	"strings"
 
 	"github.com/cockroachdb/errors"
@@ -230,11 +231,9 @@ func editFilePost(c *context.Context, f form.EditRepoFile, isNewFile bool) {
 				return
 			}
 
-			for _, file := range files {
-				if file == f.TreePath {
-					c.RenderWithErr(c.Tr("repo.editor.file_changed_while_editing", c.Repo.RepoLink+"/compare/"+lastCommit+"..."+c.Repo.CommitID), http.StatusConflict, tmplEditorEdit, &f)
-					return
-				}
+			if slices.Contains(files, f.TreePath) {
+				c.RenderWithErr(c.Tr("repo.editor.file_changed_while_editing", c.Repo.RepoLink+"/compare/"+lastCommit+"..."+c.Repo.CommitID), http.StatusConflict, tmplEditorEdit, &f)
+				return
 			}
 		}
 	}

+ 5 - 16
internal/route/repo/issue.go

@@ -4,6 +4,7 @@ import (
 	"fmt"
 	"net/http"
 	"net/url"
+	"slices"
 	"strings"
 	"time"
 
@@ -148,10 +149,7 @@ func issues(c *context.Context, isPullList bool) {
 		IsPull:      isPullList,
 	})
 
-	page := c.QueryInt("page")
-	if page <= 1 {
-		page = 1
-	}
+	page := max(c.QueryInt("page"), 1)
 
 	var total int
 	if !isShowClosed {
@@ -623,13 +621,7 @@ func viewIssue(c *context.Context, isPullList bool) {
 
 			marked[comment.PosterID] = comment.ShowTag
 
-			isAdded := false
-			for j := range participants {
-				if comment.Poster == participants[j] {
-					isAdded = true
-					break
-				}
-			}
+			isAdded := slices.Contains(participants, comment.Poster)
 			if !isAdded && !issue.IsPoster(comment.Poster.ID) {
 				participants = append(participants, comment.Poster)
 			}
@@ -1019,7 +1011,7 @@ func InitializeLabels(c *context.Context, f form.InitializeLabels) {
 	}
 
 	labels := make([]*database.Label, len(list))
-	for i := 0; i < len(list); i++ {
+	for i := range list {
 		labels[i] = &database.Label{
 			RepoID: c.Repo.Repository.ID,
 			Name:   list[i][0],
@@ -1093,10 +1085,7 @@ func Milestones(c *context.Context) {
 	c.Data["OpenCount"] = openCount
 	c.Data["ClosedCount"] = closedCount
 
-	page := c.QueryInt("page")
-	if page <= 1 {
-		page = 1
-	}
+	page := max(c.QueryInt("page"), 1)
 
 	var total int
 	if !isShowClosed {

+ 2 - 6
internal/route/repo/setting.go

@@ -4,6 +4,7 @@ import (
 	"fmt"
 	"io"
 	"net/http"
+	"slices"
 	"strings"
 	"time"
 
@@ -580,12 +581,7 @@ func SettingsGitHooks(c *context.Context) {
 }
 
 func isValidHookName(name git.HookName) bool {
-	for _, h := range git.ServerSideHooks {
-		if h == name {
-			return true
-		}
-	}
-	return false
+	return slices.Contains(git.ServerSideHooks, name)
 }
 
 func SettingsGitHooksEdit(c *context.Context) {

+ 1 - 4
internal/route/user/home.go

@@ -216,10 +216,7 @@ func Issues(c *context.Context) {
 		filterMode = database.FilterMode(viewType)
 	}
 
-	page := c.QueryInt("page")
-	if page <= 1 {
-		page = 1
-	}
+	page := max(c.QueryInt("page"), 1)
 
 	repoID := c.QueryInt64("repo")
 	isShowClosed := c.Query("state") == "closed"

+ 1 - 1
internal/strutil/strutil.go

@@ -29,7 +29,7 @@ func RandomChars(n int) (string, error) {
 
 	buffer := make([]byte, n)
 	max := big.NewInt(int64(len(alphanum)))
-	for i := 0; i < n; i++ {
+	for i := range n {
 		index, err := randomInt(max)
 		if err != nil {
 			return "", err

+ 1 - 1
internal/strutil/strutil_test.go

@@ -40,7 +40,7 @@ func TestToUpperFirst(t *testing.T) {
 
 func TestRandomChars(t *testing.T) {
 	cache := make(map[string]bool)
-	for i := 0; i < 100; i++ {
+	for range 100 {
 		chars, err := RandomChars(10)
 		if err != nil {
 			t.Fatal(err)

+ 2 - 2
internal/testutil/exec.go

@@ -28,9 +28,9 @@ func Exec(helper string, envs ...string) (string, error) {
 	// it is passed first.
 	if strings.Contains(str, "no tests to run") {
 		return "", errors.New("no tests to run")
-	} else if i := strings.Index(str, "PASS"); i >= 0 {
+	} else if before, _, ok := strings.Cut(str, "PASS"); ok {
 		// Collect helper result
-		return strings.TrimSpace(str[:i]), nil
+		return strings.TrimSpace(before), nil
 	}
 
 	if err != nil {