mirror of
https://github.com/go-gitea/gitea.git
synced 2025-04-08 17:05:45 +02:00
Each "indexer" should provide the "search modes" they support by themselves. And we need to remove the "fuzzy" search for code.
121 lines
3.0 KiB
Go
121 lines
3.0 KiB
Go
// Copyright 2022 The Gitea Authors. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package user
|
|
|
|
import (
|
|
"net/http"
|
|
|
|
"code.gitea.io/gitea/models/db"
|
|
repo_model "code.gitea.io/gitea/models/repo"
|
|
code_indexer "code.gitea.io/gitea/modules/indexer/code"
|
|
"code.gitea.io/gitea/modules/setting"
|
|
"code.gitea.io/gitea/modules/templates"
|
|
"code.gitea.io/gitea/routers/common"
|
|
shared_user "code.gitea.io/gitea/routers/web/shared/user"
|
|
"code.gitea.io/gitea/services/context"
|
|
)
|
|
|
|
const (
|
|
tplUserCode templates.TplName = "user/code"
|
|
)
|
|
|
|
// CodeSearch render user/organization code search page
|
|
func CodeSearch(ctx *context.Context) {
|
|
if !setting.Indexer.RepoIndexerEnabled {
|
|
ctx.Redirect(ctx.ContextUser.HomeLink())
|
|
return
|
|
}
|
|
shared_user.PrepareContextForProfileBigAvatar(ctx)
|
|
shared_user.RenderUserHeader(ctx)
|
|
|
|
if err := shared_user.LoadHeaderCount(ctx); err != nil {
|
|
ctx.ServerError("LoadHeaderCount", err)
|
|
return
|
|
}
|
|
|
|
ctx.Data["IsPackageEnabled"] = setting.Packages.Enabled
|
|
ctx.Data["Title"] = ctx.Tr("explore.code")
|
|
ctx.Data["IsCodePage"] = true
|
|
|
|
prepareSearch := common.PrepareCodeSearch(ctx)
|
|
if prepareSearch.Keyword == "" {
|
|
ctx.HTML(http.StatusOK, tplUserCode)
|
|
return
|
|
}
|
|
|
|
var (
|
|
repoIDs []int64
|
|
err error
|
|
)
|
|
|
|
page := ctx.FormInt("page")
|
|
if page <= 0 {
|
|
page = 1
|
|
}
|
|
|
|
repoIDs, err = repo_model.FindUserCodeAccessibleOwnerRepoIDs(ctx, ctx.ContextUser.ID, ctx.Doer)
|
|
if err != nil {
|
|
ctx.ServerError("FindUserCodeAccessibleOwnerRepoIDs", err)
|
|
return
|
|
}
|
|
|
|
var (
|
|
total int
|
|
searchResults []*code_indexer.Result
|
|
searchResultLanguages []*code_indexer.SearchResultLanguages
|
|
)
|
|
|
|
if len(repoIDs) > 0 {
|
|
total, searchResults, searchResultLanguages, err = code_indexer.PerformSearch(ctx, &code_indexer.SearchOptions{
|
|
RepoIDs: repoIDs,
|
|
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)
|
|
}
|
|
|
|
loadRepoIDs := make([]int64, 0, len(searchResults))
|
|
for _, result := range searchResults {
|
|
var find bool
|
|
for _, id := range loadRepoIDs {
|
|
if id == result.RepoID {
|
|
find = true
|
|
break
|
|
}
|
|
}
|
|
if !find {
|
|
loadRepoIDs = append(loadRepoIDs, result.RepoID)
|
|
}
|
|
}
|
|
|
|
repoMaps, err := repo_model.GetRepositoriesMapByIDs(ctx, loadRepoIDs)
|
|
if err != nil {
|
|
ctx.ServerError("GetRepositoriesMapByIDs", err)
|
|
return
|
|
}
|
|
|
|
ctx.Data["RepoMaps"] = repoMaps
|
|
}
|
|
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, tplUserCode)
|
|
}
|