You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

db.go 2.5KB

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