// 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, IsKeywordFuzzy: prepareSearch.IsFuzzy, 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.IsFuzzy) 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) }