Платформа ЦРНП "Мирокод" для разработки проектов
https://git.mirocod.ru
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.
79 lines
2.4 KiB
79 lines
2.4 KiB
// Copyright 2020 The Gitea Authors. All rights reserved. |
|
// Use of this source code is governed by a MIT-style |
|
// license that can be found in the LICENSE file. |
|
|
|
package stats |
|
|
|
import ( |
|
"fmt" |
|
|
|
repo_model "code.gitea.io/gitea/models/repo" |
|
"code.gitea.io/gitea/modules/git" |
|
"code.gitea.io/gitea/modules/graceful" |
|
"code.gitea.io/gitea/modules/log" |
|
"code.gitea.io/gitea/modules/process" |
|
) |
|
|
|
// 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(id) |
|
if err != nil { |
|
return err |
|
} |
|
if repo.IsEmpty { |
|
return nil |
|
} |
|
|
|
status, err := repo_model.GetIndexerStatus(repo, repo_model.RepoIndexerTypeStats) |
|
if err != nil { |
|
return err |
|
} |
|
|
|
gitRepo, err := git.OpenRepositoryCtx(ctx, repo.RepoPath()) |
|
if err != 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) { |
|
log.Debug("Unable to get commit ID for default branch %s in %s ... skipping this repository", repo.DefaultBranch, repo.RepoPath()) |
|
return nil |
|
} |
|
log.Error("Unable to get commit ID for default branch %s in %s. Error: %v", repo.DefaultBranch, repo.RepoPath(), 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 := gitRepo.GetLanguageStats(commitID) |
|
if err != nil { |
|
log.Error("Unable to get language stats for ID %s for default branch %s in %s. Error: %v", commitID, repo.DefaultBranch, repo.RepoPath(), err) |
|
return err |
|
} |
|
err = repo_model.UpdateLanguageStats(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.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 |
|
} |
|
|
|
// Close dummy function |
|
func (db *DBIndexer) Close() { |
|
}
|
|
|