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  }