diff --git a/.gitignore b/.gitignore index ba6a03acb0017b00a1f6eb20f11efa36c76b2212..c81330270a5e638b3f1eda2fd90e66a2dc3df385 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,5 @@ ci-bot # vendor/ .idea/ log/ +.vscode +_debug_bin diff --git a/config.yaml b/config.yaml index efd5b49f3f4c2c2b85f4b4c8a503e02fe5c25302..10c9aa0f71eadfdb436faa53b59f7352a2cca09f 100644 --- a/config.yaml +++ b/config.yaml @@ -32,9 +32,9 @@ requiringLabels: missingLabels: - do-not-merge watchProjectFiles: - - watchProjectFileOwner: openeuler - watchprojectFileRepo: infrastructure - watchprojectFilePath: repository/openeuler.yaml + - watchProjectFileOwner: cve-manage-test + watchprojectFileRepo: config + watchprojectFilePath: repo/repos.yaml watchProjectFileRef: master - watchProjectFileOwner: openeuler watchprojectFileRepo: infrastructure diff --git a/go.sum b/go.sum index dd5af7171892b98ed092a7d9c98f29720eb68b12..c75cd4361e8533b276c386d5781e7f3580818df2 100644 --- a/go.sum +++ b/go.sum @@ -2,12 +2,6 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.37.4 h1:glPeL3BQJsbF6aIIYfZizMwc5LTYz250bDMjttbBGAU= cloud.google.com/go v0.37.4/go.mod h1:NHPJ89PdicEuT9hdPXMROBD91xc5uRDxsMtSB16k7hw= -gitee.com/openeuler/go-gitee v0.0.0-20200424023021-ced5a4d67179 h1:7bHzennVUJlv27Gljny95CyXknEBrfmHL6KdHCuHumM= -gitee.com/openeuler/go-gitee v0.0.0-20200424023021-ced5a4d67179/go.mod h1:TQrS/LP/DFXLqM+lVrZd4nL2pbTrqiXABGT9PJepVTA= -gitee.com/openeuler/go-gitee v0.0.0-20201109090511-81a247e275be h1:eh0eMiF5PNuD196nW8DcVNsGNchbeyKk+nlVgKtnBzg= -gitee.com/openeuler/go-gitee v0.0.0-20201109090511-81a247e275be/go.mod h1:TQrS/LP/DFXLqM+lVrZd4nL2pbTrqiXABGT9PJepVTA= -gitee.com/openeuler/go-gitee v0.0.0-20201110031012-c7f697cc7b12 h1:rgQdF72XcPKOVyM3nmf0Lyp7Mh3mDqxD/uMvY7sixOE= -gitee.com/openeuler/go-gitee v0.0.0-20201110031012-c7f697cc7b12/go.mod h1:TQrS/LP/DFXLqM+lVrZd4nL2pbTrqiXABGT9PJepVTA= gitee.com/openeuler/go-gitee v0.0.0-20201111035308-c4384bf8d333 h1:Uk05BpyrV24VNVFPd47lEOg0OmUMgnIgd50gnyWqC8s= gitee.com/openeuler/go-gitee v0.0.0-20201111035308-c4384bf8d333/go.mod h1:TQrS/LP/DFXLqM+lVrZd4nL2pbTrqiXABGT9PJepVTA= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= diff --git a/pkg/cibot/checkpr.go b/pkg/cibot/checkpr.go index 0a0e801bcee2507d60dfd5354f3e4a39b926d115..2866dcd9ca78fb545315d6963a41a714726001f7 100644 --- a/pkg/cibot/checkpr.go +++ b/pkg/cibot/checkpr.go @@ -4,26 +4,33 @@ import ( "gitee.com/openeuler/go-gitee/gitee" "github.com/golang/glog" ) + var checkPrComment = "Cannot use \"/check-pr\", because this command is only used to detect open pull requests" + //CheckPr Check whether the pull request can be merged -func (s *Server)CheckPr(event *gitee.NoteEvent) (err error) { - if *event.NoteableType == "PullRequest" && event.PullRequest.State == "open"{ +func (s *Server) CheckPr(event *gitee.NoteEvent) (err error) { + if *event.NoteableType == "PullRequest" && event.PullRequest.State == "open" { err := s.MergePullRequest(event) if err != nil { - return err - } - }else { - body := gitee.PullRequestCommentPostParam{} - body.AccessToken = s.Config.GiteeToken - body.Body = checkPrComment - owner := event.Repository.Namespace - repo := event.Repository.Name - number := event.PullRequest.Number - _, _, err := s.GiteeClient.PullRequestsApi.PostV5ReposOwnerRepoPullsNumberComments(s.Context, owner, repo, number, body) - if err != nil { - glog.Errorf("unable to add comment in pull request: %v", err) - return err + comment := err.Error() + return s.addCommentToPullRequest(event.Repository.Namespace, event.Repository.Name, + comment, event.PullRequest.Number) } + } else { + return s.addCommentToPullRequest(event.Repository.Namespace, event.Repository.Name, + checkPrComment, event.PullRequest.Number) + } + return nil +} + +func (s *Server) addCommentToPullRequest(owner, repo, comment string, number int32) error { + body := gitee.PullRequestCommentPostParam{} + body.AccessToken = s.Config.GiteeToken + body.Body = comment + _, _, err := s.GiteeClient.PullRequestsApi.PostV5ReposOwnerRepoPullsNumberComments(s.Context, owner, repo, number, body) + if err != nil { + glog.Errorf("unable to add comment in pull request: %v", err) + return err } return nil } diff --git a/pkg/cibot/pullrequest.go b/pkg/cibot/pullrequest.go index 401b049c9eed70713830c1a780030e4d562c03e1..ffd49b161073c8a4da31c827d0a1c0ea0fc33eb7 100644 --- a/pkg/cibot/pullrequest.go +++ b/pkg/cibot/pullrequest.go @@ -413,7 +413,7 @@ func (s *Server) hasLgtmLabel(labels []gitee.Label) bool { return false } -func (s *Server) readyForMerge(labels []gitee.Label, owner, repo string) bool { +func (s *Server) readyForMerge(labels []gitee.Label, owner, repo string) error { aproveLabel := 0 lgtmLabel := 0 lgtmPrefix := "" @@ -434,7 +434,12 @@ func (s *Server) readyForMerge(labels []gitee.Label, owner, repo string) bool { } } glog.Infof("Pr labels have approved: %d lgtm: %d, required (%d)", aproveLabel, lgtmLabel, leastLgtm) - return aproveLabel == 1 && lgtmLabel >= leastLgtm + if aproveLabel == 1 && lgtmLabel >= leastLgtm { + return nil + } else { + return fmt.Errorf("This pull request can not be merged, please check that the number of **lgtm** labels >= %d "+ + "and there are an **approve** labels. ", leastLgtm) + } } // check with the labels constraints requiring/missing to determine if mergable @@ -463,83 +468,76 @@ func (s *Server) MergePullRequest(event *gitee.NoteEvent) error { listofPrLabels := pr.Labels glog.Infof("List of pr labels: %v", listofPrLabels) // ready to merge - if s.readyForMerge(listofPrLabels, owner, repo) { - nonRequiringLabels, nonMissingLabels := s.legalLabelsForMerge(listofPrLabels) - if len(nonRequiringLabels) == 0 && len(nonMissingLabels) == 0 { - // current pr can be merged - if c, b := checkFrozenCanMerge(event.Author.Login, pr.Base.Ref); !b { - //send comment to pr - body := gitee.PullRequestCommentPostParam{} - body.AccessToken = s.Config.GiteeToken - if len(c) > 0 { - body.Body = fmt.Sprintf("**Merge failed** The current pull request merge target has been frozen, and only the branch owner( @%s ) can merge.", - strings.Join(c, " , @")) - } else { - body.Body = "**Merge failed** The current pull request merge target has been frozen, and only the branch owner can merge." + err = s.readyForMerge(listofPrLabels, owner, repo) + if err != nil { + return err + } + nonRequiringLabels, nonMissingLabels := s.legalLabelsForMerge(listofPrLabels) + if len(nonRequiringLabels) == 0 && len(nonMissingLabels) == 0 { + // current pr can be merged + if c, b := checkFrozenCanMerge(event.Author.Login, pr.Base.Ref); !b { + //send comment to pr + comment := "" + if len(c) > 0 { + comment = fmt.Sprintf("**Merge failed** The current pull request merge target has been frozen, and only the branch owner( @%s ) can merge.", + strings.Join(c, " , @")) + } else { + comment = "**Merge failed** The current pull request merge target has been frozen, and only the branch owner can merge." + } + err = s.addCommentToPullRequest(owner, repo, comment, prNumber) + if err != nil { + glog.Errorf("Cannot add comments to pull request: %v", err) + } + } else { + if event.PullRequest.Mergeable { + // remove assignees + err = s.RemoveAssigneesInPullRequest(event) + if err != nil { + glog.Errorf("unable to remove assignees. err: %v", err) } - - _, _, err = s.GiteeClient.PullRequestsApi.PostV5ReposOwnerRepoPullsNumberComments(s.Context, owner, repo, prNumber, body) + // remove testers + err = s.RemoveTestersInPullRequest(event) if err != nil { - glog.Errorf("Cannot add comments to pull request: %v", err) + glog.Errorf("unable to remove testers. err: %v", err) } - } else { - if event.PullRequest.Mergeable { - // remove assignees - err = s.RemoveAssigneesInPullRequest(event) - if err != nil { - glog.Errorf("unable to remove assignees. err: %v", err) - return err - } - // remove testers - err = s.RemoveTestersInPullRequest(event) - if err != nil { - glog.Errorf("unable to remove testers. err: %v", err) - return err - } - // merge pr - body := gitee.PullRequestMergePutParam{} - body.AccessToken = s.Config.GiteeToken - // generate merge body - description, err := s.generateMergeDescription(event) - if err != nil { - glog.Errorf("unable to get merge description.err: %v", err) - return err - } - body.Description = description - - _, err = s.GiteeClient.PullRequestsApi.PutV5ReposOwnerRepoPullsNumberMerge(s.Context, owner, repo, prNumber, body) - if err != nil { - glog.Errorf("unable to merge pull request. err: %v", err) - return err - } + // merge pr + body := gitee.PullRequestMergePutParam{} + body.AccessToken = s.Config.GiteeToken + // generate merge body + description, err := s.generateMergeDescription(event) + if err != nil { + glog.Errorf("unable to get merge description.err: %v", err) + return fmt.Errorf(`The pull request merge failed, please use command "/check-pr" to try again. `) } - } - } else { - // add comment to pr to show the labels reason of not mergable - nonRequiringMsg := "" - if len(nonRequiringLabels) > 0 { - nonRequiringMsg = fmt.Sprintf(nonRequiringLabelsMessage, strings.Join(nonRequiringLabels, ",")) - } - nonMissingMsg := "" - if len(nonMissingLabels) > 0 { - nonMissingMsg = fmt.Sprintf(nonMissingLabelsMessage, strings.Join(nonMissingLabels, ",")) - } + body.Description = description - // add comment back to pr - body := gitee.PullRequestCommentPostParam{} - body.AccessToken = s.Config.GiteeToken - body.Body = fmt.Sprintf(cannotMergeMessage, fmt.Sprintf("%s%s", nonRequiringMsg, nonMissingMsg)) - owner := event.Repository.Namespace - repo := event.Repository.Name - number := event.PullRequest.Number - _, _, err := s.GiteeClient.PullRequestsApi.PostV5ReposOwnerRepoPullsNumberComments(s.Context, owner, repo, number, body) - if err != nil { - glog.Errorf("unable to add comment in pull request: %v", err) - return err + _, err = s.GiteeClient.PullRequestsApi.PutV5ReposOwnerRepoPullsNumberMerge(s.Context, owner, repo, prNumber, body) + if err != nil { + glog.Errorf("unable to merge pull request. err: %v", err) + return fmt.Errorf(`The pull request merge failed, please use command "/check-pr" to try again. `) + } } } + } else { + // add comment to pr to show the labels reason of not mergable + nonRequiringMsg := "" + if len(nonRequiringLabels) > 0 { + nonRequiringMsg = fmt.Sprintf(nonRequiringLabelsMessage, strings.Join(nonRequiringLabels, ",")) + } + nonMissingMsg := "" + if len(nonMissingLabels) > 0 { + nonMissingMsg = fmt.Sprintf(nonMissingLabelsMessage, strings.Join(nonMissingLabels, ",")) + } + // add comment back to pr + comment := fmt.Sprintf(cannotMergeMessage, fmt.Sprintf("%s%s", nonRequiringMsg, nonMissingMsg)) + owner := event.Repository.Namespace + repo := event.Repository.Name + number := event.PullRequest.Number + err = s.addCommentToPullRequest(owner, repo, comment, number) + if err != nil { + glog.Errorf("unable to add comment in pull request: %v", err) + } } - return nil }