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