13 Star 25 Fork 28

openEuler / ci-bot

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
label.go 21.05 KB
一键复制 编辑 原始数据 按行查看 历史
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676
package cibot
import (
"fmt"
"math/rand"
"strings"
"time"
"github.com/antihax/optional"
"gitee.com/openeuler/go-gitee/gitee"
"github.com/golang/glog"
)
// GetLabelsMap for add or remove labels
func GetLabelsMap(comment string) map[string]string {
// init labels map
mapOfLabels := map[string]string{}
// split with blank space
substrings := strings.Split(strings.TrimSpace(comment), " ")
// init label group
labelGroup := ""
// range over the substrings to get the map of labels
for i, l := range substrings {
if i == 0 {
// first index is the operation to be performed, rest will be the labels
// the label group. e.g kind, priority
labelGroup = strings.Replace(strings.Replace(l, "/", "", 1), "remove-", "", 1)
} else {
// the whole label = label group + / + label. e.g kind/feature
wholeLabel := labelGroup + "/" + l
// use map to avoid the reduplicate label
mapOfLabels[wholeLabel] = wholeLabel
}
}
return mapOfLabels
}
//GetChangeLabels return the exact list of delete and update labels
func GetChangeLabels(confDelLabels []string, prLabels []gitee.Label) (delLabels, updateLabels []string) {
for _, pl := range prLabels {
isUpdate := true
for _, cdl := range confDelLabels {
//handle lgtm label
if cdl == LabelNameLgtm {
if strings.HasPrefix(pl.Name, fmt.Sprintf(LabelLgtmWithCommenter, "")) || pl.Name == LabelNameLgtm {
delLabels = append(delLabels, pl.Name)
isUpdate = false
}
continue
}
if cdl == "openeuler-cla" {
if strings.HasPrefix(pl.Name, cdl) {
delLabels = append(delLabels, pl.Name)
isUpdate = false
}
continue
}
if cdl == "sig" {
if strings.HasPrefix(pl.Name, cdl) {
delLabels = append(delLabels, pl.Name)
isUpdate = false
}
continue
}
if cdl == "kind" {
if strings.HasPrefix(pl.Name, cdl) {
delLabels = append(delLabels, pl.Name)
isUpdate = false
}
continue
}
if cdl == pl.Name {
delLabels = append(delLabels, pl.Name)
isUpdate = false
continue
}
}
if isUpdate {
updateLabels = append(updateLabels, pl.Name)
}
}
return
}
// GetListOfAddLabels return the exact list of add labels
func GetListOfAddLabels(mapOfAddLabels map[string]string, listofRepoLabels []gitee.Label, listofItemLabels []gitee.Label) []string {
// init
listOfAddLabels := make([]string, 0)
// range over the map to filter the list of labels
for l := range mapOfAddLabels {
// check if the label is existing in current gitee repository
existingInRepo := false
for _, repoLabel := range listofRepoLabels {
if l == repoLabel.Name {
existingInRepo = true
break
}
}
// the label is not existing in current gitee repository so it can not add this label
if !existingInRepo {
glog.Infof("label %s is not existing in repository", l)
continue
}
// check if the label is existing in current item
existingInItem := false
for _, itemLabel := range listofItemLabels {
if l == itemLabel.Name {
existingInItem = true
break
}
}
// the label is already existing in current item so it is no need to add this label
if existingInItem {
glog.Infof("label %s is already existing in current item", l)
continue
}
// append
listOfAddLabels = append(listOfAddLabels, l)
}
return listOfAddLabels
}
// GetListOfRemoveLabels return the exact list of remove labels
func GetListOfRemoveLabels(mapOfRemoveLabels map[string]string, listofItemLabels []gitee.Label) []string {
// init
listOfRemoveLabels := make([]string, 0)
// range over the map to filter the list of labels
for l := range mapOfRemoveLabels {
// check if the label is existing in current item
existingInItem := false
for _, itemLabel := range listofItemLabels {
if l == itemLabel.Name {
existingInItem = true
break
}
}
// the label is not existing in current item so it is no need to remove this label
if !existingInItem {
glog.Infof("label %s is not existing in current item", l)
continue
}
// append
listOfRemoveLabels = append(listOfRemoveLabels, l)
}
return listOfRemoveLabels
}
// AddLabel adds label
func (s *Server) AddLabel(event *gitee.NoteEvent) error {
if *event.NoteableType == "PullRequest" {
// PullRequest
return s.AddLabelInPulRequest(event)
} else if *event.NoteableType == "Issue" {
// Issue
return s.AddLabelInIssue(event)
} else {
return nil
}
}
// AddLabelInPulRequest adds label in pull request
func (s *Server) AddLabelInPulRequest(event *gitee.NoteEvent) error {
// get basic informations
comment := event.Comment.Body
owner := event.Repository.Namespace
repo := event.Repository.Path
var number int32
if event.PullRequest != nil {
number = event.PullRequest.Number
}
glog.Infof("add label started. comment: %s owner: %s repo: %s number: %d",
comment, owner, repo, number)
// /kind label1
// /kind label2
getLabels := strings.Split(comment, "\r\n")
for _, labelToAdd := range getLabels {
// map of add labels
mapOfAddLabels := GetLabelsMap(labelToAdd)
glog.Infof("map of add labels: %v", mapOfAddLabels)
// list labels in current gitee repository
lvosRepo := &gitee.GetV5ReposOwnerRepoLabelsOpts{}
lvosRepo.AccessToken = optional.NewString(s.Config.GiteeToken)
listofRepoLabels, _, err := s.GiteeClient.LabelsApi.GetV5ReposOwnerRepoLabels(s.Context, owner, repo, lvosRepo)
if err != nil {
glog.Errorf("unable to list repository labels. err: %v", err)
return err
}
glog.Infof("list of repository labels: %v", listofRepoLabels)
// list labels in current item
lvos := &gitee.GetV5ReposOwnerRepoPullsNumberOpts{}
lvos.AccessToken = optional.NewString(s.Config.GiteeToken)
pr, _, err := s.GiteeClient.PullRequestsApi.GetV5ReposOwnerRepoPullsNumber(s.Context, owner, repo, number, lvos)
if err != nil {
glog.Errorf("unable to get pull request. err: %v", err)
return err
}
listofItemLabels := pr.Labels
glog.Infof("list of item labels: %v", listofItemLabels)
// list of add labels
listOfAddLabels := GetListOfAddLabels(mapOfAddLabels, listofRepoLabels, listofItemLabels)
glog.Infof("list of add labels: %v", listOfAddLabels)
// invoke gitee api to add labels
if len(listOfAddLabels) > 0 {
// build label string
var strLabel string
for _, currentlabel := range listofItemLabels {
strLabel += currentlabel.Name + ","
}
for _, addedlabel := range listOfAddLabels {
strLabel += addedlabel + ","
}
strLabel = strings.TrimRight(strLabel, ",")
body := gitee.PullRequestUpdateParam{}
body.AccessToken = s.Config.GiteeToken
body.Labels = strLabel
glog.Infof("invoke api to add labels: %v", strLabel)
// patch labels
_, response, err := s.GiteeClient.PullRequestsApi.PatchV5ReposOwnerRepoPullsNumber(s.Context, owner, repo, number, body)
if err != nil {
if response.StatusCode == 400 {
glog.Infof("add labels successfully with status code %d: %v", response.StatusCode, listOfAddLabels)
} else {
glog.Errorf("unable to add labels: %v err: %v", listOfAddLabels, err)
return err
}
} else {
glog.Infof("add labels successfully: %v", listOfAddLabels)
}
} else {
glog.Infof("no label to add for this event")
}
}
return nil
}
func (s *Server) labelDiffer(new []string, existing []gitee.Label) ([]string, []string) {
mb := make(map[string]struct{}, len(existing))
for _, x := range existing {
mb[x.Name] = struct{}{}
}
var diff []string
var same []string
for _, x := range new {
if _, found := mb[x]; !found {
diff = append(diff, x)
} else {
same = append(same, x)
}
}
return diff, same
}
// AddLabelInIssue adds label in issue
func (s *Server) AddLabelInIssue(event *gitee.NoteEvent) error {
// get basic informations
comment := event.Comment.Body
owner := event.Repository.Namespace
repo := event.Repository.Path
var number string
if event.Issue != nil {
number = event.Issue.Number
}
glog.Infof("add label started. comment: %s owner: %s repo: %s number: %s",
comment, owner, repo, number)
// /kind label1
// /kind label2
getLabels := strings.Split(comment, "\r\n")
for _, labelToAdd := range getLabels {
// map of add labels
mapOfAddLabels := GetLabelsMap(labelToAdd)
glog.Infof("map of add labels: %v", mapOfAddLabels)
// list labels in current gitee repository
lvosRepo := &gitee.GetV5ReposOwnerRepoLabelsOpts{}
lvosRepo.AccessToken = optional.NewString(s.Config.GiteeToken)
listofRepoLabels, _, err := s.GiteeClient.LabelsApi.GetV5ReposOwnerRepoLabels(s.Context, owner, repo, lvosRepo)
if err != nil {
glog.Errorf("unable to list repository labels. err: %v", err)
return err
}
glog.Infof("list of repository labels: %v", listofRepoLabels)
// list labels in current item
lvos := &gitee.GetV5ReposOwnerRepoIssuesNumberLabelsOpts{}
lvos.AccessToken = optional.NewString(s.Config.GiteeToken)
listofItemLabels, _, err := s.GiteeClient.LabelsApi.GetV5ReposOwnerRepoIssuesNumberLabels(s.Context, owner, repo, number, lvos)
if err != nil {
glog.Errorf("unable to get labels in issue. err: %v", err)
return err
}
glog.Infof("list of item labels: %v", listofItemLabels)
// list of add labels
listOfAddLabels := GetListOfAddLabels(mapOfAddLabels, listofRepoLabels, listofItemLabels)
glog.Infof("list of add labels: %v", listOfAddLabels)
// invoke gitee api to add labels
if len(listOfAddLabels) > 0 {
// build label string
var strLabel string
for _, currentlabel := range listofItemLabels {
strLabel += currentlabel.Name + ","
}
for _, addedlabel := range listOfAddLabels {
strLabel += addedlabel + ","
}
strLabel = strings.TrimRight(strLabel, ",")
body := gitee.IssueUpdateParam{}
body.Repo = repo
body.AccessToken = s.Config.GiteeToken
body.Labels = strLabel
glog.Infof("invoke api to add labels: %v", strLabel)
// patch labels
_, _, err := s.GiteeClient.IssuesApi.PatchV5ReposOwnerIssuesNumber(s.Context, owner, number, body)
if err != nil {
glog.Errorf("unable to add labels: %v err: %v", listOfAddLabels, err)
return err
} else {
glog.Infof("add labels successfully: %v", listOfAddLabels)
}
} else {
glog.Infof("no label to add for this event")
}
}
return nil
}
// RemoveLabel removes label
func (s *Server) RemoveLabel(event *gitee.NoteEvent) error {
if *event.NoteableType == "PullRequest" {
// PullRequest
return s.RemoveLabelInPullRequest(event)
} else if *event.NoteableType == "Issue" {
// Issue
return s.RemoveLabelInIssue(event)
} else {
return nil
}
}
// RemoveLabelInPullRequest removes label in pull request
func (s *Server) RemoveLabelInPullRequest(event *gitee.NoteEvent) error {
// get basic informations
comment := event.Comment.Body
owner := event.Repository.Namespace
repo := event.Repository.Path
var number int32
if event.PullRequest != nil {
number = event.PullRequest.Number
}
glog.Infof("remove label started. comment: %s owner: %s repo: %s number: %d",
comment, owner, repo, number)
// /remove-kind label1
// /remove-kind label2
getLables := strings.Split(comment, "\r\n")
for _, labelToRemove := range getLables {
// map of add labels
mapOfRemoveLabels := GetLabelsMap(labelToRemove)
glog.Infof("map of remove labels: %v", mapOfRemoveLabels)
// list labels in current item
lvos := &gitee.GetV5ReposOwnerRepoPullsNumberOpts{}
lvos.AccessToken = optional.NewString(s.Config.GiteeToken)
pr, _, err := s.GiteeClient.PullRequestsApi.GetV5ReposOwnerRepoPullsNumber(s.Context, owner, repo, number, lvos)
if err != nil {
glog.Errorf("unable to get pull request. err: %v", err)
return err
}
listofItemLabels := pr.Labels
glog.Infof("list of item labels: %v", listofItemLabels)
// list of remove labels
listOfRemoveLabels := GetListOfRemoveLabels(mapOfRemoveLabels, listofItemLabels)
glog.Infof("list of remove labels: %v", listOfRemoveLabels)
// invoke gitee api to remove labels
if len(listOfRemoveLabels) > 0 {
// build label string
var strLabel string
for _, currentlabel := range listofItemLabels {
strLabel += currentlabel.Name + ","
}
for _, removedlabel := range listOfRemoveLabels {
strLabel = strings.Replace(strLabel, removedlabel+",", "", 1)
}
strLabel = strings.TrimRight(strLabel, ",")
// avoid to unable to remove labels when no label is exsit
if strLabel == "" {
strLabel = ","
}
body := gitee.PullRequestUpdateParam{}
body.AccessToken = s.Config.GiteeToken
body.Labels = strLabel
glog.Infof("invoke api to remove labels: %v", strLabel)
// patch labels
_, response, err := s.GiteeClient.PullRequestsApi.PatchV5ReposOwnerRepoPullsNumber(s.Context, owner, repo, number, body)
if err != nil {
if response.StatusCode == 400 {
glog.Infof("remove labels successfully with status code %d: %v", response.StatusCode, listOfRemoveLabels)
} else {
glog.Errorf("unable to remove labels: %v err: %v", listOfRemoveLabels, err)
return err
}
} else {
glog.Infof("remove labels successfully: %v", listOfRemoveLabels)
}
} else {
glog.Infof("no label to remove for this event")
}
}
return nil
}
// RemoveLabelInIssue removes label in issue
func (s *Server) RemoveLabelInIssue(event *gitee.NoteEvent) error {
// get basic informations
comment := event.Comment.Body
owner := event.Repository.Namespace
repo := event.Repository.Path
var number string
if event.Issue != nil {
number = event.Issue.Number
}
glog.Infof("remove label started. comment: %s owner: %s repo: %s number: %s",
comment, owner, repo, number)
// /remove-kind label1
// /remove-kind label2
getLables := strings.Split(comment, "\r\n")
for _, labelToRemove := range getLables {
// map of add labels
mapOfRemoveLabels := GetLabelsMap(labelToRemove)
glog.Infof("map of remove labels: %v", mapOfRemoveLabels)
// list labels in current item
lvos := &gitee.GetV5ReposOwnerRepoIssuesNumberLabelsOpts{}
lvos.AccessToken = optional.NewString(s.Config.GiteeToken)
listofItemLabels, _, err := s.GiteeClient.LabelsApi.GetV5ReposOwnerRepoIssuesNumberLabels(s.Context, owner, repo, number, lvos)
if err != nil {
glog.Errorf("unable to get labels in issue. err: %v", err)
return err
}
glog.Infof("list of item labels: %v", listofItemLabels)
// list of remove labels
listOfRemoveLabels := GetListOfRemoveLabels(mapOfRemoveLabels, listofItemLabels)
glog.Infof("list of remove labels: %v", listOfRemoveLabels)
// invoke gitee api to remove labels
if len(listOfRemoveLabels) > 0 {
glog.Infof("invoke api to remove labels: %v", listOfRemoveLabels)
// remove labels
for _, removedlabel := range listOfRemoveLabels {
localVarOptionals := &gitee.DeleteV5ReposOwnerRepoIssuesNumberLabelsNameOpts{}
localVarOptionals.AccessToken = optional.NewString(s.Config.GiteeToken)
_, err := s.GiteeClient.LabelsApi.DeleteV5ReposOwnerRepoIssuesNumberLabelsName(
s.Context, owner, repo, number, UrlEncode(removedlabel), localVarOptionals)
if err != nil {
glog.Errorf("unable to remove label: %s err: %v", removedlabel, err)
return err
} else {
glog.Infof("remove label successfully: %s", removedlabel)
}
}
} else {
glog.Infof("no label to remove for this event")
}
}
return nil
}
func (s *Server) generateLabelLuckyColor() string {
cRand := rand.New(rand.NewSource(time.Now().Unix()))
return fmt.Sprintf("%02x%02x%02x", cRand.Intn(255), cRand.Intn(255), cRand.Intn(255))
}
func (s *Server) patchPRLabels(labels []string, owner, repo string, number int32) error {
// list labels in current pr
lvos := &gitee.GetV5ReposOwnerRepoPullsNumberOpts{
AccessToken: optional.NewString(s.Config.GiteeToken),
}
pr, _, err := s.GiteeClient.PullRequestsApi.GetV5ReposOwnerRepoPullsNumber(s.Context, owner, repo, number, lvos)
if err != nil {
glog.Errorf("unable to get pull request. err: %v", err)
return err
}
glog.Infof("list of pr labels: %v", pr.Labels)
// list of add labels
newLabels, _ := s.labelDiffer(labels, pr.Labels)
if len(newLabels) == 0 {
glog.Info("all labels existed in pr, skip updating.")
return nil
}
glog.Infof("list of add labels in pr: %v", newLabels)
// invoke gitee api to add labels
if len(newLabels) > 0 {
// build label string
body := gitee.PullRequestLabelPostParam{}
body.AccessToken = s.Config.GiteeToken
body.Body = newLabels
glog.Infof("invoke api to add labels: %v", newLabels)
// patch labels
_, response, err := s.GiteeClient.PullRequestsApi.PostV5ReposOwnerRepoPullsNumberLabels(s.Context, owner, repo, number, body)
if err != nil {
if response.StatusCode == 400 {
glog.Infof("add labels successfully with status code %d: %v", response.StatusCode, newLabels)
} else {
glog.Errorf("unable to add labels: %v err: %v", newLabels, err)
return err
}
} else {
glog.Infof("add labels successfully: %v", newLabels)
}
} else {
glog.Infof("no label to add for this event")
}
return nil
}
func (s *Server) patchRepoLabels(labels []string, owner, repo string, createNew bool) ([]string, error) {
// list labels in current gitee repository
lvosRepo := &gitee.GetV5ReposOwnerRepoLabelsOpts{
AccessToken: optional.NewString(s.Config.GiteeToken),
}
listofRepoLabels, _, err := s.GiteeClient.LabelsApi.GetV5ReposOwnerRepoLabels(s.Context, owner, repo, lvosRepo)
if err != nil {
glog.Errorf("unable to list repository labels. err: %v", err)
return []string{}, err
}
glog.Infof("list of repository labels: %v", listofRepoLabels)
newLabels, existlabel := s.labelDiffer(labels, listofRepoLabels)
if len(newLabels) == 0 {
glog.Info("all labels existed in repo, skip creating.")
return existlabel, nil
}
if !createNew {
glog.Info("'createNew' flag is false, skip creating.")
return existlabel, nil
}
createLabelParam := gitee.LabelPostParam{
AccessToken: s.Config.GiteeToken,
}
for _, label := range newLabels {
createLabelParam.Name = label
createLabelParam.Color = s.generateLabelLuckyColor()
result, httpResponse, err := s.GiteeClient.LabelsApi.PostV5ReposOwnerRepoLabels(
s.Context, owner, repo, createLabelParam)
if err != nil {
glog.Errorf("unable to create repository label. %v, err: %v and %v", result, err.Error(), *httpResponse)
return []string{}, err
}
}
return labels, nil
}
// AddSpecifyLabelInPulRequest adds specify labels in pull request
func (s *Server) AddSpecifyLabelsInPulRequest(event *gitee.NoteEvent, newLabels []string, createNew bool) error {
newLabels = truncateLabel(newLabels)
// get basic information
comment := event.Comment.Body
owner := event.Repository.Namespace
repo := event.Repository.Path
var number int32
if event.PullRequest != nil {
number = event.PullRequest.Number
}
glog.Infof("add specify label started. comment: %s owner: %s repo: %s number: %d",
comment, owner, repo, number)
// patch repo labels
legalLabels, err := s.patchRepoLabels(newLabels, owner, repo, createNew)
if err != nil {
return err
}
// patch pr labels
if err := s.patchPRLabels(legalLabels, owner, repo, number); err != nil {
return err
}
return nil
}
// RemoveSpecifyLabelsInPulRequest removes specify labels in pull request
func (s *Server) RemoveSpecifyLabelsInPulRequest(event *gitee.NoteEvent, mapOfRemoveLabels map[string]string) error {
// get basic information
comment := event.Comment.Body
owner := event.Repository.Namespace
repo := event.Repository.Path
var number int32
if event.PullRequest != nil {
number = event.PullRequest.Number
}
glog.Infof("remove label started. comment: %s owner: %s repo: %s number: %d",
comment, owner, repo, number)
// list labels in current item
lvos := &gitee.GetV5ReposOwnerRepoPullsNumberOpts{}
lvos.AccessToken = optional.NewString(s.Config.GiteeToken)
pr, _, err := s.GiteeClient.PullRequestsApi.GetV5ReposOwnerRepoPullsNumber(s.Context, owner, repo, number, lvos)
if err != nil {
glog.Errorf("unable to get pull request. err: %v", err)
return err
}
listofItemLabels := pr.Labels
glog.Infof("list of item labels: %v", listofItemLabels)
// list of remove labels
listOfRemoveLabels := GetListOfRemoveLabels(mapOfRemoveLabels, listofItemLabels)
glog.Infof("list of remove labels: %v", listOfRemoveLabels)
// invoke gitee api to remove labels
if len(listOfRemoveLabels) > 0 {
// build label string
var strLabel string
for _, currentlabel := range listofItemLabels {
strLabel += currentlabel.Name + ","
}
for _, removedlabel := range listOfRemoveLabels {
strLabel = strings.Replace(strLabel, removedlabel+",", "", 1)
}
strLabel = strings.TrimRight(strLabel, ",")
// avoid to unable to remove labels when no label is exsit
if strLabel == "" {
strLabel = ","
}
body := gitee.PullRequestUpdateParam{}
body.AccessToken = s.Config.GiteeToken
body.Labels = strLabel
glog.Infof("invoke api to remove labels: %v", strLabel)
// patch labels
_, response, err := s.GiteeClient.PullRequestsApi.PatchV5ReposOwnerRepoPullsNumber(s.Context, owner, repo, number, body)
if err != nil {
if response.StatusCode == 400 {
glog.Infof("remove labels successfully with status code %d: %v", response.StatusCode, listOfRemoveLabels)
} else {
glog.Errorf("unable to remove labels: %v err: %v", listOfRemoveLabels, err)
return err
}
} else {
glog.Infof("remove labels successfully: %v", listOfRemoveLabels)
}
} else {
glog.Infof("no label to remove for this event")
}
return nil
}
Go
1
https://gitee.com/openeuler/ci-bot.git
git@gitee.com:openeuler/ci-bot.git
openeuler
ci-bot
ci-bot
e91f82195b70

搜索帮助

53164aa7 5694891 3bd8fe86 5694891