Skip to content

Commit 8fd1cb9

Browse files
authored
feat: Add fork PR workflows permission API support (#3737)
1 parent 0126d74 commit 8fd1cb9

8 files changed

+348
-0
lines changed

github/actions_permissions_enterprise.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,3 +375,40 @@ func (s *ActionsService) UpdatePrivateRepoForkPRWorkflowSettingsInEnterprise(ctx
375375

376376
return s.client.Do(ctx, req, nil)
377377
}
378+
379+
// GetEnterpriseForkPRContributorApprovalPermissions gets the fork PR contributor approval policy for an enterprise.
380+
//
381+
// GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/actions/permissions#get-fork-pr-contributor-approval-permissions-for-an-enterprise
382+
//
383+
//meta:operation GET /enterprises/{enterprise}/actions/permissions/fork-pr-contributor-approval
384+
func (s *ActionsService) GetEnterpriseForkPRContributorApprovalPermissions(ctx context.Context, enterprise string) (*ContributorApprovalPermissions, *Response, error) {
385+
u := fmt.Sprintf("enterprises/%v/actions/permissions/fork-pr-contributor-approval", enterprise)
386+
387+
req, err := s.client.NewRequest("GET", u, nil)
388+
if err != nil {
389+
return nil, nil, err
390+
}
391+
392+
policy := new(ContributorApprovalPermissions)
393+
resp, err := s.client.Do(ctx, req, policy)
394+
if err != nil {
395+
return nil, resp, err
396+
}
397+
398+
return policy, resp, nil
399+
}
400+
401+
// UpdateEnterpriseForkPRContributorApprovalPermissions sets the fork PR contributor approval policy for an enterprise.
402+
//
403+
// GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/actions/permissions#set-fork-pr-contributor-approval-permissions-for-an-enterprise
404+
//
405+
//meta:operation PUT /enterprises/{enterprise}/actions/permissions/fork-pr-contributor-approval
406+
func (s *ActionsService) UpdateEnterpriseForkPRContributorApprovalPermissions(ctx context.Context, enterprise string, policy ContributorApprovalPermissions) (*Response, error) {
407+
u := fmt.Sprintf("enterprises/%v/actions/permissions/fork-pr-contributor-approval", enterprise)
408+
req, err := s.client.NewRequest("PUT", u, policy)
409+
if err != nil {
410+
return nil, err
411+
}
412+
413+
return s.client.Do(ctx, req, nil)
414+
}

github/actions_permissions_enterprise_test.go

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -603,3 +603,75 @@ func TestActionsService_UpdatePrivateRepoForkPRWorkflowSettingsInEnterprise(t *t
603603
return client.Actions.UpdatePrivateRepoForkPRWorkflowSettingsInEnterprise(ctx, "e", input)
604604
})
605605
}
606+
607+
func TestActionsService_GetEnterpriseForkPRContributorApprovalPermissions(t *testing.T) {
608+
t.Parallel()
609+
client, mux, _ := setup(t)
610+
611+
mux.HandleFunc("/enterprises/e/actions/permissions/fork-pr-contributor-approval", func(w http.ResponseWriter, r *http.Request) {
612+
testMethod(t, r, "GET")
613+
fmt.Fprint(w, `{"approval_policy": "require_approval"}`)
614+
})
615+
616+
ctx := t.Context()
617+
policy, _, err := client.Actions.GetEnterpriseForkPRContributorApprovalPermissions(ctx, "e")
618+
if err != nil {
619+
t.Errorf("Actions.GetEnterpriseForkPRContributorApprovalPermissions returned error: %v", err)
620+
}
621+
want := &ContributorApprovalPermissions{ApprovalPolicy: "require_approval"}
622+
if !cmp.Equal(policy, want) {
623+
t.Errorf("Actions.GetEnterpriseForkPRContributorApprovalPermissions returned %+v, want %+v", policy, want)
624+
}
625+
626+
const methodName = "GetEnterpriseForkPRContributorApprovalPermissions"
627+
testBadOptions(t, methodName, func() (err error) {
628+
_, _, err = client.Actions.GetEnterpriseForkPRContributorApprovalPermissions(ctx, "\n")
629+
return err
630+
})
631+
632+
testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
633+
got, resp, err := client.Actions.GetEnterpriseForkPRContributorApprovalPermissions(ctx, "e")
634+
if got != nil {
635+
t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
636+
}
637+
return resp, err
638+
})
639+
}
640+
641+
func TestActionsService_UpdateEnterpriseForkPRContributorApprovalPermissions(t *testing.T) {
642+
t.Parallel()
643+
client, mux, _ := setup(t)
644+
645+
input := ContributorApprovalPermissions{ApprovalPolicy: "require_approval"}
646+
647+
mux.HandleFunc("/enterprises/e/actions/permissions/fork-pr-contributor-approval", func(w http.ResponseWriter, r *http.Request) {
648+
v := new(ContributorApprovalPermissions)
649+
assertNilError(t, json.NewDecoder(r.Body).Decode(v))
650+
651+
testMethod(t, r, "PUT")
652+
if !cmp.Equal(v, &input) {
653+
t.Errorf("Request body = %+v, want %+v", v, &input)
654+
}
655+
w.WriteHeader(http.StatusNoContent)
656+
})
657+
658+
ctx := t.Context()
659+
resp, err := client.Actions.UpdateEnterpriseForkPRContributorApprovalPermissions(ctx, "e", input)
660+
if err != nil {
661+
t.Errorf("Actions.UpdateEnterpriseForkPRContributorApprovalPermissions returned error: %v", err)
662+
}
663+
664+
if resp.StatusCode != http.StatusNoContent {
665+
t.Errorf("Actions.UpdateEnterpriseForkPRContributorApprovalPermissions = %v, want %v", resp.StatusCode, http.StatusNoContent)
666+
}
667+
668+
const methodName = "UpdateEnterpriseForkPRContributorApprovalPermissions"
669+
testBadOptions(t, methodName, func() (err error) {
670+
_, err = client.Actions.UpdateEnterpriseForkPRContributorApprovalPermissions(ctx, "\n", input)
671+
return err
672+
})
673+
674+
testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
675+
return client.Actions.UpdateEnterpriseForkPRContributorApprovalPermissions(ctx, "e", input)
676+
})
677+
}

github/actions_permissions_orgs.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -483,3 +483,40 @@ func (s *ActionsService) UpdatePrivateRepoForkPRWorkflowSettingsInOrganization(c
483483

484484
return s.client.Do(ctx, req, nil)
485485
}
486+
487+
// GetOrganizationForkPRContributorApprovalPermissions gets the fork PR contributor approval policy for an organization.
488+
//
489+
// GitHub API docs: https://docs.github.com/rest/actions/permissions#get-fork-pr-contributor-approval-permissions-for-an-organization
490+
//
491+
//meta:operation GET /orgs/{org}/actions/permissions/fork-pr-contributor-approval
492+
func (s *ActionsService) GetOrganizationForkPRContributorApprovalPermissions(ctx context.Context, org string) (*ContributorApprovalPermissions, *Response, error) {
493+
u := fmt.Sprintf("orgs/%v/actions/permissions/fork-pr-contributor-approval", org)
494+
495+
req, err := s.client.NewRequest("GET", u, nil)
496+
if err != nil {
497+
return nil, nil, err
498+
}
499+
500+
policy := new(ContributorApprovalPermissions)
501+
resp, err := s.client.Do(ctx, req, policy)
502+
if err != nil {
503+
return nil, resp, err
504+
}
505+
506+
return policy, resp, nil
507+
}
508+
509+
// UpdateOrganizationForkPRContributorApprovalPermissions sets the fork PR contributor approval policy for an organization.
510+
//
511+
// GitHub API docs: https://docs.github.com/rest/actions/permissions#set-fork-pr-contributor-approval-permissions-for-an-organization
512+
//
513+
//meta:operation PUT /orgs/{org}/actions/permissions/fork-pr-contributor-approval
514+
func (s *ActionsService) UpdateOrganizationForkPRContributorApprovalPermissions(ctx context.Context, org string, policy ContributorApprovalPermissions) (*Response, error) {
515+
u := fmt.Sprintf("orgs/%v/actions/permissions/fork-pr-contributor-approval", org)
516+
req, err := s.client.NewRequest("PUT", u, policy)
517+
if err != nil {
518+
return nil, err
519+
}
520+
521+
return s.client.Do(ctx, req, nil)
522+
}

github/actions_permissions_orgs_test.go

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -773,3 +773,75 @@ func TestActionsService_UpdatePrivateRepoForkPRWorkflowSettingsInOrganization(t
773773
return client.Actions.UpdatePrivateRepoForkPRWorkflowSettingsInOrganization(ctx, "o", input)
774774
})
775775
}
776+
777+
func TestActionsService_GetOrganizationForkPRContributorApprovalPermissions(t *testing.T) {
778+
t.Parallel()
779+
client, mux, _ := setup(t)
780+
781+
mux.HandleFunc("/orgs/o/actions/permissions/fork-pr-contributor-approval", func(w http.ResponseWriter, r *http.Request) {
782+
testMethod(t, r, "GET")
783+
fmt.Fprint(w, `{"approval_policy": "require_approval"}`)
784+
})
785+
786+
ctx := t.Context()
787+
policy, _, err := client.Actions.GetOrganizationForkPRContributorApprovalPermissions(ctx, "o")
788+
if err != nil {
789+
t.Errorf("Actions.GetOrganizationForkPRContributorApprovalPermissions returned error: %v", err)
790+
}
791+
want := &ContributorApprovalPermissions{ApprovalPolicy: "require_approval"}
792+
if !cmp.Equal(policy, want) {
793+
t.Errorf("Actions.GetOrganizationForkPRContributorApprovalPermissions returned %+v, want %+v", policy, want)
794+
}
795+
796+
const methodName = "GetOrganizationForkPRContributorApprovalPermissions"
797+
testBadOptions(t, methodName, func() (err error) {
798+
_, _, err = client.Actions.GetOrganizationForkPRContributorApprovalPermissions(ctx, "\n")
799+
return err
800+
})
801+
802+
testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
803+
got, resp, err := client.Actions.GetOrganizationForkPRContributorApprovalPermissions(ctx, "o")
804+
if got != nil {
805+
t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
806+
}
807+
return resp, err
808+
})
809+
}
810+
811+
func TestActionsService_UpdateOrganizationForkPRContributorApprovalPermissions(t *testing.T) {
812+
t.Parallel()
813+
client, mux, _ := setup(t)
814+
815+
input := ContributorApprovalPermissions{ApprovalPolicy: "require_approval"}
816+
817+
mux.HandleFunc("/orgs/o/actions/permissions/fork-pr-contributor-approval", func(w http.ResponseWriter, r *http.Request) {
818+
v := new(ContributorApprovalPermissions)
819+
assertNilError(t, json.NewDecoder(r.Body).Decode(v))
820+
821+
testMethod(t, r, "PUT")
822+
if !cmp.Equal(v, &input) {
823+
t.Errorf("Request body = %+v, want %+v", v, &input)
824+
}
825+
w.WriteHeader(http.StatusNoContent)
826+
})
827+
828+
ctx := t.Context()
829+
resp, err := client.Actions.UpdateOrganizationForkPRContributorApprovalPermissions(ctx, "o", input)
830+
if err != nil {
831+
t.Errorf("Actions.UpdateOrganizationForkPRContributorApprovalPermissions returned error: %v", err)
832+
}
833+
834+
if resp.StatusCode != http.StatusNoContent {
835+
t.Errorf("Actions.UpdateOrganizationForkPRContributorApprovalPermissions = %v, want %v", resp.StatusCode, http.StatusNoContent)
836+
}
837+
838+
const methodName = "UpdateOrganizationForkPRContributorApprovalPermissions"
839+
testBadOptions(t, methodName, func() (err error) {
840+
_, err = client.Actions.UpdateOrganizationForkPRContributorApprovalPermissions(ctx, "\n", input)
841+
return err
842+
})
843+
844+
testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
845+
return client.Actions.UpdateOrganizationForkPRContributorApprovalPermissions(ctx, "o", input)
846+
})
847+
}

github/actions_workflows.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,16 @@ type WorkflowsPermissionsOpt struct {
7676
RequireApprovalForForkPRWorkflows *bool `json:"require_approval_for_fork_pr_workflows,omitempty"`
7777
}
7878

79+
// ContributorApprovalPermissions represents the policy that controls
80+
// when fork PR workflows require approval from a maintainer.
81+
type ContributorApprovalPermissions struct {
82+
ApprovalPolicy string `json:"approval_policy"`
83+
}
84+
85+
func (p ContributorApprovalPermissions) String() string {
86+
return Stringify(p)
87+
}
88+
7989
// ListWorkflows lists all workflows in a repository.
8090
//
8191
// GitHub API docs: https://docs.github.com/rest/actions/workflows#list-repository-workflows

github/github-stringify_test.go

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

github/repos_actions_permissions.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,3 +190,40 @@ func (s *RepositoriesService) UpdatePrivateRepoForkPRWorkflowSettings(ctx contex
190190

191191
return s.client.Do(ctx, req, nil)
192192
}
193+
194+
// GetForkPRContributorApprovalPermissions gets the fork PR contributor approval policy for a repository.
195+
//
196+
// GitHub API docs: https://docs.github.com/rest/actions/permissions#get-fork-pr-contributor-approval-permissions-for-a-repository
197+
//
198+
//meta:operation GET /repos/{owner}/{repo}/actions/permissions/fork-pr-contributor-approval
199+
func (s *ActionsService) GetForkPRContributorApprovalPermissions(ctx context.Context, owner, repo string) (*ContributorApprovalPermissions, *Response, error) {
200+
u := fmt.Sprintf("repos/%v/%v/actions/permissions/fork-pr-contributor-approval", owner, repo)
201+
202+
req, err := s.client.NewRequest("GET", u, nil)
203+
if err != nil {
204+
return nil, nil, err
205+
}
206+
207+
policy := new(ContributorApprovalPermissions)
208+
resp, err := s.client.Do(ctx, req, policy)
209+
if err != nil {
210+
return nil, resp, err
211+
}
212+
213+
return policy, resp, nil
214+
}
215+
216+
// UpdateForkPRContributorApprovalPermissions sets the fork PR contributor approval policy for a repository.
217+
//
218+
// GitHub API docs: https://docs.github.com/rest/actions/permissions#set-fork-pr-contributor-approval-permissions-for-a-repository
219+
//
220+
//meta:operation PUT /repos/{owner}/{repo}/actions/permissions/fork-pr-contributor-approval
221+
func (s *ActionsService) UpdateForkPRContributorApprovalPermissions(ctx context.Context, owner, repo string, policy ContributorApprovalPermissions) (*Response, error) {
222+
u := fmt.Sprintf("repos/%v/%v/actions/permissions/fork-pr-contributor-approval", owner, repo)
223+
req, err := s.client.NewRequest("PUT", u, policy)
224+
if err != nil {
225+
return nil, err
226+
}
227+
228+
return s.client.Do(ctx, req, nil)
229+
}

github/repos_actions_permissions_test.go

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -345,3 +345,75 @@ func TestRepositoriesService_UpdatePrivateRepoForkPRWorkflowSettings(t *testing.
345345
return client.Repositories.UpdatePrivateRepoForkPRWorkflowSettings(ctx, "o", "r", input)
346346
})
347347
}
348+
349+
func TestActionsService_GetForkPRContributorApprovalPermissions(t *testing.T) {
350+
t.Parallel()
351+
client, mux, _ := setup(t)
352+
353+
mux.HandleFunc("/repos/o/r/actions/permissions/fork-pr-contributor-approval", func(w http.ResponseWriter, r *http.Request) {
354+
testMethod(t, r, "GET")
355+
fmt.Fprint(w, `{"approval_policy": "require_approval"}`)
356+
})
357+
358+
ctx := t.Context()
359+
policy, _, err := client.Actions.GetForkPRContributorApprovalPermissions(ctx, "o", "r")
360+
if err != nil {
361+
t.Errorf("Actions.GetForkPRContributorApprovalPermissions returned error: %v", err)
362+
}
363+
want := &ContributorApprovalPermissions{ApprovalPolicy: "require_approval"}
364+
if !cmp.Equal(policy, want) {
365+
t.Errorf("Actions.GetForkPRContributorApprovalPermissions returned %+v, want %+v", policy, want)
366+
}
367+
368+
const methodName = "GetForkPRContributorApprovalPermissions"
369+
testBadOptions(t, methodName, func() (err error) {
370+
_, _, err = client.Actions.GetForkPRContributorApprovalPermissions(ctx, "\n", "\n")
371+
return err
372+
})
373+
374+
testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
375+
got, resp, err := client.Actions.GetForkPRContributorApprovalPermissions(ctx, "o", "r")
376+
if got != nil {
377+
t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
378+
}
379+
return resp, err
380+
})
381+
}
382+
383+
func TestActionsService_UpdateForkPRContributorApprovalPermissions(t *testing.T) {
384+
t.Parallel()
385+
client, mux, _ := setup(t)
386+
387+
input := ContributorApprovalPermissions{ApprovalPolicy: "require_approval"}
388+
389+
mux.HandleFunc("/repos/o/r/actions/permissions/fork-pr-contributor-approval", func(w http.ResponseWriter, r *http.Request) {
390+
v := new(ContributorApprovalPermissions)
391+
assertNilError(t, json.NewDecoder(r.Body).Decode(v))
392+
393+
testMethod(t, r, "PUT")
394+
if !cmp.Equal(v, &input) {
395+
t.Errorf("Request body = %+v, want %+v", v, &input)
396+
}
397+
w.WriteHeader(http.StatusNoContent)
398+
})
399+
400+
ctx := t.Context()
401+
resp, err := client.Actions.UpdateForkPRContributorApprovalPermissions(ctx, "o", "r", input)
402+
if err != nil {
403+
t.Errorf("Actions.UpdateForkPRContributorApprovalPermissions returned error: %v", err)
404+
}
405+
406+
if resp.StatusCode != http.StatusNoContent {
407+
t.Errorf("Actions.UpdateForkPRContributorApprovalPermissions = %v, want %v", resp.StatusCode, http.StatusNoContent)
408+
}
409+
410+
const methodName = "UpdateForkPRContributorApprovalPermissions"
411+
testBadOptions(t, methodName, func() (err error) {
412+
_, err = client.Actions.UpdateForkPRContributorApprovalPermissions(ctx, "\n", "\n", input)
413+
return err
414+
})
415+
416+
testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
417+
return client.Actions.UpdateForkPRContributorApprovalPermissions(ctx, "o", "r", input)
418+
})
419+
}

0 commit comments

Comments
 (0)