gitea源码

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. // Copyright 2017 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package repo
  4. import (
  5. "net/http"
  6. "code.gitea.io/gitea/models/db"
  7. "code.gitea.io/gitea/modules/git"
  8. code_indexer "code.gitea.io/gitea/modules/indexer/code"
  9. "code.gitea.io/gitea/modules/indexer/code/gitgrep"
  10. "code.gitea.io/gitea/modules/setting"
  11. "code.gitea.io/gitea/modules/templates"
  12. "code.gitea.io/gitea/routers/common"
  13. "code.gitea.io/gitea/services/context"
  14. )
  15. const tplSearch templates.TplName = "repo/search"
  16. // Search render repository search page
  17. func Search(ctx *context.Context) {
  18. ctx.Data["PageIsViewCode"] = true
  19. prepareSearch := common.PrepareCodeSearch(ctx)
  20. if prepareSearch.Keyword == "" {
  21. ctx.HTML(http.StatusOK, tplSearch)
  22. return
  23. }
  24. page := ctx.FormInt("page")
  25. if page <= 0 {
  26. page = 1
  27. }
  28. var total int
  29. var searchResults []*code_indexer.Result
  30. var searchResultLanguages []*code_indexer.SearchResultLanguages
  31. if setting.Indexer.RepoIndexerEnabled {
  32. var err error
  33. total, searchResults, searchResultLanguages, err = code_indexer.PerformSearch(ctx, &code_indexer.SearchOptions{
  34. RepoIDs: []int64{ctx.Repo.Repository.ID},
  35. Keyword: prepareSearch.Keyword,
  36. SearchMode: prepareSearch.SearchMode,
  37. Language: prepareSearch.Language,
  38. Paginator: &db.ListOptions{
  39. Page: page,
  40. PageSize: setting.UI.RepoSearchPagingNum,
  41. },
  42. })
  43. if err != nil {
  44. if code_indexer.IsAvailable(ctx) {
  45. ctx.ServerError("SearchResults", err)
  46. return
  47. }
  48. ctx.Data["CodeIndexerUnavailable"] = true
  49. } else {
  50. ctx.Data["CodeIndexerUnavailable"] = !code_indexer.IsAvailable(ctx)
  51. }
  52. } else {
  53. var err error
  54. // ref should be default branch or the first existing branch
  55. searchRef := git.RefNameFromBranch(ctx.Repo.Repository.DefaultBranch)
  56. searchResults, total, err = gitgrep.PerformSearch(ctx, page, ctx.Repo.Repository.ID, ctx.Repo.GitRepo, searchRef, prepareSearch.Keyword, prepareSearch.SearchMode)
  57. if err != nil {
  58. ctx.ServerError("gitgrep.PerformSearch", err)
  59. return
  60. }
  61. }
  62. ctx.Data["Repo"] = ctx.Repo.Repository
  63. ctx.Data["SearchResults"] = searchResults
  64. ctx.Data["SearchResultLanguages"] = searchResultLanguages
  65. pager := context.NewPagination(total, setting.UI.RepoSearchPagingNum, page, 5)
  66. pager.AddParamFromRequest(ctx.Req)
  67. ctx.Data["Page"] = pager
  68. ctx.HTML(http.StatusOK, tplSearch)
  69. }