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