go-common/app/tool/saga/service/mr.go
2019-04-22 18:49:16 +08:00

156 lines
4.3 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package service
import (
"context"
"fmt"
"go-common/app/tool/saga/model"
"go-common/library/log"
)
// MergeRequest ...
func (s *Service) MergeRequest(c context.Context, event *model.HookMR) (err error) {
var (
ok bool
repo *model.Repo
url = event.Project.GitSSHURL
projID = event.Project.ID
mrIID = int(event.ObjectAttributes.IID)
sourceBranch = event.ObjectAttributes.SourceBranch
targetBranch = event.ObjectAttributes.TargetBranch
wip = event.ObjectAttributes.WorkInProgress
)
log.Info("Hook MergeRequest state: %s, projID: %d, mrid: %d", event.ObjectAttributes.State, projID, mrIID)
if ok, repo = s.findRepo(url); !ok {
return
}
if event.ObjectAttributes.State == model.MRStateOpened {
if wip {
log.Info("MergeRequest mr is wip, project ID: [%d], branch: [%s]", event.Project.ID, sourceBranch)
return
}
if !s.validTargetBranch(targetBranch, repo) {
s.gitlab.CreateMRNote(projID, mrIID, fmt.Sprintf("<pre>警告:目标分支 %s 不在SAGA白名单中此MR不会触发SAGA行为</pre>", targetBranch))
return
}
authBranch := s.cmd.GetAuthBranch(targetBranch, repo.Config.AuthBranches)
if err = s.ShowMRRoleInfo(c, authBranch, repo, event); err != nil {
return
}
} else {
if event.ObjectAttributes.State == model.MRStateMerged {
log.Info("MergeRequest.UpdateContributor:%d,%s,%s,%+v", projID, sourceBranch, targetBranch, repo.Config.AuthBranches)
if err = s.cmd.UpdateContributor(projID, mrIID, sourceBranch, targetBranch, repo.Config.AuthBranches); err != nil {
return
}
}
if err = s.d.DeleteReportStatus(c, projID, mrIID); err != nil {
return
}
}
return
}
// ShowMRRoleInfo ...
func (s *Service) ShowMRRoleInfo(c context.Context, authBranch string, repo *model.Repo, event *model.HookMR) (err error) {
var (
projID = event.Project.ID
mrIID = int(event.ObjectAttributes.IID)
result bool
)
if result, err = s.d.ReportStatus(c, projID, mrIID); err != nil {
return
}
log.Info("MergeRequest whether create note auth info: %v", result)
if !result {
if len(repo.Config.SuperAuthUsers) > 0 {
if err = s.ReportSuperRoleInfo(c, repo.Config.SuperAuthUsers, event); err != nil {
return
}
} else {
if err = s.ReportMRRoleInfo(c, authBranch, event); err != nil {
return
}
}
if err = s.d.SetReportStatus(c, projID, mrIID, true); err != nil {
return
}
}
return
}
// ReportMRRoleInfo ...
func (s *Service) ReportMRRoleInfo(c context.Context, authBranch string, event *model.HookMR) (err error) {
var (
projID = event.Project.ID
mrIID = int(event.ObjectAttributes.IID)
pathOwners []model.RequireReviewFolder
)
if pathOwners, err = s.cmd.GetAllPathAuth(projID, mrIID, authBranch); err != nil {
return
}
authInfo := ""
authInfo = fmt.Sprintf("<pre>SAGA权限信息提示请review: %s</pre>", event.ObjectAttributes.Title)
authInfo += "\n"
for _, os := range pathOwners {
if len(os.Owners) > 0 {
//authInfo += "----- PATH: " + os.Folder + "OWNER: "
authInfo += fmt.Sprintf("+ PATH: %sOWNER: ", os.Folder)
for _, o := range os.Owners {
if o == "all" {
authInfo += "所有人" + " 或 "
} else {
authInfo += "@" + o + " 或 "
}
}
authInfo = authInfo[:len(authInfo)-len(" 或 ")]
}
if len(os.Reviewers) > 0 {
authInfo += "REVIEWER: "
for _, o := range os.Reviewers {
if o == "all" {
authInfo += "所有人" + " 与 "
} else {
authInfo += "@" + o + " 与 "
}
}
authInfo = authInfo[:len(authInfo)-len(" 与 ")]
}
authInfo += "\n\n"
}
if _, err = s.gitlab.CreateMRNote(projID, mrIID, authInfo); err != nil {
return
}
return
}
// ReportSuperRoleInfo ...
func (s *Service) ReportSuperRoleInfo(c context.Context, superUsers []string, event *model.HookMR) (err error) {
var (
projID = event.Project.ID
mrIID = int(event.ObjectAttributes.IID)
)
authInfo := fmt.Sprintf("<pre>SAGA权限信息提示已配置超级权限用户请review: %s</pre>", event.ObjectAttributes.Title)
authInfo += "\n"
authInfo += fmt.Sprintf("+ SUPERMAN: ")
for _, user := range superUsers {
authInfo += "@" + user + " 或 "
}
authInfo = authInfo[:len(authInfo)-len(" 或 ")]
if _, err = s.gitlab.CreateMRNote(projID, mrIID, authInfo); err != nil {
return
}
return
}