Skip to content

Commit 38cf43d

Browse files
authored
Some refactors for issues stats (#24793)
This PR - [x] Move some functions from `issues.go` to `issue_stats.go` and `issue_label.go` - [x] Remove duplicated issue options `UserIssueStatsOption` to keep only one `IssuesOptions`
1 parent c757765 commit 38cf43d

File tree

12 files changed

+948
-948
lines changed

12 files changed

+948
-948
lines changed

models/issues/issue.go

Lines changed: 0 additions & 192 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,8 @@ import (
88
"context"
99
"fmt"
1010
"regexp"
11-
"sort"
1211

1312
"code.gitea.io/gitea/models/db"
14-
access_model "code.gitea.io/gitea/models/perm/access"
1513
project_model "code.gitea.io/gitea/models/project"
1614
repo_model "code.gitea.io/gitea/models/repo"
1715
user_model "code.gitea.io/gitea/models/user"
@@ -212,17 +210,6 @@ func (issue *Issue) GetPullRequest() (pr *PullRequest, err error) {
212210
return pr, err
213211
}
214212

215-
// LoadLabels loads labels
216-
func (issue *Issue) LoadLabels(ctx context.Context) (err error) {
217-
if issue.Labels == nil && issue.ID != 0 {
218-
issue.Labels, err = GetLabelsByIssueID(ctx, issue.ID)
219-
if err != nil {
220-
return fmt.Errorf("getLabelsByIssueID [%d]: %w", issue.ID, err)
221-
}
222-
}
223-
return nil
224-
}
225-
226213
// LoadPoster loads poster
227214
func (issue *Issue) LoadPoster(ctx context.Context) (err error) {
228215
if issue.Poster == nil && issue.PosterID != 0 {
@@ -459,175 +446,6 @@ func (issue *Issue) IsPoster(uid int64) bool {
459446
return issue.OriginalAuthorID == 0 && issue.PosterID == uid
460447
}
461448

462-
func (issue *Issue) getLabels(ctx context.Context) (err error) {
463-
if len(issue.Labels) > 0 {
464-
return nil
465-
}
466-
467-
issue.Labels, err = GetLabelsByIssueID(ctx, issue.ID)
468-
if err != nil {
469-
return fmt.Errorf("getLabelsByIssueID: %w", err)
470-
}
471-
return nil
472-
}
473-
474-
func clearIssueLabels(ctx context.Context, issue *Issue, doer *user_model.User) (err error) {
475-
if err = issue.getLabels(ctx); err != nil {
476-
return fmt.Errorf("getLabels: %w", err)
477-
}
478-
479-
for i := range issue.Labels {
480-
if err = deleteIssueLabel(ctx, issue, issue.Labels[i], doer); err != nil {
481-
return fmt.Errorf("removeLabel: %w", err)
482-
}
483-
}
484-
485-
return nil
486-
}
487-
488-
// ClearIssueLabels removes all issue labels as the given user.
489-
// Triggers appropriate WebHooks, if any.
490-
func ClearIssueLabels(issue *Issue, doer *user_model.User) (err error) {
491-
ctx, committer, err := db.TxContext(db.DefaultContext)
492-
if err != nil {
493-
return err
494-
}
495-
defer committer.Close()
496-
497-
if err := issue.LoadRepo(ctx); err != nil {
498-
return err
499-
} else if err = issue.LoadPullRequest(ctx); err != nil {
500-
return err
501-
}
502-
503-
perm, err := access_model.GetUserRepoPermission(ctx, issue.Repo, doer)
504-
if err != nil {
505-
return err
506-
}
507-
if !perm.CanWriteIssuesOrPulls(issue.IsPull) {
508-
return ErrRepoLabelNotExist{}
509-
}
510-
511-
if err = clearIssueLabels(ctx, issue, doer); err != nil {
512-
return err
513-
}
514-
515-
if err = committer.Commit(); err != nil {
516-
return fmt.Errorf("Commit: %w", err)
517-
}
518-
519-
return nil
520-
}
521-
522-
type labelSorter []*Label
523-
524-
func (ts labelSorter) Len() int {
525-
return len([]*Label(ts))
526-
}
527-
528-
func (ts labelSorter) Less(i, j int) bool {
529-
return []*Label(ts)[i].ID < []*Label(ts)[j].ID
530-
}
531-
532-
func (ts labelSorter) Swap(i, j int) {
533-
[]*Label(ts)[i], []*Label(ts)[j] = []*Label(ts)[j], []*Label(ts)[i]
534-
}
535-
536-
// Ensure only one label of a given scope exists, with labels at the end of the
537-
// array getting preference over earlier ones.
538-
func RemoveDuplicateExclusiveLabels(labels []*Label) []*Label {
539-
validLabels := make([]*Label, 0, len(labels))
540-
541-
for i, label := range labels {
542-
scope := label.ExclusiveScope()
543-
if scope != "" {
544-
foundOther := false
545-
for _, otherLabel := range labels[i+1:] {
546-
if otherLabel.ExclusiveScope() == scope {
547-
foundOther = true
548-
break
549-
}
550-
}
551-
if foundOther {
552-
continue
553-
}
554-
}
555-
validLabels = append(validLabels, label)
556-
}
557-
558-
return validLabels
559-
}
560-
561-
// ReplaceIssueLabels removes all current labels and add new labels to the issue.
562-
// Triggers appropriate WebHooks, if any.
563-
func ReplaceIssueLabels(issue *Issue, labels []*Label, doer *user_model.User) (err error) {
564-
ctx, committer, err := db.TxContext(db.DefaultContext)
565-
if err != nil {
566-
return err
567-
}
568-
defer committer.Close()
569-
570-
if err = issue.LoadRepo(ctx); err != nil {
571-
return err
572-
}
573-
574-
if err = issue.LoadLabels(ctx); err != nil {
575-
return err
576-
}
577-
578-
labels = RemoveDuplicateExclusiveLabels(labels)
579-
580-
sort.Sort(labelSorter(labels))
581-
sort.Sort(labelSorter(issue.Labels))
582-
583-
var toAdd, toRemove []*Label
584-
585-
addIndex, removeIndex := 0, 0
586-
for addIndex < len(labels) && removeIndex < len(issue.Labels) {
587-
addLabel := labels[addIndex]
588-
removeLabel := issue.Labels[removeIndex]
589-
if addLabel.ID == removeLabel.ID {
590-
// Silently drop invalid labels
591-
if removeLabel.RepoID != issue.RepoID && removeLabel.OrgID != issue.Repo.OwnerID {
592-
toRemove = append(toRemove, removeLabel)
593-
}
594-
595-
addIndex++
596-
removeIndex++
597-
} else if addLabel.ID < removeLabel.ID {
598-
// Only add if the label is valid
599-
if addLabel.RepoID == issue.RepoID || addLabel.OrgID == issue.Repo.OwnerID {
600-
toAdd = append(toAdd, addLabel)
601-
}
602-
addIndex++
603-
} else {
604-
toRemove = append(toRemove, removeLabel)
605-
removeIndex++
606-
}
607-
}
608-
toAdd = append(toAdd, labels[addIndex:]...)
609-
toRemove = append(toRemove, issue.Labels[removeIndex:]...)
610-
611-
if len(toAdd) > 0 {
612-
if err = newIssueLabels(ctx, issue, toAdd, doer); err != nil {
613-
return fmt.Errorf("addLabels: %w", err)
614-
}
615-
}
616-
617-
for _, l := range toRemove {
618-
if err = deleteIssueLabel(ctx, issue, l, doer); err != nil {
619-
return fmt.Errorf("removeLabel: %w", err)
620-
}
621-
}
622-
623-
issue.Labels = nil
624-
if err = issue.LoadLabels(ctx); err != nil {
625-
return err
626-
}
627-
628-
return committer.Commit()
629-
}
630-
631449
// GetTasks returns the amount of tasks in the issues content
632450
func (issue *Issue) GetTasks() int {
633451
return len(issueTasksPat.FindAllStringIndex(issue.Content, -1))
@@ -862,16 +680,6 @@ func (issue *Issue) GetExternalName() string { return issue.OriginalAuthor }
862680
// GetExternalID ExternalUserRemappable interface
863681
func (issue *Issue) GetExternalID() int64 { return issue.OriginalAuthorID }
864682

865-
// CountOrphanedIssues count issues without a repo
866-
func CountOrphanedIssues(ctx context.Context) (int64, error) {
867-
return db.GetEngine(ctx).
868-
Table("issue").
869-
Join("LEFT", "repository", "issue.repo_id=repository.id").
870-
Where(builder.IsNull{"repository.id"}).
871-
Select("COUNT(`issue`.`id`)").
872-
Count()
873-
}
874-
875683
// HasOriginalAuthor returns if an issue was migrated and has an original author.
876684
func (issue *Issue) HasOriginalAuthor() bool {
877685
return issue.OriginalAuthor != "" && issue.OriginalAuthorID != 0

0 commit comments

Comments
 (0)