From 4c72c32f9bf6a126bb198af397dd89856a7981e5 Mon Sep 17 00:00:00 2001 From: Tyrone Yeh Date: Fri, 9 May 2025 14:29:18 +0800 Subject: [PATCH] Improve string join code for projects id --- modules/util/util.go | 11 +++++++++++ routers/web/repo/issue_new.go | 11 +++++------ routers/web/repo/issue_page_meta.go | 9 ++++----- 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/modules/util/util.go b/modules/util/util.go index f61c6aa420..5efd2ae55a 100644 --- a/modules/util/util.go +++ b/modules/util/util.go @@ -288,3 +288,14 @@ func RemoveValue[T comparable](a []T, target T) []T { } return a[:n] } + +func JoinSlice[T any](items []T, toString func(T) string) string { + var b strings.Builder + sep := "" + for _, item := range items { + b.WriteString(sep) + b.WriteString(toString(item)) + sep = "," + } + return b.String() +} diff --git a/routers/web/repo/issue_new.go b/routers/web/repo/issue_new.go index 0ca4bbd1c2..094009f717 100644 --- a/routers/web/repo/issue_new.go +++ b/routers/web/repo/issue_new.go @@ -272,13 +272,12 @@ func ValidateRepoMetasForNewIssue(ctx *context.Context, form forms.CreateIssueFo allProjects := append(slices.Clone(pageMetaData.ProjectsData.OpenProjects), pageMetaData.ProjectsData.ClosedProjects...) candidateProjects := toSet(allProjects, func(project *project_model.Project) int64 { return project.ID }) inputProjectIDs, _ := base.StringsToInt64s(strings.Split(form.ProjectIDs, ",")) - var projectIDStrings []string - for _, inputProjectID := range inputProjectIDs { - if candidateProjects.Contains(inputProjectID) { - projectIDStrings = append(projectIDStrings, strconv.FormatInt(inputProjectID, 10)) + pageMetaData.ProjectsData.SelectedProjectID = util.JoinSlice(inputProjectIDs, func(v int64) string { + if candidateProjects.Contains(v) { + return strconv.FormatInt(v, 10) } - } - pageMetaData.ProjectsData.SelectedProjectID = strings.Join(projectIDStrings, ",") + return "" + }) // prepare assignees candidateAssignees := toSet(pageMetaData.AssigneesData.CandidateAssignees, func(user *user_model.User) int64 { return user.ID }) diff --git a/routers/web/repo/issue_page_meta.go b/routers/web/repo/issue_page_meta.go index 0eb14cf957..c0f23d4f39 100644 --- a/routers/web/repo/issue_page_meta.go +++ b/routers/web/repo/issue_page_meta.go @@ -16,6 +16,7 @@ import ( user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/container" "code.gitea.io/gitea/modules/optional" + "code.gitea.io/gitea/modules/util" shared_user "code.gitea.io/gitea/routers/web/shared/user" "code.gitea.io/gitea/services/context" issue_service "code.gitea.io/gitea/services/issue" @@ -161,11 +162,9 @@ func (d *IssuePageMetaData) retrieveAssigneesData(ctx *context.Context) { func (d *IssuePageMetaData) retrieveProjectsDataForIssueWriter(ctx *context.Context) { if d.Issue != nil && len(d.Issue.Projects) > 0 { - ids := make([]string, 0, len(d.Issue.Projects)) - for _, a := range d.Issue.Projects { - ids = append(ids, strconv.FormatInt(a.ID, 10)) - } - d.ProjectsData.SelectedProjectID = strings.Join(ids, ",") + d.ProjectsData.SelectedProjectID = util.JoinSlice(d.Issue.Projects, func(v *project_model.Project) string { + return strconv.FormatInt(v.ID, 10) + }) } d.ProjectsData.OpenProjects, d.ProjectsData.ClosedProjects = retrieveProjectsInternal(ctx, ctx.Repo.Repository) }