2020-02-11 18:34:17 +09:00
// Copyright 2020 The Gitea Authors. All rights reserved.
2022-11-28 03:20:29 +09:00
// SPDX-License-Identifier: MIT
2020-02-11 18:34:17 +09:00
package stats
import (
2021-12-01 05:06:32 +09:00
"fmt"
2021-12-10 10:27:50 +09:00
repo_model "code.gitea.io/gitea/models/repo"
2020-02-11 18:34:17 +09:00
"code.gitea.io/gitea/modules/git"
2021-12-01 05:06:32 +09:00
"code.gitea.io/gitea/modules/graceful"
2020-12-17 23:00:47 +09:00
"code.gitea.io/gitea/modules/log"
2021-12-01 05:06:32 +09:00
"code.gitea.io/gitea/modules/process"
2023-04-19 22:40:42 +09:00
"code.gitea.io/gitea/modules/setting"
2020-02-11 18:34:17 +09:00
)
// DBIndexer implements Indexer interface to use database's like search
2022-01-21 02:46:10 +09:00
type DBIndexer struct { }
2020-02-11 18:34:17 +09:00
// Index repository status function
func ( db * DBIndexer ) Index ( id int64 ) error {
2021-12-01 05:06:32 +09:00
ctx , _ , finished := process . GetManager ( ) . AddContext ( graceful . GetManager ( ) . ShutdownContext ( ) , fmt . Sprintf ( "Stats.DB Index Repo[%d]" , id ) )
defer finished ( )
2022-12-03 11:48:26 +09:00
repo , err := repo_model . GetRepositoryByID ( ctx , id )
2020-02-11 18:34:17 +09:00
if err != nil {
return err
}
2020-02-12 19:12:27 +09:00
if repo . IsEmpty {
return nil
}
2022-05-20 23:08:52 +09:00
status , err := repo_model . GetIndexerStatus ( ctx , repo , repo_model . RepoIndexerTypeStats )
2020-02-11 18:34:17 +09:00
if err != nil {
return err
}
2022-03-30 04:13:41 +09:00
gitRepo , err := git . OpenRepository ( ctx , repo . RepoPath ( ) )
2020-02-11 18:34:17 +09:00
if err != nil {
2022-02-25 13:22:09 +09:00
if err . Error ( ) == "no such file or directory" {
return nil
}
2020-02-11 18:34:17 +09:00
return err
}
defer gitRepo . Close ( )
// Get latest commit for default branch
commitID , err := gitRepo . GetBranchCommitID ( repo . DefaultBranch )
if err != nil {
2023-04-19 22:40:42 +09:00
if git . IsErrBranchNotExist ( err ) || git . IsErrNotExist ( err ) || setting . IsInTesting {
2021-09-21 04:46:51 +09:00
log . Debug ( "Unable to get commit ID for default branch %s in %s ... skipping this repository" , repo . DefaultBranch , repo . RepoPath ( ) )
2021-04-22 10:19:21 +09:00
return nil
}
2021-09-21 04:46:51 +09:00
log . Error ( "Unable to get commit ID for default branch %s in %s. Error: %v" , repo . DefaultBranch , repo . RepoPath ( ) , err )
2020-02-11 18:34:17 +09:00
return err
}
// Do not recalculate stats if already calculated for this commit
if status . CommitSha == commitID {
return nil
}
// Calculate and save language statistics to database
stats , err := gitRepo . GetLanguageStats ( commitID )
if err != nil {
2023-04-19 22:40:42 +09:00
if ! setting . IsInTesting {
log . Error ( "Unable to get language stats for ID %s for default branch %s in %s. Error: %v" , commitID , repo . DefaultBranch , repo . RepoPath ( ) , err )
}
2020-02-11 18:34:17 +09:00
return err
}
2023-10-11 13:24:07 +09:00
err = repo_model . UpdateLanguageStats ( ctx , repo , commitID , stats )
2021-09-21 04:46:51 +09:00
if err != nil {
log . Error ( "Unable to update language stats for ID %s for default branch %s in %s. Error: %v" , commitID , repo . DefaultBranch , repo . RepoPath ( ) , err )
return err
}
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 ) )
return nil
2020-02-11 18:34:17 +09:00
}
// Close dummy function
func ( db * DBIndexer ) Close ( ) {
}