mirror of
https://github.com/hanzoai/forge.git
synced 2026-10-30 15:00:39 +00:00
Source files keep their SPDX-License-Identifier and Hanzo copyright line; the Gitea, Gogs and LFS Test Server copyrights they used to repeat now live once in NOTICE, alongside LICENSE. The header lint accepts any copyright line above the SPDX line, so it no longer demands an upstream one. Co-authored-by: Hanzo Dev <[email protected]>
86 lines
2.6 KiB
Go
86 lines
2.6 KiB
Go
// Copyright 2026 Hanzo AI, Inc. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package stats
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
repo_model "github.com/hanzoai/git/models/repo"
|
|
"github.com/hanzoai/git/modules/git"
|
|
"github.com/hanzoai/git/modules/git/languagestats"
|
|
"github.com/hanzoai/git/modules/gitrepo"
|
|
"github.com/hanzoai/git/modules/graceful"
|
|
"github.com/hanzoai/git/modules/log"
|
|
"github.com/hanzoai/git/modules/process"
|
|
"github.com/hanzoai/git/modules/setting"
|
|
)
|
|
|
|
// DBIndexer implements Indexer interface to use database's like search
|
|
type DBIndexer struct{}
|
|
|
|
// Index repository status function
|
|
func (db *DBIndexer) Index(id int64) error {
|
|
ctx, _, finished := process.GetManager().AddContext(graceful.GetManager().ShutdownContext(), fmt.Sprintf("Stats.DB Index Repo[%d]", id))
|
|
defer finished()
|
|
|
|
repo, err := repo_model.GetRepositoryByID(ctx, id)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if repo.IsEmpty {
|
|
return nil
|
|
}
|
|
|
|
status, err := repo_model.GetIndexerStatus(ctx, repo, repo_model.RepoIndexerTypeStats)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
gitRepo, err := gitrepo.OpenRepository(ctx, repo)
|
|
if err != nil {
|
|
if err.Error() == "no such file or directory" {
|
|
return nil
|
|
}
|
|
return err
|
|
}
|
|
defer gitRepo.Close()
|
|
|
|
// Get latest commit for default branch
|
|
commitID, err := gitRepo.GetBranchCommitID(repo.DefaultBranch)
|
|
if err != nil {
|
|
if git.IsErrBranchNotExist(err) || git.IsErrNotExist(err) || setting.IsInTesting {
|
|
log.Debug("Unable to get commit ID for default branch %s in %s ... skipping this repository", repo.DefaultBranch, repo.FullName())
|
|
return nil
|
|
}
|
|
log.Error("Unable to get commit ID for default branch %s in %s. Error: %v", repo.DefaultBranch, repo.FullName(), err)
|
|
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 := languagestats.GetLanguageStats(ctx, gitRepo, commitID)
|
|
if err != nil {
|
|
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.FullName(), err)
|
|
}
|
|
return err
|
|
}
|
|
err = repo_model.UpdateLanguageStats(ctx, repo, commitID, stats)
|
|
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.FullName(), 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.FullName(), len(stats))
|
|
return nil
|
|
}
|
|
|
|
// Close dummy function
|
|
func (db *DBIndexer) Close() {
|
|
}
|