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