From b49b080c76644aa95639ffbbe53c1bb9660044ee Mon Sep 17 00:00:00 2001 From: wanghaosq Date: Tue, 2 Nov 2021 17:25:22 +0800 Subject: [PATCH] after added repositories in gitee and db, add owners in db and gitee --- pkg/cibot/repohandler.go | 119 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 118 insertions(+), 1 deletion(-) diff --git a/pkg/cibot/repohandler.go b/pkg/cibot/repohandler.go index 390e280..64eab1a 100644 --- a/pkg/cibot/repohandler.go +++ b/pkg/cibot/repohandler.go @@ -281,6 +281,11 @@ func (handler *RepoHandler) addRepositories(owner string, repo Repository) error glog.Errorf("failed to add repositories: %v", err) return err } + err = handler.addSigReposAndOwnersInDBAndGitee(owner, repo) + if err != nil{ + glog.Errorf("failed to run addSigReposAndOwnersInDBAndGitee: %v", err) + return err + } return nil } @@ -526,7 +531,7 @@ func (handler *RepoHandler) addBranchGiteeAndDb(community string, r Repository, if *br.Type == BranchProtected { protectBody := gitee.BranchProtectionPutParam{} protectBody.AccessToken = handler.Config.GiteeToken - _, _, err := handler.GiteeClient.RepositoriesApi.PutV5ReposOwnerRepoBranchesBranchProtection( + _, _, err = handler.GiteeClient.RepositoriesApi.PutV5ReposOwnerRepoBranchesBranchProtection( handler.Context, community, *r.Name, *br.Name, protectBody) if err != nil { glog.Errorf("failed to add branch protection: %v", err) @@ -641,3 +646,115 @@ func (handler *RepoHandler) handleRepositorySetting(community string, r Reposito return nil } + + +// add sig_repos and owners in db and gitee after repository has been created, make sure pull request's 'lgtm' and 'approved' labels can be useful immediately +func (handler *RepoHandler) addSigReposAndOwnersInDBAndGitee(owner string, repo Repository) error{ + var sigs SigsYaml + opts := &gitee.GetV5ReposOwnerRepoContentsPathOpts{} + opts.AccessToken = optional.NewString(handler.Config.GiteeToken) + sigContent, _, err := handler.GiteeClient.RepositoriesApi.GetV5ReposOwnerRepoContentsPath(handler.Context, owner, "community", + "sig/sigs.yaml", opts) + if err != nil { + glog.Errorf("get sig content failed with error: %v", err) + return err + } + sigDecode, err := base64.StdEncoding.DecodeString(sigContent.Content) + if err != nil { + glog.Errorf("decode content with error: %v", err) + return err + } + err = yaml.Unmarshal(sigDecode, &sigs) + if err != nil { + glog.Errorf("unmarshal with error: %v", err) + return err + } + repoName := fmt.Sprintf("%s/%s", owner, *repo.Name) + var sigName string + for _, sig := range sigs.Sigs{ + for _, repository := range sig.Repositories{ + if repoName == repository{ + sigName = sig.Name + break + } else{ + continue + } + } + } + glog.Info("sigName = ", sigName) + //get the sig which the repository belongs to + var srs database.SigRepositories + err = database.DBConnection.Model(&database.SigRepositories{}).Where("name=? and repo_name=?", sigName, repoName).Find(&srs).Error + glog.Info("srs = ", srs) + if err != nil { + glog.Infof("get data from sig_repositories failed, error: %v", err) + glog.Infof("begin to create %s, %s in db's sig_repositories", sigName, repoName) + // write to database + s := database.SigRepositories{ + Name: sigName, + RepoName: repoName, + } + err = database.DBConnection.Create(&s).Error + if err != nil { + glog.Errorf("failed to add sig repos in database: %v", err) + return err + } + glog.Info("end creating in db") + } + var rs database.SigRepositories + err = database.DBConnection.Model(&database.SigRepositories{}).Where("name=? and repo_name=?", sigName, repoName).Find(&rs).Error + if err != nil { + glog.Errorf("get data from sig_repositories failed, error: %v", err) + return err + } + glog.Infof("rs = %s", rs) + contentOpts := &gitee.GetV5ReposOwnerRepoContentsPathOpts{} + contentOpts.AccessToken = optional.NewString(handler.Config.GiteeToken) + content, _, err := handler.GiteeClient.RepositoriesApi.GetV5ReposOwnerRepoContentsPath(handler.Context, owner, "community", + fmt.Sprintf("sig/%s/OWNERS", sigName), contentOpts) + if err != nil { + glog.Errorf("get content failed with error: %v", err) + return err + } + // base64 decode + decodeBytes, err := base64.StdEncoding.DecodeString(content.Content) + if err != nil { + glog.Errorf("decode content with error: %v", err) + return err + } + // unmarshal owners file + var owners OwnersFile + err = yaml.Unmarshal(decodeBytes, &owners) + if err != nil { + glog.Errorf("fail to unmarshal owners: %v", err) + return err + } + // add members to gitee and database + if len(owners.Maintainers) > 0 { + glog.Infof("maintainer: %s", owners.Maintainers) + glog.Infof("repo.Name: %s", *repo.Name) + memberBody := gitee.ProjectMemberPutParam{} + memberBody.AccessToken = handler.Config.GiteeToken + memberBody.Permission = PermissionPush + for _, member := range owners.Maintainers { + _, _, err := handler.GiteeClient.RepositoriesApi.PutV5ReposOwnerRepoCollaboratorsUsername( + handler.Context, owner, *repo.Name, member, memberBody) + if err != nil { + glog.Errorf("fail to create developers: %v", err) + continue + } + // add member to database + ps := database.Privileges{ + Owner: owner, + Repo: *repo.Name, + User: member, + Type: PrivilegeDeveloper, + } + err = database.DBConnection.Create(&ps).Error + if err != nil { + glog.Errorf("failed to add privileges in database: %v", err) + } + } + } + return nil +} \ No newline at end of file -- Gitee