diff --git a/pkg/cibot/pullrequest.go b/pkg/cibot/pullrequest.go index 8fb12f1dbaf762d86fd0306dd46503bac7d98ce1..5e7e93271e9728c9402dc232979a97de739511e6 100644 --- a/pkg/cibot/pullrequest.go +++ b/pkg/cibot/pullrequest.go @@ -1,6 +1,7 @@ package cibot import ( + "encoding/base64" "fmt" "strings" @@ -64,6 +65,107 @@ func (s *Server) HandlePullRequestEvent(event *gitee.PullRequestEvent) { return } } + case "merge": + glog.Info("Received a pull request merge event") + diff := "" + prjname := "" + existinprj := false + // get pr commit file list + owner := event.Repository.Namespace + repo := event.Repository.Name + number := event.PullRequest.Number + lvos := &gitee.GetV5ReposOwnerRepoPullsNumberFilesOpts{} + lvos.AccessToken = optional.NewString(s.Config.GiteeToken) + fls, _, err := s.GiteeClient.PullRequestsApi.GetV5ReposOwnerRepoPullsNumberFiles(s.Context, owner, repo, number, lvos) + + if err != nil { + glog.Errorf("unable to get pr file list. err: %v", err) + return + } + + // check yaml has modified? and get diff + for _, file := range fls { + glog.Infof(file.Patch.Diff) + if strings.Contains(file.Filename, "src-openeuler.yaml") { + glog.Infof("src-openeuler.yaml has been modified") + diff = file.Patch.Diff + break + } + } + + // get the yaml diff + glog.Infof(diff) + if strings.Contains(diff, "+- name:") { + difs := strings.Fields(diff) + glog.Infof(difs[0]) + for idx, str := range difs { + // glog.Infof(str) + if str == "+-" && difs[idx+1] == "name:" { + prjname = difs[idx+2] + glog.Infof(prjname) + } + } + } + + // get branch sha value for getting repo tree + repoinfra := "infrastructure" + branchm := "master" + lvosbranch := &gitee.GetV5ReposOwnerRepoBranchesBranchOpts{} + lvosbranch.AccessToken = optional.NewString(s.Config.GiteeToken) + branch, _, err := s.GiteeClient.RepositoriesApi.GetV5ReposOwnerRepoBranchesBranch(s.Context, owner, repoinfra, branchm, lvosbranch) + + // look up the obs project in infrastructure + treesha := branch.Commit.Sha + lvostree := &gitee.GetV5ReposOwnerRepoGitTreesShaOpts{} + lvostree.AccessToken = optional.NewString(s.Config.GiteeToken) + lvostree.Recursive = optional.NewInt32(1) + tree, _, err := s.GiteeClient.GitDataApi.GetV5ReposOwnerRepoGitTreesSha(s.Context, owner, repoinfra, treesha, lvostree) + for _, dir := range tree.Tree { + if strings.Contains(dir.Path, "/"+prjname+"/") { + glog.Infof("path:%v, sha:%v", dir.Path, dir.Sha) + existinprj = true + } + } + + // if not exist in obs project + if existinprj { + glog.Infof("Project already in obs, do not need create.") + return + } + + glog.Infof("Begin to create new project file, project name:%v.", prjname) + + newfbody := gitee.NewFileParam{} + newfbody.AccessToken = s.Config.GiteeToken + newfbody.AuthorName = event.PullRequest.User.Login + newfbody.AuthorEmail = event.PullRequest.User.Email + newfbody.CommitterName = event.PullRequest.User.Login + newfbody.CommitterEmail = event.PullRequest.User.Email + newfbody.Branch = branchm + newfbody.Message = "add project according to src-openeuler.yaml in repo community." + + // add _service file + _servicepath := "obs/team_usage/obs_meta/projects/openEuler:Mainline/" + prjname + "/_service" + _service := "\n" + + " \n" + + " repo\n" + + " next/openEuler/" + prjname + "\n" + + " \n" + + "" + _serbase64 := base64.StdEncoding.EncodeToString([]byte(_service)) + newfbody.Content = _serbase64 + s.GiteeClient.RepositoriesApi.PostV5ReposOwnerRepoContentsPath(s.Context, owner, repoinfra, _servicepath, newfbody) + + // add _meta file + _metapath := "obs/team_usage/obs_meta/projects/openEuler:Mainline/" + prjname + "/.osc/_meta" + _meta := "\n" + + " \n" + + " <description/>\n" + + "</package>\n" + _metabase64 := base64.StdEncoding.EncodeToString([]byte(_meta)) + newfbody.Content = _metabase64 + //glog.Infof("owner:%v, repo:%v, _metapath:%v, _meta:%v", owner, repoinfra, _metapath, _meta) + s.GiteeClient.RepositoriesApi.PostV5ReposOwnerRepoContentsPath(s.Context, owner, repoinfra, _metapath, newfbody) } } @@ -151,7 +253,7 @@ func (s *Server) legalForMerge(labels []gitee.Label) bool { leastLgtm := 0 if s.Config.LgtmCountsRequired > 1 { leastLgtm = s.Config.LgtmCountsRequired - lgtmPrefix =fmt.Sprintf(LabelLgtmWithCommenter, "") + lgtmPrefix = fmt.Sprintf(LabelLgtmWithCommenter, "") } else { leastLgtm = 1 lgtmPrefix = LabelNameLgtm