gitea源码

db.go 2.6KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. // Copyright 2020 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package stats
  4. import (
  5. "fmt"
  6. repo_model "code.gitea.io/gitea/models/repo"
  7. "code.gitea.io/gitea/modules/git"
  8. "code.gitea.io/gitea/modules/git/languagestats"
  9. "code.gitea.io/gitea/modules/gitrepo"
  10. "code.gitea.io/gitea/modules/graceful"
  11. "code.gitea.io/gitea/modules/log"
  12. "code.gitea.io/gitea/modules/process"
  13. "code.gitea.io/gitea/modules/setting"
  14. )
  15. // DBIndexer implements Indexer interface to use database's like search
  16. type DBIndexer struct{}
  17. // Index repository status function
  18. func (db *DBIndexer) Index(id int64) error {
  19. ctx, _, finished := process.GetManager().AddContext(graceful.GetManager().ShutdownContext(), fmt.Sprintf("Stats.DB Index Repo[%d]", id))
  20. defer finished()
  21. repo, err := repo_model.GetRepositoryByID(ctx, id)
  22. if err != nil {
  23. return err
  24. }
  25. if repo.IsEmpty {
  26. return nil
  27. }
  28. status, err := repo_model.GetIndexerStatus(ctx, repo, repo_model.RepoIndexerTypeStats)
  29. if err != nil {
  30. return err
  31. }
  32. gitRepo, err := gitrepo.OpenRepository(ctx, repo)
  33. if err != nil {
  34. if err.Error() == "no such file or directory" {
  35. return nil
  36. }
  37. return err
  38. }
  39. defer gitRepo.Close()
  40. // Get latest commit for default branch
  41. commitID, err := gitRepo.GetBranchCommitID(repo.DefaultBranch)
  42. if err != nil {
  43. if git.IsErrBranchNotExist(err) || git.IsErrNotExist(err) || setting.IsInTesting {
  44. log.Debug("Unable to get commit ID for default branch %s in %s ... skipping this repository", repo.DefaultBranch, repo.FullName())
  45. return nil
  46. }
  47. log.Error("Unable to get commit ID for default branch %s in %s. Error: %v", repo.DefaultBranch, repo.FullName(), err)
  48. return err
  49. }
  50. // Do not recalculate stats if already calculated for this commit
  51. if status.CommitSha == commitID {
  52. return nil
  53. }
  54. // Calculate and save language statistics to database
  55. stats, err := languagestats.GetLanguageStats(gitRepo, commitID)
  56. if err != nil {
  57. if !setting.IsInTesting {
  58. log.Error("Unable to get language stats for ID %s for default branch %s in %s. Error: %v", commitID, repo.DefaultBranch, repo.FullName(), err)
  59. }
  60. return err
  61. }
  62. err = repo_model.UpdateLanguageStats(ctx, repo, commitID, stats)
  63. if err != nil {
  64. log.Error("Unable to update language stats for ID %s for default branch %s in %s. Error: %v", commitID, repo.DefaultBranch, repo.FullName(), err)
  65. return err
  66. }
  67. log.Debug("DBIndexer completed language stats for ID %s for default branch %s in %s. stats count: %d", commitID, repo.DefaultBranch, repo.FullName(), len(stats))
  68. return nil
  69. }
  70. // Close dummy function
  71. func (db *DBIndexer) Close() {
  72. }