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  }