@@ -5,9 +5,11 @@ package repo
55
66import (
77 "net/http"
8+ "strings"
89
910 "code.gitea.io/gitea/models/db"
1011 "code.gitea.io/gitea/modules/base"
12+ "code.gitea.io/gitea/modules/git"
1113 code_indexer "code.gitea.io/gitea/modules/indexer/code"
1214 "code.gitea.io/gitea/modules/setting"
1315 "code.gitea.io/gitea/services/context"
@@ -17,11 +19,6 @@ const tplSearch base.TplName = "repo/search"
1719
1820// Search render repository search page
1921func Search (ctx * context.Context ) {
20- if ! setting .Indexer .RepoIndexerEnabled {
21- ctx .Redirect (ctx .Repo .RepoLink )
22- return
23- }
24-
2522 language := ctx .FormTrim ("l" )
2623 keyword := ctx .FormTrim ("q" )
2724
@@ -42,24 +39,51 @@ func Search(ctx *context.Context) {
4239 page = 1
4340 }
4441
45- total , searchResults , searchResultLanguages , err := code_indexer .PerformSearch (ctx , & code_indexer.SearchOptions {
46- RepoIDs : []int64 {ctx .Repo .Repository .ID },
47- Keyword : keyword ,
48- IsKeywordFuzzy : isFuzzy ,
49- Language : language ,
50- Paginator : & db.ListOptions {
51- Page : page ,
52- PageSize : setting .UI .RepoSearchPagingNum ,
53- },
54- })
55- if err != nil {
56- if code_indexer .IsAvailable (ctx ) {
57- ctx .ServerError ("SearchResults" , err )
58- return
42+ var total int
43+ var searchResults []* code_indexer.Result
44+ var searchResultLanguages []* code_indexer.SearchResultLanguages
45+ if setting .Indexer .RepoIndexerEnabled {
46+ var err error
47+ total , searchResults , searchResultLanguages , err = code_indexer .PerformSearch (ctx , & code_indexer.SearchOptions {
48+ RepoIDs : []int64 {ctx .Repo .Repository .ID },
49+ Keyword : keyword ,
50+ IsKeywordFuzzy : isFuzzy ,
51+ Language : language ,
52+ Paginator : & db.ListOptions {
53+ Page : page ,
54+ PageSize : setting .UI .RepoSearchPagingNum ,
55+ },
56+ })
57+ if err != nil {
58+ if code_indexer .IsAvailable (ctx ) {
59+ ctx .ServerError ("SearchResults" , err )
60+ return
61+ }
62+ ctx .Data ["CodeIndexerUnavailable" ] = true
63+ } else {
64+ ctx .Data ["CodeIndexerUnavailable" ] = ! code_indexer .IsAvailable (ctx )
5965 }
60- ctx .Data ["CodeIndexerUnavailable" ] = true
6166 } else {
62- ctx .Data ["CodeIndexerUnavailable" ] = ! code_indexer .IsAvailable (ctx )
67+ res , err := git .GrepSearch (ctx , ctx .Repo .GitRepo , keyword , git.GrepOptions {ContextLineNumber : 3 , IsFuzzy : isFuzzy })
68+ if err != nil {
69+ ctx .ServerError ("GrepSearch" , err )
70+ return
71+ }
72+ total = len (res )
73+ pageStart := min ((page - 1 )* setting .UI .RepoSearchPagingNum , len (res ))
74+ pageEnd := min (page * setting .UI .RepoSearchPagingNum , len (res ))
75+ res = res [pageStart :pageEnd ]
76+ for _ , r := range res {
77+ searchResults = append (searchResults , & code_indexer.Result {
78+ RepoID : ctx .Repo .Repository .ID ,
79+ Filename : r .Filename ,
80+ CommitID : ctx .Repo .CommitID ,
81+ // UpdatedUnix: not supported yet
82+ // Language: not supported yet
83+ // Color: not supported yet
84+ Lines : code_indexer .HighlightSearchResultCode (r .Filename , r .LineNumbers , strings .Join (r .LineCodes , "\n " )),
85+ })
86+ }
6387 }
6488
6589 ctx .Data ["Repo" ] = ctx .Repo .Repository
0 commit comments