@@ -8,10 +8,8 @@ import (
8
8
"context"
9
9
"fmt"
10
10
"regexp"
11
- "sort"
12
11
13
12
"code.gitea.io/gitea/models/db"
14
- access_model "code.gitea.io/gitea/models/perm/access"
15
13
project_model "code.gitea.io/gitea/models/project"
16
14
repo_model "code.gitea.io/gitea/models/repo"
17
15
user_model "code.gitea.io/gitea/models/user"
@@ -212,17 +210,6 @@ func (issue *Issue) GetPullRequest() (pr *PullRequest, err error) {
212
210
return pr , err
213
211
}
214
212
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
-
226
213
// LoadPoster loads poster
227
214
func (issue * Issue ) LoadPoster (ctx context.Context ) (err error ) {
228
215
if issue .Poster == nil && issue .PosterID != 0 {
@@ -459,175 +446,6 @@ func (issue *Issue) IsPoster(uid int64) bool {
459
446
return issue .OriginalAuthorID == 0 && issue .PosterID == uid
460
447
}
461
448
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
-
631
449
// GetTasks returns the amount of tasks in the issues content
632
450
func (issue * Issue ) GetTasks () int {
633
451
return len (issueTasksPat .FindAllStringIndex (issue .Content , - 1 ))
@@ -862,16 +680,6 @@ func (issue *Issue) GetExternalName() string { return issue.OriginalAuthor }
862
680
// GetExternalID ExternalUserRemappable interface
863
681
func (issue * Issue ) GetExternalID () int64 { return issue .OriginalAuthorID }
864
682
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
-
875
683
// HasOriginalAuthor returns if an issue was migrated and has an original author.
876
684
func (issue * Issue ) HasOriginalAuthor () bool {
877
685
return issue .OriginalAuthor != "" && issue .OriginalAuthorID != 0
0 commit comments