@@ -870,51 +870,118 @@ func RetrieveRepoReviewers(ctx *context.Context, repo *repo_model.Repository, is
870
870
ctx .Data ["IssueSidebarReviewersData" ] = data
871
871
}
872
872
873
- // RetrieveRepoMetas find all the meta information of a repository
874
- func RetrieveRepoMetas (ctx * context.Context , repo * repo_model.Repository , isPull bool ) []* issues_model.Label {
875
- if ! ctx .Repo .CanWriteIssuesOrPulls (isPull ) {
876
- return nil
873
+ type issueSidebarLabelsData struct {
874
+ Repository * repo_model.Repository
875
+ RepoLink string
876
+ IssueID int64
877
+ IsPullRequest bool
878
+ AllLabels []* issues_model.Label
879
+ RepoLabels []* issues_model.Label
880
+ OrgLabels []* issues_model.Label
881
+ SelectedLabelIDs string
882
+ }
883
+
884
+ func findSelectedIDs [KeyType , ItemType comparable ](
885
+ allLabels []* issues_model.Label , candidateKey func (candidate * issues_model.Label ) KeyType ,
886
+ selectedItems []ItemType , selectedKey func (selected ItemType ) KeyType ,
887
+ ) string {
888
+ selectedIDSet := make (container.Set [string ])
889
+ allLabelMap := map [KeyType ]* issues_model.Label {}
890
+ for _ , label := range allLabels {
891
+ allLabelMap [candidateKey (label )] = label
892
+ }
893
+ for _ , item := range selectedItems {
894
+ if label , ok := allLabelMap [selectedKey (item )]; ok {
895
+ label .IsChecked = true
896
+ selectedIDSet .Add (strconv .FormatInt (label .ID , 10 ))
897
+ }
898
+ }
899
+ ids := selectedIDSet .Values ()
900
+ sort .Strings (ids )
901
+ return strings .Join (ids , "," )
902
+ }
903
+
904
+ func (d * issueSidebarLabelsData ) SetSelectedLabels (labels []* issues_model.Label ) {
905
+ d .SelectedLabelIDs = findSelectedIDs (
906
+ d .AllLabels ,
907
+ func (label * issues_model.Label ) int64 { return label .ID },
908
+ labels ,
909
+ func (label * issues_model.Label ) int64 { return label .ID },
910
+ )
911
+ }
912
+
913
+ func (d * issueSidebarLabelsData ) SetSelectedLabelNames (labelNames []string ) {
914
+ d .SelectedLabelIDs = findSelectedIDs (
915
+ d .AllLabels ,
916
+ func (label * issues_model.Label ) string { return strings .ToLower (label .Name ) },
917
+ labelNames ,
918
+ strings .ToLower ,
919
+ )
920
+ }
921
+
922
+ func (d * issueSidebarLabelsData ) SetSelectedLabelIDs (labelIDs []int64 ) {
923
+ d .SelectedLabelIDs = findSelectedIDs (
924
+ d .AllLabels ,
925
+ func (label * issues_model.Label ) int64 { return label .ID },
926
+ labelIDs ,
927
+ func (labelID int64 ) int64 { return labelID },
928
+ )
929
+ }
930
+
931
+ func retrieveRepoLabels (ctx * context.Context , repo * repo_model.Repository , issueID int64 , isPull bool ) * issueSidebarLabelsData {
932
+ labelsData := & issueSidebarLabelsData {
933
+ Repository : repo ,
934
+ RepoLink : ctx .Repo .RepoLink ,
935
+ IssueID : issueID ,
936
+ IsPullRequest : isPull ,
877
937
}
938
+ ctx .Data ["IssueSidebarLabelsData" ] = labelsData
878
939
879
940
labels , err := issues_model .GetLabelsByRepoID (ctx , repo .ID , "" , db.ListOptions {})
880
941
if err != nil {
881
942
ctx .ServerError ("GetLabelsByRepoID" , err )
882
943
return nil
883
944
}
884
- ctx .Data ["Labels" ] = labels
945
+ labelsData .RepoLabels = labels
946
+
885
947
if repo .Owner .IsOrganization () {
886
948
orgLabels , err := issues_model .GetLabelsByOrgID (ctx , repo .Owner .ID , ctx .FormString ("sort" ), db.ListOptions {})
887
949
if err != nil {
888
950
return nil
889
951
}
952
+ labelsData .OrgLabels = orgLabels
953
+ }
954
+ labelsData .AllLabels = append (labelsData .AllLabels , labelsData .RepoLabels ... )
955
+ labelsData .AllLabels = append (labelsData .AllLabels , labelsData .OrgLabels ... )
956
+ return labelsData
957
+ }
890
958
891
- ctx .Data ["OrgLabels" ] = orgLabels
892
- labels = append (labels , orgLabels ... )
959
+ // retrieveRepoMetasForIssueWriter finds some the meta information of a repository for an issue/pr writer
960
+ func retrieveRepoMetasForIssueWriter (ctx * context.Context , repo * repo_model.Repository , isPull bool ) {
961
+ if ! ctx .Repo .CanWriteIssuesOrPulls (isPull ) {
962
+ return
893
963
}
894
964
895
965
RetrieveRepoMilestonesAndAssignees (ctx , repo )
896
966
if ctx .Written () {
897
- return nil
967
+ return
898
968
}
899
969
900
970
retrieveProjects (ctx , repo )
901
971
if ctx .Written () {
902
- return nil
972
+ return
903
973
}
904
974
905
975
PrepareBranchList (ctx )
906
976
if ctx .Written () {
907
- return nil
977
+ return
908
978
}
909
-
910
979
// Contains true if the user can create issue dependencies
911
980
ctx .Data ["CanCreateIssueDependencies" ] = ctx .Repo .CanCreateIssueDependencies (ctx , ctx .Doer , isPull )
912
-
913
- return labels
914
981
}
915
982
916
983
// Tries to load and set an issue template. The first return value indicates if a template was loaded.
917
- func setTemplateIfExists (ctx * context.Context , ctxDataKey string , possibleFiles []string ) (bool , map [string ]error ) {
984
+ func setTemplateIfExists (ctx * context.Context , ctxDataKey string , possibleFiles []string , labelsData * issueSidebarLabelsData ) (bool , map [string ]error ) {
918
985
commit , err := ctx .Repo .GitRepo .GetBranchCommit (ctx .Repo .Repository .DefaultBranch )
919
986
if err != nil {
920
987
return false , nil
@@ -951,26 +1018,9 @@ func setTemplateIfExists(ctx *context.Context, ctxDataKey string, possibleFiles
951
1018
ctx .Data ["Fields" ] = template .Fields
952
1019
ctx .Data ["TemplateFile" ] = template .FileName
953
1020
}
954
- labelIDs := make ([]string , 0 , len (template .Labels ))
955
- if repoLabels , err := issues_model .GetLabelsByRepoID (ctx , ctx .Repo .Repository .ID , "" , db.ListOptions {}); err == nil {
956
- ctx .Data ["Labels" ] = repoLabels
957
- if ctx .Repo .Owner .IsOrganization () {
958
- if orgLabels , err := issues_model .GetLabelsByOrgID (ctx , ctx .Repo .Owner .ID , ctx .FormString ("sort" ), db.ListOptions {}); err == nil {
959
- ctx .Data ["OrgLabels" ] = orgLabels
960
- repoLabels = append (repoLabels , orgLabels ... )
961
- }
962
- }
963
1021
964
- for _ , metaLabel := range template .Labels {
965
- for _ , repoLabel := range repoLabels {
966
- if strings .EqualFold (repoLabel .Name , metaLabel ) {
967
- repoLabel .IsChecked = true
968
- labelIDs = append (labelIDs , strconv .FormatInt (repoLabel .ID , 10 ))
969
- break
970
- }
971
- }
972
- }
973
- }
1022
+ labelsData .SetSelectedLabelNames (template .Labels )
1023
+
974
1024
selectedAssigneeIDs := make ([]int64 , 0 , len (template .Assignees ))
975
1025
selectedAssigneeIDStrings := make ([]string , 0 , len (template .Assignees ))
976
1026
if userIDs , err := user_model .GetUserIDsByNames (ctx , template .Assignees , false ); err == nil {
@@ -983,8 +1033,7 @@ func setTemplateIfExists(ctx *context.Context, ctxDataKey string, possibleFiles
983
1033
if template .Ref != "" && ! strings .HasPrefix (template .Ref , "refs/" ) { // Assume that the ref intended is always a branch - for tags users should use refs/tags/<ref>
984
1034
template .Ref = git .BranchPrefix + template .Ref
985
1035
}
986
- ctx .Data ["HasSelectedLabel" ] = len (labelIDs ) > 0
987
- ctx .Data ["label_ids" ] = strings .Join (labelIDs , "," )
1036
+
988
1037
ctx .Data ["HasSelectedAssignee" ] = len (selectedAssigneeIDs ) > 0
989
1038
ctx .Data ["assignee_ids" ] = strings .Join (selectedAssigneeIDStrings , "," )
990
1039
ctx .Data ["SelectedAssigneeIDs" ] = selectedAssigneeIDs
@@ -1042,8 +1091,14 @@ func NewIssue(ctx *context.Context) {
1042
1091
}
1043
1092
}
1044
1093
1045
- RetrieveRepoMetas (ctx , ctx .Repo .Repository , false )
1046
-
1094
+ retrieveRepoMetasForIssueWriter (ctx , ctx .Repo .Repository , false )
1095
+ if ctx .Written () {
1096
+ return
1097
+ }
1098
+ labelsData := retrieveRepoLabels (ctx , ctx .Repo .Repository , 0 , false )
1099
+ if ctx .Written () {
1100
+ return
1101
+ }
1047
1102
tags , err := repo_model .GetTagNamesByRepoID (ctx , ctx .Repo .Repository .ID )
1048
1103
if err != nil {
1049
1104
ctx .ServerError ("GetTagNamesByRepoID" , err )
@@ -1052,7 +1107,7 @@ func NewIssue(ctx *context.Context) {
1052
1107
ctx .Data ["Tags" ] = tags
1053
1108
1054
1109
ret := issue_service .ParseTemplatesFromDefaultBranch (ctx .Repo .Repository , ctx .Repo .GitRepo )
1055
- templateLoaded , errs := setTemplateIfExists (ctx , issueTemplateKey , IssueTemplateCandidates )
1110
+ templateLoaded , errs := setTemplateIfExists (ctx , issueTemplateKey , IssueTemplateCandidates , labelsData )
1056
1111
for k , v := range errs {
1057
1112
ret .TemplateErrors [k ] = v
1058
1113
}
@@ -1161,34 +1216,25 @@ func ValidateRepoMetas(ctx *context.Context, form forms.CreateIssueForm, isPull
1161
1216
err error
1162
1217
)
1163
1218
1164
- labels := RetrieveRepoMetas (ctx , ctx .Repo .Repository , isPull )
1219
+ retrieveRepoMetasForIssueWriter (ctx , ctx .Repo .Repository , isPull )
1220
+ if ctx .Written () {
1221
+ return ret
1222
+ }
1223
+ labelsData := retrieveRepoLabels (ctx , ctx .Repo .Repository , 0 , isPull )
1165
1224
if ctx .Written () {
1166
1225
return ret
1167
1226
}
1168
1227
1169
1228
var labelIDs []int64
1170
- hasSelected := false
1171
1229
// Check labels.
1172
1230
if len (form .LabelIDs ) > 0 {
1173
1231
labelIDs , err = base .StringsToInt64s (strings .Split (form .LabelIDs , "," ))
1174
1232
if err != nil {
1175
1233
return ret
1176
1234
}
1177
- labelIDMark := make (container.Set [int64 ])
1178
- labelIDMark .AddMultiple (labelIDs ... )
1179
-
1180
- for i := range labels {
1181
- if labelIDMark .Contains (labels [i ].ID ) {
1182
- labels [i ].IsChecked = true
1183
- hasSelected = true
1184
- }
1185
- }
1235
+ labelsData .SetSelectedLabelIDs (labelIDs )
1186
1236
}
1187
1237
1188
- ctx .Data ["Labels" ] = labels
1189
- ctx .Data ["HasSelectedLabel" ] = hasSelected
1190
- ctx .Data ["label_ids" ] = form .LabelIDs
1191
-
1192
1238
// Check milestone.
1193
1239
milestoneID := form .MilestoneID
1194
1240
if milestoneID > 0 {
@@ -1579,38 +1625,15 @@ func ViewIssue(ctx *context.Context) {
1579
1625
}
1580
1626
}
1581
1627
1582
- // Metas.
1583
- // Check labels.
1584
- labelIDMark := make (container.Set [int64 ])
1585
- for _ , label := range issue .Labels {
1586
- labelIDMark .Add (label .ID )
1587
- }
1588
- labels , err := issues_model .GetLabelsByRepoID (ctx , repo .ID , "" , db.ListOptions {})
1589
- if err != nil {
1590
- ctx .ServerError ("GetLabelsByRepoID" , err )
1628
+ retrieveRepoMetasForIssueWriter (ctx , repo , issue .IsPull )
1629
+ if ctx .Written () {
1591
1630
return
1592
1631
}
1593
- ctx .Data ["Labels" ] = labels
1594
-
1595
- if repo .Owner .IsOrganization () {
1596
- orgLabels , err := issues_model .GetLabelsByOrgID (ctx , repo .Owner .ID , ctx .FormString ("sort" ), db.ListOptions {})
1597
- if err != nil {
1598
- ctx .ServerError ("GetLabelsByOrgID" , err )
1599
- return
1600
- }
1601
- ctx .Data ["OrgLabels" ] = orgLabels
1602
-
1603
- labels = append (labels , orgLabels ... )
1604
- }
1605
-
1606
- hasSelected := false
1607
- for i := range labels {
1608
- if labelIDMark .Contains (labels [i ].ID ) {
1609
- labels [i ].IsChecked = true
1610
- hasSelected = true
1611
- }
1632
+ labelsData := retrieveRepoLabels (ctx , repo , issue .ID , issue .IsPull )
1633
+ if ctx .Written () {
1634
+ return
1612
1635
}
1613
- ctx . Data [ "HasSelectedLabel" ] = hasSelected
1636
+ labelsData . SetSelectedLabels ( issue . Labels )
1614
1637
1615
1638
// Check milestone and assignee.
1616
1639
if ctx .Repo .CanWriteIssuesOrPulls (issue .IsPull ) {
0 commit comments