| @@ -1861,7 +1861,7 @@ func CreateCloudbrain(cloudbrain *Cloudbrain) (err error) { | |||||
| session.Commit() | session.Commit() | ||||
| go IncreaseDatasetUseCount(cloudbrain.Uuid) | go IncreaseDatasetUseCount(cloudbrain.Uuid) | ||||
| go ResetRepoAITaskNum(cloudbrain.RepoID) | |||||
| go OperateRepoAITaskNum(cloudbrain.RepoID, 1) | |||||
| return nil | return nil | ||||
| } | } | ||||
| @@ -2030,7 +2030,7 @@ func updateAITaskNumWhenDeleteJob(job *Cloudbrain) { | |||||
| } | } | ||||
| if repoId > 0 { | 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 IncreaseDatasetUseCount(new.Uuid) | ||||
| go ResetRepoAITaskNum(new.RepoID) | |||||
| return nil | return nil | ||||
| } | } | ||||
| func CloudbrainAll(opts *CloudbrainsOptions) ([]*CloudbrainInfo, int64, error) { | func CloudbrainAll(opts *CloudbrainsOptions) ([]*CloudbrainInfo, int64, error) { | ||||
| @@ -244,23 +244,25 @@ type Repository struct { | |||||
| // Repository4Card format for front display | // Repository4Card format for front display | ||||
| type Repository4Card struct { | 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 { | type RepositoryShow struct { | ||||
| @@ -293,6 +295,14 @@ func (repo *Repository) ToCardFormat() *Repository4Card { | |||||
| return result | 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 | // SanitizedOriginalURL returns a sanitized OriginalURL | ||||
| func (repo *Repository) SanitizedOriginalURL() string { | func (repo *Repository) SanitizedOriginalURL() string { | ||||
| if repo.OriginalURL == "" { | if repo.OriginalURL == "" { | ||||
| @@ -2930,3 +2940,36 @@ func ResetRepoModelNum(repoId int64) error { | |||||
| _, err = x.Cols("model_cnt").Where("id = ?", repoId).Update(&r) | _, err = x.Cols("model_cnt").Where("id = ?", repoId).Update(&r) | ||||
| return err | 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 | //repo square config | ||||
| IncubationSourceOrgId int64 | IncubationSourceOrgId int64 | ||||
| PaperSourceOwnerId int64 | |||||
| //nginx proxy | //nginx proxy | ||||
| PROXYURL string | PROXYURL string | ||||
| @@ -1563,7 +1562,6 @@ func NewContext() { | |||||
| sec = Cfg.Section("repo-square") | sec = Cfg.Section("repo-square") | ||||
| IncubationSourceOrgId = sec.Key("INCUBATION_ORG_ID").MustInt64(9) | IncubationSourceOrgId = sec.Key("INCUBATION_ORG_ID").MustInt64(9) | ||||
| PaperSourceOwnerId = sec.Key("PAPER_OWNER_ID").MustInt64(36008) | |||||
| sec = Cfg.Section("point") | sec = Cfg.Section("point") | ||||
| CloudBrainPaySwitch = sec.Key("CLOUDBRAIN_PAY_SWITCH").MustBool(false) | CloudBrainPaySwitch = sec.Key("CLOUDBRAIN_PAY_SWITCH").MustBool(false) | ||||
| @@ -122,7 +122,7 @@ func saveModelByParameters(jobId string, versionName string, name string, versio | |||||
| return "", err | return "", err | ||||
| } | } | ||||
| if modelSize > 0 { | if modelSize > 0 { | ||||
| go repository.ResetRepoModelNum(aiTask.RepoID) | |||||
| go repository.IncreaseRepoModelNum(aiTask.RepoID) | |||||
| } | } | ||||
| if len(lastNewModelId) > 0 { | if len(lastNewModelId) > 0 { | ||||
| //udpate status and version count | //udpate status and version count | ||||
| @@ -330,7 +330,7 @@ func UpdateModelSize(modeluuid string) { | |||||
| } | } | ||||
| } | } | ||||
| if model.Size == 0 && size > 0 { | if model.Size == 0 && size > 0 { | ||||
| repository.ResetRepoModelNum(model.RepoId) | |||||
| go repository.IncreaseRepoModelNum(model.RepoId) | |||||
| } | } | ||||
| } else { | } else { | ||||
| log.Info("not found model,uuid=" + modeluuid) | log.Info("not found model,uuid=" + modeluuid) | ||||
| @@ -491,7 +491,7 @@ func DeleteModelFile(ctx *context.Context) { | |||||
| } | } | ||||
| } | } | ||||
| if (model.Size - totalSize) <= 0 { | if (model.Size - totalSize) <= 0 { | ||||
| repository.ResetRepoModelNum(model.RepoId) | |||||
| go repository.DecreaseRepoModelNum(model.RepoId) | |||||
| } | } | ||||
| } | } | ||||
| ctx.JSON(200, map[string]string{ | ctx.JSON(200, map[string]string{ | ||||
| @@ -562,7 +562,7 @@ func deleteModelByID(ctx *context.Context, id string) error { | |||||
| } | } | ||||
| } | } | ||||
| if model.Size > 0 { | 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)) | ctx.Error(500, fmt.Sprintf("DeleteAttachment: %v", err)) | ||||
| return | return | ||||
| } | } | ||||
| go repo_service.ResetRepoDatasetNumByDatasetId(attach.DatasetID) | |||||
| go repo_service.DecreaseRepoDatasetNum(attach.DatasetID) | |||||
| attachjson, _ := json.Marshal(attach) | attachjson, _ := json.Marshal(attach) | ||||
| labelmsg.SendDeleteAttachToLabelSys(string(attachjson)) | labelmsg.SendDeleteAttachToLabelSys(string(attachjson)) | ||||
| @@ -896,7 +896,7 @@ func CompleteMultipart(ctx *context.Context) { | |||||
| return | return | ||||
| } | } | ||||
| attachment.UpdateDatasetUpdateUnix() | attachment.UpdateDatasetUpdateUnix() | ||||
| go repo_service.ResetRepoDatasetNumByDatasetId(dataset.ID) | |||||
| go repo_service.IncreaseRepoDatasetNum(dataset.ID) | |||||
| repository, _ := models.GetRepositoryByID(dataset.RepoID) | repository, _ := models.GetRepositoryByID(dataset.RepoID) | ||||
| notification.NotifyOtherTask(ctx.User, repository, fmt.Sprint(repository.IsPrivate, attachment.IsPrivate), attachment.Name, models.ActionUploadAttachment) | notification.NotifyOtherTask(ctx.User, repository, fmt.Sprint(repository.IsPrivate, attachment.IsPrivate), attachment.Name, models.ActionUploadAttachment) | ||||
| if attachment.DatasetID != 0 { | 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 ( | import ( | ||||
| "code.gitea.io/gitea/models" | "code.gitea.io/gitea/models" | ||||
| "code.gitea.io/gitea/modules/git" | |||||
| "code.gitea.io/gitea/modules/log" | "code.gitea.io/gitea/modules/log" | ||||
| "code.gitea.io/gitea/modules/notification" | "code.gitea.io/gitea/modules/notification" | ||||
| repo_module "code.gitea.io/gitea/modules/repository" | repo_module "code.gitea.io/gitea/modules/repository" | ||||
| @@ -16,6 +17,7 @@ import ( | |||||
| "net/http" | "net/http" | ||||
| "os" | "os" | ||||
| "strings" | "strings" | ||||
| "xorm.io/xorm" | |||||
| ) | ) | ||||
| const SHELL_FLAG_ON = 1 | const SHELL_FLAG_ON = 1 | ||||
| @@ -332,18 +334,42 @@ func IsUploadFileInvalidErr(err error) bool { | |||||
| return ok | return ok | ||||
| } | } | ||||
| func ResetRepoDatasetNumByDatasetId(datasetID int64) error { | |||||
| func IncreaseRepoDatasetNum(datasetID int64, engines ...*xorm.Engine) error { | |||||
| dataset, err := models.GetDatasetByID(datasetID) | dataset, err := models.GetDatasetByID(datasetID) | ||||
| if err != nil { | if err != nil { | ||||
| return err | 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)) | result := make([]*models.Repository4Card, len(repos)) | ||||
| for i, r := range 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{ | return &models.FindReposResponse{ | ||||