@@ -5,6 +5,8 @@ package repo
55
66import (
77 "net/http"
8+ "sort"
9+ "strconv"
810
911 "code.gitea.io/gitea/models/db"
1012 issues_model "code.gitea.io/gitea/models/issues"
@@ -29,31 +31,78 @@ func IssueSuggestions(ctx *context.Context) {
2931 isPull = optional .Some (false )
3032 }
3133
32- searchOpt := & issue_indexer.SearchOptions {
33- Paginator : & db.ListOptions {
34- Page : 0 ,
35- PageSize : 5 ,
36- },
37- Keyword : keyword ,
38- RepoIDs : []int64 {ctx .Repo .Repository .ID },
39- IsPull : isPull ,
40- IsClosed : nil ,
41- SortBy : issue_indexer .SortByUpdatedDesc ,
34+ indexKeyword , _ := strconv .ParseInt (keyword , 10 , 64 )
35+ pageSize := 5
36+ issues := make (issues_model.IssueList , 0 , pageSize )
37+ if indexKeyword > 0 {
38+ issue , err := issues_model .GetIssueByIndex (ctx , ctx .Repo .Repository .ID , indexKeyword )
39+ if err != nil && ! issues_model .IsErrIssueNotExist (err ) {
40+ ctx .ServerError ("GetIssueByIndex" , err )
41+ return
42+ }
43+ if issue != nil {
44+ pageSize --
45+ }
46+
47+ issues , err = issues_model .FindIssuesWithIndexPrefix (ctx , ctx .Repo .Repository .ID , indexKeyword , pageSize )
48+ if err != nil {
49+ ctx .ServerError ("FindIssuesWithIndexPrefix" , err )
50+ return
51+ }
52+ pageSize -= len (issues )
53+ if issue != nil {
54+ issues = append ([]* issues_model.Issue {issue }, issues ... )
55+ }
4256 }
4357
44- ids , _ , err := issue_indexer .SearchIssues (ctx , searchOpt )
45- if err != nil {
46- ctx .ServerError ("SearchIssues" , err )
47- return
58+ if pageSize > 0 {
59+ searchOpt := & issue_indexer.SearchOptions {
60+ Paginator : & db.ListOptions {
61+ Page : 0 ,
62+ PageSize : pageSize ,
63+ },
64+ Keyword : keyword ,
65+ RepoIDs : []int64 {ctx .Repo .Repository .ID },
66+ IsPull : isPull ,
67+ IsClosed : nil ,
68+ SortBy : issue_indexer .SortByUpdatedDesc ,
69+ }
70+
71+ ids , _ , err := issue_indexer .SearchIssues (ctx , searchOpt )
72+ if err != nil {
73+ ctx .ServerError ("SearchIssues" , err )
74+ return
75+ }
76+
77+ for i := 0 ; i < len (ids ); i ++ {
78+ for _ , issue := range issues {
79+ if ids [i ] == issue .ID {
80+ ids = append (ids [:i ], ids [i + 1 :]... )
81+ i --
82+ break
83+ }
84+ }
85+ }
86+
87+ if len (ids ) > 0 {
88+ newIssues , err := issues_model .GetIssuesByIDs (ctx , ids , true )
89+ if err != nil {
90+ ctx .ServerError ("FindIssuesByIDs" , err )
91+ return
92+ }
93+ sort .Slice (newIssues , func (i , j int ) bool {
94+ return newIssues [i ].Index > newIssues [j ].Index
95+ })
96+ issues = append (issues , newIssues ... )
97+ }
4898 }
49- issues , err := issues_model . GetIssuesByIDs ( ctx , ids , true )
50- if err != nil {
51- ctx .ServerError ("FindIssuesByIDs " , err )
99+
100+ if err := issues . LoadPullRequests ( ctx ); err != nil {
101+ ctx .ServerError ("LoadPullRequests " , err )
52102 return
53103 }
54104
55105 suggestions := make ([]* structs.Issue , 0 , len (issues ))
56-
57106 for _ , issue := range issues {
58107 suggestion := & structs.Issue {
59108 ID : issue .ID ,
@@ -62,16 +111,10 @@ func IssueSuggestions(ctx *context.Context) {
62111 State : issue .State (),
63112 }
64113
65- if issue .IsPull {
66- if err := issue .LoadPullRequest (ctx ); err != nil {
67- ctx .ServerError ("LoadPullRequest" , err )
68- return
69- }
70- if issue .PullRequest != nil {
71- suggestion .PullRequest = & structs.PullRequestMeta {
72- HasMerged : issue .PullRequest .HasMerged ,
73- IsWorkInProgress : issue .PullRequest .IsWorkInProgress (ctx ),
74- }
114+ if issue .IsPull && issue .PullRequest != nil {
115+ suggestion .PullRequest = & structs.PullRequestMeta {
116+ HasMerged : issue .PullRequest .HasMerged ,
117+ IsWorkInProgress : issue .PullRequest .IsWorkInProgress (ctx ),
75118 }
76119 }
77120
0 commit comments