Skip to content

Commit 9bef663

Browse files
authored
Merge pull request #23 from gomicro/org-perms
org perms
2 parents 67f8c36 + df6f17e commit 9bef663

File tree

6 files changed

+488
-275
lines changed

6 files changed

+488
-275
lines changed

client/orgs.go

Lines changed: 69 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package client
33
import (
44
"context"
55
"errors"
6+
"fmt"
67
"net/http"
78

89
"github.com/gomicro/concord/report"
@@ -60,8 +61,10 @@ func (c *Client) GetMembers(ctx context.Context, orgName string) ([]*github.User
6061
}
6162

6263
func (c *Client) InviteMember(ctx context.Context, orgName string, username string) {
63-
report.PrintAdd("invite " + username)
64-
report.Println()
64+
cs := &report.ChangeSet{}
65+
66+
cs.Add("invite "+username, "invited "+username)
67+
cs.PrintPre()
6568

6669
c.Add(func() error {
6770
user, resp, err := c.ghClient.Users.Get(ctx, username)
@@ -88,9 +91,71 @@ func (c *Client) InviteMember(ctx context.Context, orgName string, username stri
8891
return err
8992
}
9093

91-
report.PrintSuccess("invited " + username)
92-
report.Println()
94+
cs.PrintPost()
95+
96+
return nil
97+
})
98+
}
99+
100+
func (c *Client) SetOrgPrivileges(ctx context.Context, orgName string, edits *github.Organization) error {
101+
ghOrg, _, err := c.ghClient.Organizations.Get(ctx, orgName)
102+
if err != nil {
103+
if _, ok := err.(*github.RateLimitError); ok {
104+
return err
105+
}
106+
107+
if errResp, ok := err.(*github.ErrorResponse); ok {
108+
if errResp.Response.StatusCode == http.StatusNotFound {
109+
return ErrOrgNotFound
110+
}
111+
}
112+
113+
return err
114+
}
115+
116+
cs := &report.ChangeSet{}
117+
118+
if edits.DefaultRepoPermission != nil && *edits.DefaultRepoPermission != *ghOrg.DefaultRepoPermission {
119+
cs.Add(
120+
fmt.Sprintf("setting base permissions to '%s'", *edits.DefaultRepoPermission),
121+
fmt.Sprintf("set base permissions to '%s'", *edits.DefaultRepoPermission),
122+
)
123+
}
124+
125+
if edits.MembersCanCreatePrivateRepos != nil && *edits.MembersCanCreatePrivateRepos != *ghOrg.MembersCanCreatePrivateRepos {
126+
cs.Add(
127+
fmt.Sprintf("setting private repo creation to '%t'", *edits.MembersCanCreatePrivateRepos),
128+
fmt.Sprintf("set private repo creation to '%t'", *edits.MembersCanCreatePrivateRepos),
129+
)
130+
}
131+
132+
if edits.MembersCanCreatePublicRepos != nil && *edits.MembersCanCreatePublicRepos != *ghOrg.MembersCanCreatePublicRepos {
133+
cs.Add(
134+
fmt.Sprintf("setting public repo creation to '%t'", *edits.MembersCanCreatePublicRepos),
135+
fmt.Sprintf("set public repo creation to '%t'", *edits.MembersCanCreatePublicRepos),
136+
)
137+
}
138+
139+
cs.PrintPre()
140+
141+
c.Add(func() error {
142+
_, resp, err := c.ghClient.Organizations.Edit(ctx, orgName, edits)
143+
if err != nil {
144+
if _, ok := err.(*github.RateLimitError); ok {
145+
return err
146+
}
147+
148+
if resp.StatusCode == http.StatusNotFound {
149+
return ErrUserNotFound
150+
}
151+
152+
return err
153+
}
154+
155+
cs.PrintPost()
93156

94157
return nil
95158
})
159+
160+
return nil
96161
}

cmd/apply.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,11 @@ func applyRun(cmd *cobra.Command, args []string) error {
6161
report.PrintHeader("Org")
6262
report.Println()
6363

64+
err = orgRun(cmd, args)
65+
if err != nil {
66+
return handleError(cmd, err)
67+
}
68+
6469
err = membersRun(cmd, args)
6570
if err != nil {
6671
return handleError(cmd, err)

cmd/apply_org.go

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
package cmd
2+
3+
import (
4+
"errors"
5+
"io"
6+
"os"
7+
"strings"
8+
9+
"github.com/gomicro/concord/client"
10+
gh_pb "github.com/gomicro/concord/github/v1"
11+
"github.com/gomicro/concord/manifest"
12+
"github.com/gomicro/concord/report"
13+
"github.com/google/go-github/v56/github"
14+
"github.com/spf13/cobra"
15+
)
16+
17+
func init() {
18+
applyCmd.AddCommand(NewApplyOrgCmd(os.Stdout))
19+
}
20+
21+
func NewApplyOrgCmd(out io.Writer) *cobra.Command {
22+
cmd := &cobra.Command{
23+
Use: "org",
24+
Short: "Apply specific org level configuration",
25+
Long: `Apply specific org level configuration against github`,
26+
RunE: applyOrgRun,
27+
}
28+
29+
cmd.SetOut(out)
30+
31+
return cmd
32+
}
33+
34+
func applyOrgRun(cmd *cobra.Command, args []string) error {
35+
file := cmd.Flags().Lookup("file").Value.String()
36+
cmd.SetContext(manifest.WithManifest(cmd.Context(), file))
37+
38+
dry := strings.EqualFold(cmd.Flags().Lookup("dry").Value.String(), "true")
39+
40+
ctx := cmd.Context()
41+
42+
org, err := manifest.OrgFromContext(ctx)
43+
if err != nil {
44+
return handleError(cmd, err)
45+
}
46+
47+
clt, err := client.ClientFromContext(ctx)
48+
if err != nil {
49+
return handleError(cmd, err)
50+
}
51+
52+
exists, err := clt.OrgExists(ctx, org.Name)
53+
if err != nil {
54+
return handleError(cmd, err)
55+
}
56+
57+
if !exists {
58+
return handleError(cmd, errors.New("organization does not exist"))
59+
}
60+
61+
report.PrintHeader("Org")
62+
report.Println()
63+
64+
err = orgRun(cmd, args)
65+
if err != nil {
66+
return handleError(cmd, err)
67+
}
68+
69+
if !dry {
70+
if !confirm(cmd, "Apply changes? (y/n): ") {
71+
return nil
72+
}
73+
74+
err = clt.Apply()
75+
if err != nil {
76+
return handleError(cmd, err)
77+
}
78+
}
79+
80+
return nil
81+
}
82+
83+
func orgRun(cmd *cobra.Command, args []string) error {
84+
ctx := cmd.Context()
85+
86+
org, err := manifest.OrgFromContext(ctx)
87+
if err != nil {
88+
return handleError(cmd, err)
89+
}
90+
91+
clt, err := client.ClientFromContext(ctx)
92+
if err != nil {
93+
return handleError(cmd, err)
94+
}
95+
96+
report.Println()
97+
report.PrintHeader("Permissions")
98+
report.Println()
99+
100+
err = clt.SetOrgPrivileges(ctx, org.Name, buildOrgState(org))
101+
if err != nil {
102+
return handleError(cmd, err)
103+
}
104+
105+
return nil
106+
}
107+
108+
func buildOrgState(org *gh_pb.Organization) *github.Organization {
109+
state := &github.Organization{}
110+
111+
if org.Permissions != nil {
112+
if org.Permissions.BasePermissions != nil {
113+
state.DefaultRepoPermission = org.Permissions.BasePermissions
114+
}
115+
116+
if org.Permissions.CreatePrivateRepos != nil {
117+
state.MembersCanCreatePrivateRepos = org.Permissions.CreatePrivateRepos
118+
}
119+
120+
if org.Permissions.CreatePublicRepos != nil {
121+
state.MembersCanCreatePublicRepos = org.Permissions.CreatePublicRepos
122+
}
123+
}
124+
125+
return state
126+
}

0 commit comments

Comments
 (0)