You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
234 lines
6.5 KiB
234 lines
6.5 KiB
package service |
|
|
|
import ( |
|
"context" |
|
"encoding/json" |
|
"strconv" |
|
"strings" |
|
"time" |
|
|
|
"go-common/app/admin/ep/saga/model" |
|
"go-common/app/admin/ep/saga/service/utils" |
|
"go-common/library/log" |
|
|
|
"github.com/xanzy/go-gitlab" |
|
) |
|
|
|
// QueryProjectCommit query project commit info according to project id. |
|
func (s *Service) QueryProjectCommit(c context.Context, req *model.ProjectDataReq) (resp *model.ProjectDataResp, err error) { |
|
|
|
if resp, err = s.QueryProject(c, "commit", req); err != nil { |
|
return |
|
} |
|
return |
|
} |
|
|
|
// QueryTeamCommit query team commit info according to department and business |
|
func (s *Service) QueryTeamCommit(c context.Context, req *model.TeamDataRequest) (resp *model.TeamDataResp, err error) { |
|
|
|
if resp, err = s.QueryTeam(c, "commit", req); err != nil { |
|
return |
|
} |
|
return |
|
} |
|
|
|
// QueryCommit query commit info according to department、 business and time. |
|
func (s *Service) QueryCommit(c context.Context, req *model.CommitRequest) (resp *model.CommitResp, err error) { |
|
var ( |
|
layout = "2006-01-02" |
|
projectInfo []*model.ProjectInfo |
|
reqProject = &model.ProjectInfoRequest{} |
|
ProjectCommit []*model.ProjectCommit |
|
respCommit *gitlab.Response |
|
since time.Time |
|
until time.Time |
|
commitNum int |
|
) |
|
|
|
if len(req.Department) <= 0 && len(req.Business) <= 0 { |
|
log.Warn("query department and business are empty!") |
|
return |
|
} |
|
|
|
reqProject.Department = req.Department |
|
reqProject.Business = req.Business |
|
reqProject.Username = req.Username |
|
if _, projectInfo, err = s.dao.QueryProjectInfo(false, reqProject); err != nil { |
|
return |
|
} |
|
|
|
if len(projectInfo) <= 0 { |
|
log.Warn("Found no project!") |
|
return |
|
} |
|
|
|
//since, err = time.Parse("2006-01-02 15:04:05", "2018-08-13 00:00:00") |
|
if since, err = time.ParseInLocation(layout, req.Since, time.Local); err != nil { |
|
return |
|
} |
|
if until, err = time.ParseInLocation(layout, req.Until, time.Local); err != nil { |
|
return |
|
} |
|
|
|
log.Info("query commit start!") |
|
for _, project := range projectInfo { |
|
|
|
if _, respCommit, err = s.gitlab.ListProjectCommit(project.ProjectID, 1, &since, &until); err != nil { |
|
return |
|
} |
|
//log.Info("query: %s, result: %+v", project.Name, respCommit) |
|
|
|
CommitPer := &model.ProjectCommit{ |
|
ProjectID: project.ProjectID, |
|
Name: project.Name, |
|
CommitNum: respCommit.TotalItems, |
|
} |
|
ProjectCommit = append(ProjectCommit, CommitPer) |
|
commitNum = commitNum + respCommit.TotalItems |
|
} |
|
log.Info("query commit end!") |
|
|
|
resp = &model.CommitResp{ |
|
Total: commitNum, |
|
ProjectCommit: ProjectCommit, |
|
} |
|
return |
|
} |
|
|
|
/*-------------------------------------- sync commit ----------------------------------------*/ |
|
|
|
// SyncProjectCommit ... |
|
func (s *Service) SyncProjectCommit(projectID int) (result *model.SyncResult, err error) { |
|
var ( |
|
//syncAllTime = conf.Conf.Property.SyncData.SyncAllTime |
|
syncAllTime = false |
|
commits []*gitlab.Commit |
|
resp *gitlab.Response |
|
since *time.Time |
|
until *time.Time |
|
projectInfo *model.ProjectInfo |
|
) |
|
result = &model.SyncResult{} |
|
|
|
if projectInfo, err = s.dao.ProjectInfoByID(projectID); err != nil { |
|
return |
|
} |
|
|
|
if !syncAllTime { |
|
since, until = utils.CalSyncTime() |
|
} |
|
log.Info("sync project(%d) commit time since: %v, until: %v", projectID, since, until) |
|
|
|
for page := 1; ; page++ { |
|
result.TotalPage++ |
|
if commits, resp, err = s.gitlab.ListProjectCommit(projectID, page, since, until); err != nil { |
|
return |
|
} |
|
|
|
for _, commit := range commits { |
|
var ( |
|
statsAdditions int |
|
statsDeletions int |
|
parentIDs string |
|
commitStatus string |
|
) |
|
|
|
if commit.Stats != nil { |
|
statsAdditions = commit.Stats.Additions |
|
statsDeletions = commit.Stats.Deletions |
|
} |
|
if commit.Status != nil { |
|
commitStatusByte, _ := json.Marshal(commit.Status) |
|
commitStatus = string(commitStatusByte) |
|
} |
|
parentIDsByte, _ := json.Marshal(commit.ParentIDs) |
|
parentIDs = string(parentIDsByte) |
|
|
|
commitDB := &model.StatisticsCommits{ |
|
CommitID: commit.ID, |
|
ProjectID: projectID, |
|
ProjectName: projectInfo.Name, |
|
ShortID: commit.ShortID, |
|
Title: commit.Title, |
|
AuthorName: commit.AuthorName, |
|
AuthoredDate: commit.AuthoredDate, |
|
CommitterName: commit.CommitterName, |
|
CommittedDate: commit.CommittedDate, |
|
CreatedAt: commit.CreatedAt, |
|
Message: commit.Message, |
|
ParentIDs: parentIDs, |
|
StatsAdditions: statsAdditions, |
|
StatsDeletions: statsDeletions, |
|
Status: commitStatus, |
|
} |
|
if len(commitDB.Message) > model.MessageMaxLen { |
|
commitDB.Message = commitDB.Message[0 : model.MessageMaxLen-1] |
|
} |
|
|
|
if err = s.SaveDatabaseCommit(commitDB); err != nil { |
|
log.Error("Commit Save Database err: projectID(%d), commitID(%s)", projectID, commit.ID) |
|
err = nil |
|
|
|
errData := &model.FailData{ |
|
ChildIDStr: commit.ID, |
|
} |
|
result.FailData = append(result.FailData, errData) |
|
|
|
continue |
|
} |
|
result.TotalNum++ |
|
} |
|
|
|
if resp.NextPage == 0 { |
|
break |
|
} |
|
} |
|
return |
|
} |
|
|
|
// SaveDatabaseCommit ... |
|
func (s *Service) SaveDatabaseCommit(commitDB *model.StatisticsCommits) (err error) { |
|
var total int |
|
|
|
if total, err = s.dao.HasCommit(commitDB.ProjectID, commitDB.CommitID); err != nil { |
|
log.Error("SaveDatabaseCommit HasCommit(%+v)", err) |
|
return |
|
} |
|
|
|
// found only one, so update |
|
if total == 1 { |
|
if err = s.dao.UpdateCommit(commitDB.ProjectID, commitDB.CommitID, commitDB); err != nil { |
|
if strings.Contains(err.Error(), model.DatabaseErrorText) { |
|
commitDB.Title = strconv.QuoteToASCII(commitDB.Title) |
|
commitDB.Message = strconv.QuoteToASCII(commitDB.Message) |
|
commitDB.Title = utils.Unicode2Chinese(commitDB.Title) |
|
commitDB.Message = utils.Unicode2Chinese(commitDB.Message) |
|
} |
|
if err = s.dao.UpdateCommit(commitDB.ProjectID, commitDB.CommitID, commitDB); err != nil { |
|
log.Error("SaveDatabaseCommit UpdateCommit err(%+v)", err) |
|
return |
|
} |
|
} |
|
return |
|
} else if total > 1 { |
|
// found repeated row, this situation will not exist under normal |
|
log.Warn("SaveDatabaseCommit commit has more rows(%d)", total) |
|
return |
|
} |
|
|
|
// insert row now |
|
if err = s.dao.CreateCommit(commitDB); err != nil { |
|
if strings.Contains(err.Error(), model.DatabaseErrorText) { |
|
commitDB.Title = strconv.QuoteToASCII(commitDB.Title) |
|
commitDB.Message = strconv.QuoteToASCII(commitDB.Message) |
|
commitDB.Title = utils.Unicode2Chinese(commitDB.Title) |
|
commitDB.Message = utils.Unicode2Chinese(commitDB.Message) |
|
} |
|
if err = s.dao.CreateCommit(commitDB); err != nil { |
|
log.Error("SaveDatabaseCommit CreateCommit err(%+v)", err) |
|
return |
|
} |
|
} |
|
|
|
return |
|
}
|
|
|