summaryrefslogtreecommitdiffstats
path: root/models/repo_language_stats.go
diff options
context:
space:
mode:
authorLunny Xiao <xiaolunwen@gmail.com>2021-12-10 09:27:50 +0800
committerGitHub <noreply@github.com>2021-12-10 09:27:50 +0800
commit719bddcd76610a63dadc8555760072957a11cf30 (patch)
tree0df26092fba7e3e21444fe493e6b349473b6b0cb /models/repo_language_stats.go
parentfb8166c6c6b652a0e6fa98681780a6a71090faf3 (diff)
downloadgitea-719bddcd76610a63dadc8555760072957a11cf30.tar.gz
gitea-719bddcd76610a63dadc8555760072957a11cf30.zip
Move repository model into models/repo (#17933)
* Some refactors related repository model * Move more methods out of repository * Move repository into models/repo * Fix test * Fix test * some improvements * Remove unnecessary function
Diffstat (limited to 'models/repo_language_stats.go')
-rw-r--r--models/repo_language_stats.go214
1 files changed, 0 insertions, 214 deletions
diff --git a/models/repo_language_stats.go b/models/repo_language_stats.go
deleted file mode 100644
index 79de42ce0c..0000000000
--- a/models/repo_language_stats.go
+++ /dev/null
@@ -1,214 +0,0 @@
-// 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 models
-
-import (
- "math"
- "strings"
-
- "code.gitea.io/gitea/models/db"
- "code.gitea.io/gitea/modules/timeutil"
-
- "github.com/go-enry/go-enry/v2"
-)
-
-// LanguageStat describes language statistics of a repository
-type LanguageStat struct {
- ID int64 `xorm:"pk autoincr"`
- RepoID int64 `xorm:"UNIQUE(s) INDEX NOT NULL"`
- CommitID string
- IsPrimary bool
- Language string `xorm:"VARCHAR(50) UNIQUE(s) INDEX NOT NULL"`
- Percentage float32 `xorm:"-"`
- Size int64 `xorm:"NOT NULL DEFAULT 0"`
- Color string `xorm:"-"`
- CreatedUnix timeutil.TimeStamp `xorm:"INDEX CREATED"`
-}
-
-func init() {
- db.RegisterModel(new(LanguageStat))
-}
-
-// LanguageStatList defines a list of language statistics
-type LanguageStatList []*LanguageStat
-
-func (stats LanguageStatList) loadAttributes() {
- for i := range stats {
- stats[i].Color = enry.GetColor(stats[i].Language)
- }
-}
-
-func (stats LanguageStatList) getLanguagePercentages() map[string]float32 {
- langPerc := make(map[string]float32)
- var otherPerc float32 = 100
- var total int64
-
- for _, stat := range stats {
- total += stat.Size
- }
- if total > 0 {
- for _, stat := range stats {
- perc := float32(math.Round(float64(stat.Size)/float64(total)*1000) / 10)
- if perc <= 0.1 {
- continue
- }
- otherPerc -= perc
- langPerc[stat.Language] = perc
- }
- otherPerc = float32(math.Round(float64(otherPerc)*10) / 10)
- }
- if otherPerc > 0 {
- langPerc["other"] = otherPerc
- }
- return langPerc
-}
-
-func (repo *Repository) getLanguageStats(e db.Engine) (LanguageStatList, error) {
- stats := make(LanguageStatList, 0, 6)
- if err := e.Where("`repo_id` = ?", repo.ID).Desc("`size`").Find(&stats); err != nil {
- return nil, err
- }
- return stats, nil
-}
-
-// GetLanguageStats returns the language statistics for a repository
-func (repo *Repository) GetLanguageStats() (LanguageStatList, error) {
- return repo.getLanguageStats(db.GetEngine(db.DefaultContext))
-}
-
-// GetTopLanguageStats returns the top language statistics for a repository
-func (repo *Repository) GetTopLanguageStats(limit int) (LanguageStatList, error) {
- stats, err := repo.getLanguageStats(db.GetEngine(db.DefaultContext))
- if err != nil {
- return nil, err
- }
- perc := stats.getLanguagePercentages()
- topstats := make(LanguageStatList, 0, limit)
- var other float32
- for i := range stats {
- if _, ok := perc[stats[i].Language]; !ok {
- continue
- }
- if stats[i].Language == "other" || len(topstats) >= limit {
- other += perc[stats[i].Language]
- continue
- }
- stats[i].Percentage = perc[stats[i].Language]
- topstats = append(topstats, stats[i])
- }
- if other > 0 {
- topstats = append(topstats, &LanguageStat{
- RepoID: repo.ID,
- Language: "other",
- Color: "#cccccc",
- Percentage: float32(math.Round(float64(other)*10) / 10),
- })
- }
- topstats.loadAttributes()
- return topstats, nil
-}
-
-// UpdateLanguageStats updates the language statistics for repository
-func (repo *Repository) UpdateLanguageStats(commitID string, stats map[string]int64) error {
- ctx, committer, err := db.TxContext()
- if err != nil {
- return err
- }
- defer committer.Close()
- sess := db.GetEngine(ctx)
-
- oldstats, err := repo.getLanguageStats(sess)
- if err != nil {
- return err
- }
- var topLang string
- var s int64
- for lang, size := range stats {
- if size > s {
- s = size
- topLang = strings.ToLower(lang)
- }
- }
-
- for lang, size := range stats {
- upd := false
- llang := strings.ToLower(lang)
- for _, s := range oldstats {
- // Update already existing language
- if strings.ToLower(s.Language) == llang {
- s.CommitID = commitID
- s.IsPrimary = llang == topLang
- s.Size = size
- if _, err := sess.ID(s.ID).Cols("`commit_id`", "`size`", "`is_primary`").Update(s); err != nil {
- return err
- }
- upd = true
- break
- }
- }
- // Insert new language
- if !upd {
- if _, err := sess.Insert(&LanguageStat{
- RepoID: repo.ID,
- CommitID: commitID,
- IsPrimary: llang == topLang,
- Language: lang,
- Size: size,
- }); err != nil {
- return err
- }
- }
- }
- // Delete old languages
- statsToDelete := make([]int64, 0, len(oldstats))
- for _, s := range oldstats {
- if s.CommitID != commitID {
- statsToDelete = append(statsToDelete, s.ID)
- }
- }
- if len(statsToDelete) > 0 {
- if _, err := sess.In("`id`", statsToDelete).Delete(&LanguageStat{}); err != nil {
- return err
- }
- }
-
- // Update indexer status
- if err = repo.updateIndexerStatus(sess, RepoIndexerTypeStats, commitID); err != nil {
- return err
- }
-
- return committer.Commit()
-}
-
-// CopyLanguageStat Copy originalRepo language stat information to destRepo (use for forked repo)
-func CopyLanguageStat(originalRepo, destRepo *Repository) error {
- ctx, committer, err := db.TxContext()
- if err != nil {
- return err
- }
- defer committer.Close()
- sess := db.GetEngine(ctx)
-
- RepoLang := make(LanguageStatList, 0, 6)
- if err := sess.Where("`repo_id` = ?", originalRepo.ID).Desc("`size`").Find(&RepoLang); err != nil {
- return err
- }
- if len(RepoLang) > 0 {
- for i := range RepoLang {
- RepoLang[i].ID = 0
- RepoLang[i].RepoID = destRepo.ID
- RepoLang[i].CreatedUnix = timeutil.TimeStampNow()
- }
- // update destRepo's indexer status
- tmpCommitID := RepoLang[0].CommitID
- if err := destRepo.updateIndexerStatus(sess, RepoIndexerTypeStats, tmpCommitID); err != nil {
- return err
- }
- if _, err := sess.Insert(&RepoLang); err != nil {
- return err
- }
- }
- return committer.Commit()
-}