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

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