@@ -1861,7 +1861,7 @@ func CreateCloudbrain(cloudbrain *Cloudbrain) (err error) { | |||
session.Commit() | |||
go IncreaseDatasetUseCount(cloudbrain.Uuid) | |||
go ResetRepoAITaskNum(cloudbrain.RepoID) | |||
go OperateRepoAITaskNum(cloudbrain.RepoID, 1) | |||
return nil | |||
} | |||
@@ -2030,7 +2030,7 @@ func updateAITaskNumWhenDeleteJob(job *Cloudbrain) { | |||
} | |||
if repoId > 0 { | |||
ResetRepoAITaskNum(repoId) | |||
go OperateRepoAITaskNum(repoId, -1) | |||
} | |||
} | |||
@@ -2159,7 +2159,6 @@ func RestartCloudbrain(old *Cloudbrain, new *Cloudbrain) (err error) { | |||
} | |||
go IncreaseDatasetUseCount(new.Uuid) | |||
go ResetRepoAITaskNum(new.RepoID) | |||
return nil | |||
} | |||
func CloudbrainAll(opts *CloudbrainsOptions) ([]*CloudbrainInfo, int64, error) { | |||
@@ -244,23 +244,25 @@ type Repository struct { | |||
// Repository4Card format for front display | |||
type Repository4Card struct { | |||
ID int64 | |||
OwnerID int64 | |||
OwnerName string | |||
LowerName string | |||
Name string | |||
NumWatches int | |||
NumStars int | |||
NumForks int | |||
Description string | |||
Topics []string | |||
AiTaskCnt int64 | |||
ModelCnt int64 | |||
DatasetCnt int64 | |||
CreatedUnix timeutil.TimeStamp | |||
UpdatedUnix timeutil.TimeStamp | |||
PrimaryLanguage *LanguageStat | |||
RelAvatarLink string | |||
ID int64 | |||
OwnerID int64 | |||
OwnerName string | |||
LowerName string | |||
Name string | |||
NumWatches int | |||
NumStars int | |||
NumForks int | |||
Description string | |||
Topics []string | |||
AiTaskCnt int64 | |||
ModelCnt int64 | |||
DatasetCnt int64 | |||
CreatedUnix timeutil.TimeStamp | |||
UpdatedUnix timeutil.TimeStamp | |||
PrimaryLanguage *LanguageStat | |||
RelAvatarLink string | |||
Contributors []*ContributorInfo | |||
TotalContributorCount int | |||
} | |||
type RepositoryShow struct { | |||
@@ -293,6 +295,14 @@ func (repo *Repository) ToCardFormat() *Repository4Card { | |||
return result | |||
} | |||
type ContributorInfo struct { | |||
UserInfo *User // nil for contributor who is not a registered user | |||
RelAvatarLink string | |||
UserName string | |||
Email string | |||
CommitCnt int | |||
} | |||
// SanitizedOriginalURL returns a sanitized OriginalURL | |||
func (repo *Repository) SanitizedOriginalURL() string { | |||
if repo.OriginalURL == "" { | |||
@@ -2930,3 +2940,36 @@ func ResetRepoModelNum(repoId int64) error { | |||
_, err = x.Cols("model_cnt").Where("id = ?", repoId).Update(&r) | |||
return err | |||
} | |||
func operateRepoCol(repoId int64, colName string, amount int64, engines ...*xorm.Engine) error { | |||
var err error | |||
if amount == 0 { | |||
return nil | |||
} | |||
var ee *xorm.Engine | |||
if len(engines) == 0 { | |||
ee = x | |||
} else { | |||
ee = engines[0] | |||
} | |||
if amount > 0 { | |||
_, err = ee.Exec(fmt.Sprintf("update repository set %s = %s + ? where id = ?", colName, colName), amount, repoId) | |||
} else { | |||
_, err = ee.Exec(fmt.Sprintf("update repository set %s = %s - ? where id = ?", colName, colName), -1*amount, repoId) | |||
} | |||
return err | |||
} | |||
func OperateRepoDatasetNum(repoId int64, amount int64, engines ...*xorm.Engine) error { | |||
return operateRepoCol(repoId, "dataset_cnt", amount, engines...) | |||
} | |||
func OperateRepoModelNum(repoId int64, amount int64, engines ...*xorm.Engine) error { | |||
return operateRepoCol(repoId, "model_cnt", amount, engines...) | |||
} | |||
func OperateRepoAITaskNum(repoId int64, amount int64, engines ...*xorm.Engine) error { | |||
return operateRepoCol(repoId, "ai_task_cnt", amount, engines...) | |||
} |
@@ -666,7 +666,6 @@ var ( | |||
//repo square config | |||
IncubationSourceOrgId int64 | |||
PaperSourceOwnerId int64 | |||
//nginx proxy | |||
PROXYURL string | |||
@@ -1563,7 +1562,6 @@ func NewContext() { | |||
sec = Cfg.Section("repo-square") | |||
IncubationSourceOrgId = sec.Key("INCUBATION_ORG_ID").MustInt64(9) | |||
PaperSourceOwnerId = sec.Key("PAPER_OWNER_ID").MustInt64(36008) | |||
sec = Cfg.Section("point") | |||
CloudBrainPaySwitch = sec.Key("CLOUDBRAIN_PAY_SWITCH").MustBool(false) | |||
@@ -122,7 +122,7 @@ func saveModelByParameters(jobId string, versionName string, name string, versio | |||
return "", err | |||
} | |||
if modelSize > 0 { | |||
go repository.ResetRepoModelNum(aiTask.RepoID) | |||
go repository.IncreaseRepoModelNum(aiTask.RepoID) | |||
} | |||
if len(lastNewModelId) > 0 { | |||
//udpate status and version count | |||
@@ -330,7 +330,7 @@ func UpdateModelSize(modeluuid string) { | |||
} | |||
} | |||
if model.Size == 0 && size > 0 { | |||
repository.ResetRepoModelNum(model.RepoId) | |||
go repository.IncreaseRepoModelNum(model.RepoId) | |||
} | |||
} else { | |||
log.Info("not found model,uuid=" + modeluuid) | |||
@@ -491,7 +491,7 @@ func DeleteModelFile(ctx *context.Context) { | |||
} | |||
} | |||
if (model.Size - totalSize) <= 0 { | |||
repository.ResetRepoModelNum(model.RepoId) | |||
go repository.DecreaseRepoModelNum(model.RepoId) | |||
} | |||
} | |||
ctx.JSON(200, map[string]string{ | |||
@@ -562,7 +562,7 @@ func deleteModelByID(ctx *context.Context, id string) error { | |||
} | |||
} | |||
if model.Size > 0 { | |||
go repository.ResetRepoModelNum(model.RepoId) | |||
go repository.DecreaseRepoModelNum(model.RepoId) | |||
} | |||
} | |||
} | |||
@@ -181,7 +181,7 @@ func DeleteAttachment(ctx *context.Context) { | |||
ctx.Error(500, fmt.Sprintf("DeleteAttachment: %v", err)) | |||
return | |||
} | |||
go repo_service.ResetRepoDatasetNumByDatasetId(attach.DatasetID) | |||
go repo_service.DecreaseRepoDatasetNum(attach.DatasetID) | |||
attachjson, _ := json.Marshal(attach) | |||
labelmsg.SendDeleteAttachToLabelSys(string(attachjson)) | |||
@@ -896,7 +896,7 @@ func CompleteMultipart(ctx *context.Context) { | |||
return | |||
} | |||
attachment.UpdateDatasetUpdateUnix() | |||
go repo_service.ResetRepoDatasetNumByDatasetId(dataset.ID) | |||
go repo_service.IncreaseRepoDatasetNum(dataset.ID) | |||
repository, _ := models.GetRepositoryByID(dataset.RepoID) | |||
notification.NotifyOtherTask(ctx.User, repository, fmt.Sprint(repository.IsPrivate, attachment.IsPrivate), attachment.Name, models.ActionUploadAttachment) | |||
if attachment.DatasetID != 0 { | |||
@@ -0,0 +1,55 @@ | |||
package repository | |||
import ( | |||
"code.gitea.io/gitea/models" | |||
"code.gitea.io/gitea/modules/git" | |||
) | |||
func GetRepoTopNContributors(repo *models.Repository, N int) ([]*models.ContributorInfo, int) { | |||
var contributorInfos []*models.ContributorInfo | |||
branchName := GetDefaultBranchName(repo) | |||
if branchName == "" { | |||
return contributorInfos, 0 | |||
} | |||
contributors, err := git.GetContributors(repo.RepoPath(), branchName) | |||
if err == nil && contributors != nil { | |||
contributorInfoHash := make(map[string]*models.ContributorInfo) | |||
for _, c := range contributors { | |||
if len(contributorInfos) >= N { | |||
break | |||
} | |||
if c.Email == "" { | |||
continue | |||
} | |||
// get user info from committer email | |||
user, err := models.GetUserByActivateEmail(c.Email) | |||
if err == nil { | |||
// committer is system user, get info through user's primary email | |||
if existedContributorInfo, ok := contributorInfoHash[user.Email]; ok { | |||
// existed: same primary email, different committer name | |||
existedContributorInfo.CommitCnt += c.CommitCnt | |||
} else { | |||
// new committer info | |||
var newContributor = &models.ContributorInfo{ | |||
user, user.RelAvatarLink(), user.Name, user.Email, c.CommitCnt, | |||
} | |||
contributorInfos = append(contributorInfos, newContributor) | |||
contributorInfoHash[user.Email] = newContributor | |||
} | |||
} else { | |||
// committer is not system user | |||
if existedContributorInfo, ok := contributorInfoHash[c.Email]; ok { | |||
// existed: same primary email, different committer name | |||
existedContributorInfo.CommitCnt += c.CommitCnt | |||
} else { | |||
var newContributor = &models.ContributorInfo{ | |||
user, "", "", c.Email, c.CommitCnt, | |||
} | |||
contributorInfos = append(contributorInfos, newContributor) | |||
contributorInfoHash[c.Email] = newContributor | |||
} | |||
} | |||
} | |||
} | |||
return contributorInfos, len(contributors) | |||
} |
@@ -6,6 +6,7 @@ package repository | |||
import ( | |||
"code.gitea.io/gitea/models" | |||
"code.gitea.io/gitea/modules/git" | |||
"code.gitea.io/gitea/modules/log" | |||
"code.gitea.io/gitea/modules/notification" | |||
repo_module "code.gitea.io/gitea/modules/repository" | |||
@@ -16,6 +17,7 @@ import ( | |||
"net/http" | |||
"os" | |||
"strings" | |||
"xorm.io/xorm" | |||
) | |||
const SHELL_FLAG_ON = 1 | |||
@@ -332,18 +334,42 @@ func IsUploadFileInvalidErr(err error) bool { | |||
return ok | |||
} | |||
func ResetRepoDatasetNumByDatasetId(datasetID int64) error { | |||
func IncreaseRepoDatasetNum(datasetID int64, engines ...*xorm.Engine) error { | |||
dataset, err := models.GetDatasetByID(datasetID) | |||
if err != nil { | |||
return err | |||
} | |||
return models.ResetRepoDatasetNum(dataset.RepoID) | |||
return models.OperateRepoDatasetNum(dataset.RepoID, 1, engines...) | |||
} | |||
func ResetRepoModelNum(repoId int64) error { | |||
return models.ResetRepoModelNum(repoId) | |||
func IncreaseRepoModelNum(repoId int64, engines ...*xorm.Engine) error { | |||
return models.OperateRepoModelNum(repoId, 1, engines...) | |||
} | |||
func ResetRepoAITaskNum(repoId int64) error { | |||
return models.ResetRepoAITaskNum(repoId) | |||
func DecreaseRepoDatasetNum(datasetID int64, engines ...*xorm.Engine) error { | |||
dataset, err := models.GetDatasetByID(datasetID) | |||
if err != nil { | |||
return err | |||
} | |||
return models.OperateRepoDatasetNum(dataset.RepoID, -1, engines...) | |||
} | |||
func DecreaseRepoModelNum(repoId int64, engines ...*xorm.Engine) error { | |||
return models.OperateRepoModelNum(repoId, -1, engines...) | |||
} | |||
func GetDefaultBranchName(repo *models.Repository) string { | |||
gitRepo, err := git.OpenRepository(repo.RepoPath()) | |||
if err != nil { | |||
return "" | |||
} | |||
defer gitRepo.Close() | |||
if len(repo.DefaultBranch) > 0 && gitRepo.IsBranchExist(repo.DefaultBranch) { | |||
return repo.DefaultBranch | |||
} | |||
brs, _, err := gitRepo.GetBranches(0, 0) | |||
if len(brs) > 0 { | |||
return brs[0] | |||
} | |||
return "" | |||
} |
@@ -134,7 +134,11 @@ func FindRepos(opts FindReposOptions) (*models.FindReposResponse, error) { | |||
} | |||
result := make([]*models.Repository4Card, len(repos)) | |||
for i, r := range repos { | |||
result[i] = r.ToCardFormat() | |||
t := r.ToCardFormat() | |||
contributors, n := GetRepoTopNContributors(r, 6) | |||
t.Contributors = contributors | |||
t.TotalContributorCount = n | |||
result[i] = t | |||
} | |||
return &models.FindReposResponse{ | |||