mirror of
https://github.com/go-gitea/gitea.git
synced 2025-04-03 05:39:55 +08:00

Each "indexer" should provide the "search modes" they support by themselves. And we need to remove the "fuzzy" search for code.
80 lines
2.3 KiB
Go
80 lines
2.3 KiB
Go
// Copyright 2017 The Gitea Authors. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package repo
|
|
|
|
import (
|
|
"net/http"
|
|
|
|
"code.gitea.io/gitea/models/db"
|
|
"code.gitea.io/gitea/modules/git"
|
|
code_indexer "code.gitea.io/gitea/modules/indexer/code"
|
|
"code.gitea.io/gitea/modules/indexer/code/gitgrep"
|
|
"code.gitea.io/gitea/modules/setting"
|
|
"code.gitea.io/gitea/modules/templates"
|
|
"code.gitea.io/gitea/routers/common"
|
|
"code.gitea.io/gitea/services/context"
|
|
)
|
|
|
|
const tplSearch templates.TplName = "repo/search"
|
|
|
|
// Search render repository search page
|
|
func Search(ctx *context.Context) {
|
|
ctx.Data["PageIsViewCode"] = true
|
|
prepareSearch := common.PrepareCodeSearch(ctx)
|
|
if prepareSearch.Keyword == "" {
|
|
ctx.HTML(http.StatusOK, tplSearch)
|
|
return
|
|
}
|
|
|
|
page := ctx.FormInt("page")
|
|
if page <= 0 {
|
|
page = 1
|
|
}
|
|
|
|
var total int
|
|
var searchResults []*code_indexer.Result
|
|
var searchResultLanguages []*code_indexer.SearchResultLanguages
|
|
if setting.Indexer.RepoIndexerEnabled {
|
|
var err error
|
|
total, searchResults, searchResultLanguages, err = code_indexer.PerformSearch(ctx, &code_indexer.SearchOptions{
|
|
RepoIDs: []int64{ctx.Repo.Repository.ID},
|
|
Keyword: prepareSearch.Keyword,
|
|
SearchMode: prepareSearch.SearchMode,
|
|
Language: prepareSearch.Language,
|
|
Paginator: &db.ListOptions{
|
|
Page: page,
|
|
PageSize: setting.UI.RepoSearchPagingNum,
|
|
},
|
|
})
|
|
if err != nil {
|
|
if code_indexer.IsAvailable(ctx) {
|
|
ctx.ServerError("SearchResults", err)
|
|
return
|
|
}
|
|
ctx.Data["CodeIndexerUnavailable"] = true
|
|
} else {
|
|
ctx.Data["CodeIndexerUnavailable"] = !code_indexer.IsAvailable(ctx)
|
|
}
|
|
} else {
|
|
var err error
|
|
// ref should be default branch or the first existing branch
|
|
searchRef := git.RefNameFromBranch(ctx.Repo.Repository.DefaultBranch)
|
|
searchResults, total, err = gitgrep.PerformSearch(ctx, page, ctx.Repo.Repository.ID, ctx.Repo.GitRepo, searchRef, prepareSearch.Keyword, prepareSearch.SearchMode)
|
|
if err != nil {
|
|
ctx.ServerError("gitgrep.PerformSearch", err)
|
|
return
|
|
}
|
|
}
|
|
|
|
ctx.Data["Repo"] = ctx.Repo.Repository
|
|
ctx.Data["SearchResults"] = searchResults
|
|
ctx.Data["SearchResultLanguages"] = searchResultLanguages
|
|
|
|
pager := context.NewPagination(total, setting.UI.RepoSearchPagingNum, page, 5)
|
|
pager.AddParamFromRequest(ctx.Req)
|
|
ctx.Data["Page"] = pager
|
|
|
|
ctx.HTML(http.StatusOK, tplSearch)
|
|
}
|