@@ -870,51 +870,112 @@ 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 makeSelectedStringIDs [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 = makeSelectedStringIDs (
906
+ d .AllLabels , func (label * issues_model.Label ) int64 { return label .ID },
907
+ labels , func (label * issues_model.Label ) int64 { return label .ID },
908
+ )
909
+ }
910
+
911
+ func (d * issueSidebarLabelsData ) SetSelectedLabelNames (labelNames []string ) {
912
+ d .SelectedLabelIDs = makeSelectedStringIDs (
913
+ d .AllLabels , func (label * issues_model.Label ) string { return strings .ToLower (label .Name ) },
914
+ labelNames , strings .ToLower ,
915
+ )
916
+ }
917
+
918
+ func (d * issueSidebarLabelsData ) SetSelectedLabelIDs (labelIDs []int64 ) {
919
+ d .SelectedLabelIDs = makeSelectedStringIDs (
920
+ d .AllLabels , func (label * issues_model.Label ) int64 { return label .ID },
921
+ labelIDs , func (labelID int64 ) int64 { return labelID },
922
+ )
923
+ }
924
+
925
+ func retrieveRepoLabels (ctx * context.Context , repo * repo_model.Repository , issueID int64 , isPull bool ) * issueSidebarLabelsData {
926
+ labelsData := & issueSidebarLabelsData {
927
+ Repository : repo ,
928
+ RepoLink : ctx .Repo .RepoLink ,
929
+ IssueID : issueID ,
930
+ IsPullRequest : isPull ,
877
931
}
932
+ ctx .Data ["IssueSidebarLabelsData" ] = labelsData
878
933
879
934
labels , err := issues_model .GetLabelsByRepoID (ctx , repo .ID , "" , db.ListOptions {})
880
935
if err != nil {
881
936
ctx .ServerError ("GetLabelsByRepoID" , err )
882
937
return nil
883
938
}
884
- ctx .Data ["Labels" ] = labels
939
+ labelsData .RepoLabels = labels
940
+
885
941
if repo .Owner .IsOrganization () {
886
942
orgLabels , err := issues_model .GetLabelsByOrgID (ctx , repo .Owner .ID , ctx .FormString ("sort" ), db.ListOptions {})
887
943
if err != nil {
888
944
return nil
889
945
}
946
+ labelsData .OrgLabels = orgLabels
947
+ }
948
+ labelsData .AllLabels = append (labelsData .AllLabels , labelsData .RepoLabels ... )
949
+ labelsData .AllLabels = append (labelsData .AllLabels , labelsData .OrgLabels ... )
950
+ return labelsData
951
+ }
890
952
891
- ctx .Data ["OrgLabels" ] = orgLabels
892
- labels = append (labels , orgLabels ... )
953
+ // retrieveRepoMetasForIssueWriter finds some the meta information of a repository for an issue/pr writer
954
+ func retrieveRepoMetasForIssueWriter (ctx * context.Context , repo * repo_model.Repository , isPull bool ) {
955
+ if ! ctx .Repo .CanWriteIssuesOrPulls (isPull ) {
956
+ return
893
957
}
894
958
895
959
RetrieveRepoMilestonesAndAssignees (ctx , repo )
896
960
if ctx .Written () {
897
- return nil
961
+ return
898
962
}
899
963
900
964
retrieveProjects (ctx , repo )
901
965
if ctx .Written () {
902
- return nil
966
+ return
903
967
}
904
968
905
969
PrepareBranchList (ctx )
906
970
if ctx .Written () {
907
- return nil
971
+ return
908
972
}
909
-
910
973
// Contains true if the user can create issue dependencies
911
974
ctx .Data ["CanCreateIssueDependencies" ] = ctx .Repo .CanCreateIssueDependencies (ctx , ctx .Doer , isPull )
912
-
913
- return labels
914
975
}
915
976
916
977
// 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 ) {
978
+ func setTemplateIfExists (ctx * context.Context , ctxDataKey string , possibleFiles []string , labelsData * issueSidebarLabelsData ) (bool , map [string ]error ) {
918
979
commit , err := ctx .Repo .GitRepo .GetBranchCommit (ctx .Repo .Repository .DefaultBranch )
919
980
if err != nil {
920
981
return false , nil
@@ -951,26 +1012,9 @@ func setTemplateIfExists(ctx *context.Context, ctxDataKey string, possibleFiles
951
1012
ctx .Data ["Fields" ] = template .Fields
952
1013
ctx .Data ["TemplateFile" ] = template .FileName
953
1014
}
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
1015
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
- }
1016
+ labelsData .SetSelectedLabelNames (template .Labels )
1017
+
974
1018
selectedAssigneeIDs := make ([]int64 , 0 , len (template .Assignees ))
975
1019
selectedAssigneeIDStrings := make ([]string , 0 , len (template .Assignees ))
976
1020
if userIDs , err := user_model .GetUserIDsByNames (ctx , template .Assignees , false ); err == nil {
@@ -983,8 +1027,7 @@ func setTemplateIfExists(ctx *context.Context, ctxDataKey string, possibleFiles
983
1027
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
1028
template .Ref = git .BranchPrefix + template .Ref
985
1029
}
986
- ctx .Data ["HasSelectedLabel" ] = len (labelIDs ) > 0
987
- ctx .Data ["label_ids" ] = strings .Join (labelIDs , "," )
1030
+
988
1031
ctx .Data ["HasSelectedAssignee" ] = len (selectedAssigneeIDs ) > 0
989
1032
ctx .Data ["assignee_ids" ] = strings .Join (selectedAssigneeIDStrings , "," )
990
1033
ctx .Data ["SelectedAssigneeIDs" ] = selectedAssigneeIDs
@@ -1042,8 +1085,14 @@ func NewIssue(ctx *context.Context) {
1042
1085
}
1043
1086
}
1044
1087
1045
- RetrieveRepoMetas (ctx , ctx .Repo .Repository , false )
1046
-
1088
+ retrieveRepoMetasForIssueWriter (ctx , ctx .Repo .Repository , false )
1089
+ if ctx .Written () {
1090
+ return
1091
+ }
1092
+ labelsData := retrieveRepoLabels (ctx , ctx .Repo .Repository , 0 , false )
1093
+ if ctx .Written () {
1094
+ return
1095
+ }
1047
1096
tags , err := repo_model .GetTagNamesByRepoID (ctx , ctx .Repo .Repository .ID )
1048
1097
if err != nil {
1049
1098
ctx .ServerError ("GetTagNamesByRepoID" , err )
@@ -1052,7 +1101,7 @@ func NewIssue(ctx *context.Context) {
1052
1101
ctx .Data ["Tags" ] = tags
1053
1102
1054
1103
ret := issue_service .ParseTemplatesFromDefaultBranch (ctx .Repo .Repository , ctx .Repo .GitRepo )
1055
- templateLoaded , errs := setTemplateIfExists (ctx , issueTemplateKey , IssueTemplateCandidates )
1104
+ templateLoaded , errs := setTemplateIfExists (ctx , issueTemplateKey , IssueTemplateCandidates , labelsData )
1056
1105
for k , v := range errs {
1057
1106
ret .TemplateErrors [k ] = v
1058
1107
}
@@ -1161,34 +1210,25 @@ func ValidateRepoMetas(ctx *context.Context, form forms.CreateIssueForm, isPull
1161
1210
err error
1162
1211
)
1163
1212
1164
- labels := RetrieveRepoMetas (ctx , ctx .Repo .Repository , isPull )
1213
+ retrieveRepoMetasForIssueWriter (ctx , ctx .Repo .Repository , isPull )
1214
+ if ctx .Written () {
1215
+ return ret
1216
+ }
1217
+ labelsData := retrieveRepoLabels (ctx , ctx .Repo .Repository , 0 , isPull )
1165
1218
if ctx .Written () {
1166
1219
return ret
1167
1220
}
1168
1221
1169
1222
var labelIDs []int64
1170
- hasSelected := false
1171
1223
// Check labels.
1172
1224
if len (form .LabelIDs ) > 0 {
1173
1225
labelIDs , err = base .StringsToInt64s (strings .Split (form .LabelIDs , "," ))
1174
1226
if err != nil {
1175
1227
return ret
1176
1228
}
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
- }
1229
+ labelsData .SetSelectedLabelIDs (labelIDs )
1186
1230
}
1187
1231
1188
- ctx .Data ["Labels" ] = labels
1189
- ctx .Data ["HasSelectedLabel" ] = hasSelected
1190
- ctx .Data ["label_ids" ] = form .LabelIDs
1191
-
1192
1232
// Check milestone.
1193
1233
milestoneID := form .MilestoneID
1194
1234
if milestoneID > 0 {
@@ -1579,38 +1619,15 @@ func ViewIssue(ctx *context.Context) {
1579
1619
}
1580
1620
}
1581
1621
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 )
1622
+ retrieveRepoMetasForIssueWriter (ctx , repo , issue .IsPull )
1623
+ if ctx .Written () {
1591
1624
return
1592
1625
}
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
- }
1626
+ labelsData := retrieveRepoLabels (ctx , repo , issue .ID , issue .IsPull )
1627
+ if ctx .Written () {
1628
+ return
1612
1629
}
1613
- ctx . Data [ "HasSelectedLabel" ] = hasSelected
1630
+ labelsData . SetSelectedLabels ( issue . Labels )
1614
1631
1615
1632
// Check milestone and assignee.
1616
1633
if ctx .Repo .CanWriteIssuesOrPulls (issue .IsPull ) {
0 commit comments