Refactor StringsToInt64s (#29967)
And close #27176 (cherry picked from commit cdb4d1a8db096d60dba04728924dab85def45b19)
This commit is contained in:
		
							parent
							
								
									f8060bb5d9
								
							
						
					
					
						commit
						e5920b4a62
					
				
					 12 changed files with 30 additions and 27 deletions
				
			
		| 
						 | 
				
			
			@ -11,7 +11,6 @@ import (
 | 
			
		|||
	access_model "code.gitea.io/gitea/models/perm/access"
 | 
			
		||||
	"code.gitea.io/gitea/models/unit"
 | 
			
		||||
	user_model "code.gitea.io/gitea/models/user"
 | 
			
		||||
	"code.gitea.io/gitea/modules/base"
 | 
			
		||||
	"code.gitea.io/gitea/modules/log"
 | 
			
		||||
	"code.gitea.io/gitea/modules/util"
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -23,7 +22,7 @@ type PullRequestsOptions struct {
 | 
			
		|||
	db.ListOptions
 | 
			
		||||
	State       string
 | 
			
		||||
	SortType    string
 | 
			
		||||
	Labels      []string
 | 
			
		||||
	Labels      []int64
 | 
			
		||||
	MilestoneID int64
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -36,11 +35,9 @@ func listPullRequestStatement(ctx context.Context, baseRepoID int64, opts *PullR
 | 
			
		|||
		sess.And("issue.is_closed=?", opts.State == "closed")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if labelIDs, err := base.StringsToInt64s(opts.Labels); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	} else if len(labelIDs) > 0 {
 | 
			
		||||
	if len(opts.Labels) > 0 {
 | 
			
		||||
		sess.Join("INNER", "issue_label", "issue.id = issue_label.issue_id").
 | 
			
		||||
			In("issue_label.label_id", labelIDs)
 | 
			
		||||
			In("issue_label.label_id", opts.Labels)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if opts.MilestoneID > 0 {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -67,7 +67,6 @@ func TestPullRequestsNewest(t *testing.T) {
 | 
			
		|||
		},
 | 
			
		||||
		State:    "open",
 | 
			
		||||
		SortType: "newest",
 | 
			
		||||
		Labels:   []string{},
 | 
			
		||||
	})
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
	assert.EqualValues(t, 3, count)
 | 
			
		||||
| 
						 | 
				
			
			@ -114,7 +113,6 @@ func TestPullRequestsOldest(t *testing.T) {
 | 
			
		|||
		},
 | 
			
		||||
		State:    "open",
 | 
			
		||||
		SortType: "oldest",
 | 
			
		||||
		Labels:   []string{},
 | 
			
		||||
	})
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
	assert.EqualValues(t, 3, count)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -150,13 +150,16 @@ func TruncateString(str string, limit int) string {
 | 
			
		|||
 | 
			
		||||
// StringsToInt64s converts a slice of string to a slice of int64.
 | 
			
		||||
func StringsToInt64s(strs []string) ([]int64, error) {
 | 
			
		||||
	ints := make([]int64, len(strs))
 | 
			
		||||
	for i := range strs {
 | 
			
		||||
		n, err := strconv.ParseInt(strs[i], 10, 64)
 | 
			
		||||
	if strs == nil {
 | 
			
		||||
		return nil, nil
 | 
			
		||||
	}
 | 
			
		||||
	ints := make([]int64, 0, len(strs))
 | 
			
		||||
	for _, s := range strs {
 | 
			
		||||
		n, err := strconv.ParseInt(s, 10, 64)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return ints, err
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		ints[i] = n
 | 
			
		||||
		ints = append(ints, n)
 | 
			
		||||
	}
 | 
			
		||||
	return ints, nil
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -138,12 +138,13 @@ func TestStringsToInt64s(t *testing.T) {
 | 
			
		|||
		assert.NoError(t, err)
 | 
			
		||||
		assert.Equal(t, expected, result)
 | 
			
		||||
	}
 | 
			
		||||
	testSuccess(nil, nil)
 | 
			
		||||
	testSuccess([]string{}, []int64{})
 | 
			
		||||
	testSuccess([]string{"-1234"}, []int64{-1234})
 | 
			
		||||
	testSuccess([]string{"1", "4", "16", "64", "256"},
 | 
			
		||||
		[]int64{1, 4, 16, 64, 256})
 | 
			
		||||
	testSuccess([]string{"1", "4", "16", "64", "256"}, []int64{1, 4, 16, 64, 256})
 | 
			
		||||
 | 
			
		||||
	_, err := StringsToInt64s([]string{"-1", "a", "$"})
 | 
			
		||||
	ints, err := StringsToInt64s([]string{"-1", "a"})
 | 
			
		||||
	assert.Len(t, ints, 0)
 | 
			
		||||
	assert.Error(t, err)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -114,6 +114,7 @@ loading = Loading…
 | 
			
		|||
error = Error
 | 
			
		||||
error404 = The page you are trying to reach either <strong>does not exist</strong> or <strong>you are not authorized</strong> to view it.
 | 
			
		||||
go_back = Go Back
 | 
			
		||||
invalid_data = Invalid data: %v
 | 
			
		||||
 | 
			
		||||
never = Never
 | 
			
		||||
unknown = Unknown
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -21,6 +21,7 @@ import (
 | 
			
		|||
	repo_model "code.gitea.io/gitea/models/repo"
 | 
			
		||||
	"code.gitea.io/gitea/models/unit"
 | 
			
		||||
	user_model "code.gitea.io/gitea/models/user"
 | 
			
		||||
	"code.gitea.io/gitea/modules/base"
 | 
			
		||||
	"code.gitea.io/gitea/modules/git"
 | 
			
		||||
	"code.gitea.io/gitea/modules/gitrepo"
 | 
			
		||||
	"code.gitea.io/gitea/modules/log"
 | 
			
		||||
| 
						 | 
				
			
			@ -96,13 +97,17 @@ func ListPullRequests(ctx *context.APIContext) {
 | 
			
		|||
	//   "404":
 | 
			
		||||
	//     "$ref": "#/responses/notFound"
 | 
			
		||||
 | 
			
		||||
	labelIDs, err := base.StringsToInt64s(ctx.FormStrings("labels"))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		ctx.Error(http.StatusInternalServerError, "PullRequests", err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	listOptions := utils.GetListOptions(ctx)
 | 
			
		||||
 | 
			
		||||
	prs, maxResults, err := issues_model.PullRequests(ctx, ctx.Repo.Repository.ID, &issues_model.PullRequestsOptions{
 | 
			
		||||
		ListOptions: listOptions,
 | 
			
		||||
		State:       ctx.FormTrim("state"),
 | 
			
		||||
		SortType:    ctx.FormTrim("sort"),
 | 
			
		||||
		Labels:      ctx.FormStrings("labels"),
 | 
			
		||||
		Labels:      labelIDs,
 | 
			
		||||
		MilestoneID: ctx.FormInt64("milestone"),
 | 
			
		||||
	})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -192,8 +192,7 @@ func issues(ctx *context.Context, milestoneID, projectID int64, isPullOption opt
 | 
			
		|||
	if len(selectLabels) > 0 {
 | 
			
		||||
		labelIDs, err = base.StringsToInt64s(strings.Split(selectLabels, ","))
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			ctx.ServerError("StringsToInt64s", err)
 | 
			
		||||
			return
 | 
			
		||||
			ctx.Flash.Error(ctx.Tr("invalid_data", selectLabels), true)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -529,17 +529,14 @@ func buildIssueOverview(ctx *context.Context, unitType unit.Type) {
 | 
			
		|||
 | 
			
		||||
	// Get IDs for labels (a filter option for issues/pulls).
 | 
			
		||||
	// Required for IssuesOptions.
 | 
			
		||||
	var labelIDs []int64
 | 
			
		||||
	selectedLabels := ctx.FormString("labels")
 | 
			
		||||
	if len(selectedLabels) > 0 && selectedLabels != "0" {
 | 
			
		||||
		var err error
 | 
			
		||||
		labelIDs, err = base.StringsToInt64s(strings.Split(selectedLabels, ","))
 | 
			
		||||
		opts.LabelIDs, err = base.StringsToInt64s(strings.Split(selectedLabels, ","))
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			ctx.ServerError("StringsToInt64s", err)
 | 
			
		||||
			return
 | 
			
		||||
			ctx.Flash.Error(ctx.Tr("invalid_data", selectedLabels), true)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	opts.LabelIDs = labelIDs
 | 
			
		||||
 | 
			
		||||
	// ------------------------------
 | 
			
		||||
	// Get issues as defined by opts.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -268,8 +268,7 @@ func NotificationSubscriptions(ctx *context.Context) {
 | 
			
		|||
		var err error
 | 
			
		||||
		labelIDs, err = base.StringsToInt64s(strings.Split(selectedLabels, ","))
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			ctx.ServerError("StringsToInt64s", err)
 | 
			
		||||
			return
 | 
			
		||||
			ctx.Flash.Error(ctx.Tr("invalid_data", selectedLabels), true)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,6 +2,7 @@
 | 
			
		|||
<div role="main" aria-label="{{.Title}}" class="page-content repository issue-list">
 | 
			
		||||
	{{template "repo/header" .}}
 | 
			
		||||
	<div class="ui container">
 | 
			
		||||
	{{template "base/alert" .}}
 | 
			
		||||
 | 
			
		||||
	{{if .PinnedIssues}}
 | 
			
		||||
		<div id="issue-pins" {{if .IsRepoAdmin}}data-is-repo-admin{{end}}>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,6 +2,7 @@
 | 
			
		|||
<div role="main" aria-label="{{.Title}}" class="page-content repository milestone-issue-list">
 | 
			
		||||
	{{template "repo/header" .}}
 | 
			
		||||
	<div class="ui container">
 | 
			
		||||
		{{template "base/alert" .}}
 | 
			
		||||
		<div class="gt-df">
 | 
			
		||||
			<h1 class="gt-mb-3">{{.Milestone.Name}}</h1>
 | 
			
		||||
			{{if not .Repository.IsArchived}}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,6 +2,7 @@
 | 
			
		|||
<div role="main" aria-label="{{.Title}}" class="page-content dashboard issues">
 | 
			
		||||
	{{template "user/dashboard/navbar" .}}
 | 
			
		||||
	<div class="ui container">
 | 
			
		||||
		{{template "base/alert" .}}
 | 
			
		||||
		<div class="flex-container">
 | 
			
		||||
			<div class="flex-container-nav">
 | 
			
		||||
				<div class="ui secondary vertical filter menu tw-bg-transparent">
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue