diff --git a/github/actions_permissions_enterprise.go b/github/actions_permissions_enterprise.go index f1cada9646b..326230d6490 100644 --- a/github/actions_permissions_enterprise.go +++ b/github/actions_permissions_enterprise.go @@ -375,3 +375,40 @@ func (s *ActionsService) UpdatePrivateRepoForkPRWorkflowSettingsInEnterprise(ctx return s.client.Do(ctx, req, nil) } + +// GetEnterpriseForkPRContributorApprovalPermissions gets the fork PR contributor approval policy for an enterprise. +// +// GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/actions/permissions#get-fork-pr-contributor-approval-permissions-for-an-enterprise +// +//meta:operation GET /enterprises/{enterprise}/actions/permissions/fork-pr-contributor-approval +func (s *ActionsService) GetEnterpriseForkPRContributorApprovalPermissions(ctx context.Context, enterprise string) (*ContributorApprovalPermissions, *Response, error) { + u := fmt.Sprintf("enterprises/%v/actions/permissions/fork-pr-contributor-approval", enterprise) + + req, err := s.client.NewRequest("GET", u, nil) + if err != nil { + return nil, nil, err + } + + policy := new(ContributorApprovalPermissions) + resp, err := s.client.Do(ctx, req, policy) + if err != nil { + return nil, resp, err + } + + return policy, resp, nil +} + +// UpdateEnterpriseForkPRContributorApprovalPermissions sets the fork PR contributor approval policy for an enterprise. +// +// GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/actions/permissions#set-fork-pr-contributor-approval-permissions-for-an-enterprise +// +//meta:operation PUT /enterprises/{enterprise}/actions/permissions/fork-pr-contributor-approval +func (s *ActionsService) UpdateEnterpriseForkPRContributorApprovalPermissions(ctx context.Context, enterprise string, policy ContributorApprovalPermissions) (*Response, error) { + u := fmt.Sprintf("enterprises/%v/actions/permissions/fork-pr-contributor-approval", enterprise) + req, err := s.client.NewRequest("PUT", u, policy) + if err != nil { + return nil, err + } + + return s.client.Do(ctx, req, nil) +} diff --git a/github/actions_permissions_enterprise_test.go b/github/actions_permissions_enterprise_test.go index 53ef67149ed..1b314817412 100644 --- a/github/actions_permissions_enterprise_test.go +++ b/github/actions_permissions_enterprise_test.go @@ -603,3 +603,75 @@ func TestActionsService_UpdatePrivateRepoForkPRWorkflowSettingsInEnterprise(t *t return client.Actions.UpdatePrivateRepoForkPRWorkflowSettingsInEnterprise(ctx, "e", input) }) } + +func TestActionsService_GetEnterpriseForkPRContributorApprovalPermissions(t *testing.T) { + t.Parallel() + client, mux, _ := setup(t) + + mux.HandleFunc("/enterprises/e/actions/permissions/fork-pr-contributor-approval", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "GET") + fmt.Fprint(w, `{"approval_policy": "require_approval"}`) + }) + + ctx := t.Context() + policy, _, err := client.Actions.GetEnterpriseForkPRContributorApprovalPermissions(ctx, "e") + if err != nil { + t.Errorf("Actions.GetEnterpriseForkPRContributorApprovalPermissions returned error: %v", err) + } + want := &ContributorApprovalPermissions{ApprovalPolicy: "require_approval"} + if !cmp.Equal(policy, want) { + t.Errorf("Actions.GetEnterpriseForkPRContributorApprovalPermissions returned %+v, want %+v", policy, want) + } + + const methodName = "GetEnterpriseForkPRContributorApprovalPermissions" + testBadOptions(t, methodName, func() (err error) { + _, _, err = client.Actions.GetEnterpriseForkPRContributorApprovalPermissions(ctx, "\n") + return err + }) + + testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { + got, resp, err := client.Actions.GetEnterpriseForkPRContributorApprovalPermissions(ctx, "e") + if got != nil { + t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) + } + return resp, err + }) +} + +func TestActionsService_UpdateEnterpriseForkPRContributorApprovalPermissions(t *testing.T) { + t.Parallel() + client, mux, _ := setup(t) + + input := ContributorApprovalPermissions{ApprovalPolicy: "require_approval"} + + mux.HandleFunc("/enterprises/e/actions/permissions/fork-pr-contributor-approval", func(w http.ResponseWriter, r *http.Request) { + v := new(ContributorApprovalPermissions) + assertNilError(t, json.NewDecoder(r.Body).Decode(v)) + + testMethod(t, r, "PUT") + if !cmp.Equal(v, &input) { + t.Errorf("Request body = %+v, want %+v", v, &input) + } + w.WriteHeader(http.StatusNoContent) + }) + + ctx := t.Context() + resp, err := client.Actions.UpdateEnterpriseForkPRContributorApprovalPermissions(ctx, "e", input) + if err != nil { + t.Errorf("Actions.UpdateEnterpriseForkPRContributorApprovalPermissions returned error: %v", err) + } + + if resp.StatusCode != http.StatusNoContent { + t.Errorf("Actions.UpdateEnterpriseForkPRContributorApprovalPermissions = %v, want %v", resp.StatusCode, http.StatusNoContent) + } + + const methodName = "UpdateEnterpriseForkPRContributorApprovalPermissions" + testBadOptions(t, methodName, func() (err error) { + _, err = client.Actions.UpdateEnterpriseForkPRContributorApprovalPermissions(ctx, "\n", input) + return err + }) + + testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { + return client.Actions.UpdateEnterpriseForkPRContributorApprovalPermissions(ctx, "e", input) + }) +} diff --git a/github/actions_permissions_orgs.go b/github/actions_permissions_orgs.go index e3912b48358..64e692d70a3 100644 --- a/github/actions_permissions_orgs.go +++ b/github/actions_permissions_orgs.go @@ -483,3 +483,40 @@ func (s *ActionsService) UpdatePrivateRepoForkPRWorkflowSettingsInOrganization(c return s.client.Do(ctx, req, nil) } + +// GetOrganizationForkPRContributorApprovalPermissions gets the fork PR contributor approval policy for an organization. +// +// GitHub API docs: https://docs.github.com/rest/actions/permissions#get-fork-pr-contributor-approval-permissions-for-an-organization +// +//meta:operation GET /orgs/{org}/actions/permissions/fork-pr-contributor-approval +func (s *ActionsService) GetOrganizationForkPRContributorApprovalPermissions(ctx context.Context, org string) (*ContributorApprovalPermissions, *Response, error) { + u := fmt.Sprintf("orgs/%v/actions/permissions/fork-pr-contributor-approval", org) + + req, err := s.client.NewRequest("GET", u, nil) + if err != nil { + return nil, nil, err + } + + policy := new(ContributorApprovalPermissions) + resp, err := s.client.Do(ctx, req, policy) + if err != nil { + return nil, resp, err + } + + return policy, resp, nil +} + +// UpdateOrganizationForkPRContributorApprovalPermissions sets the fork PR contributor approval policy for an organization. +// +// GitHub API docs: https://docs.github.com/rest/actions/permissions#set-fork-pr-contributor-approval-permissions-for-an-organization +// +//meta:operation PUT /orgs/{org}/actions/permissions/fork-pr-contributor-approval +func (s *ActionsService) UpdateOrganizationForkPRContributorApprovalPermissions(ctx context.Context, org string, policy ContributorApprovalPermissions) (*Response, error) { + u := fmt.Sprintf("orgs/%v/actions/permissions/fork-pr-contributor-approval", org) + req, err := s.client.NewRequest("PUT", u, policy) + if err != nil { + return nil, err + } + + return s.client.Do(ctx, req, nil) +} diff --git a/github/actions_permissions_orgs_test.go b/github/actions_permissions_orgs_test.go index 2a0ac0ad02b..9d213423b9a 100644 --- a/github/actions_permissions_orgs_test.go +++ b/github/actions_permissions_orgs_test.go @@ -773,3 +773,75 @@ func TestActionsService_UpdatePrivateRepoForkPRWorkflowSettingsInOrganization(t return client.Actions.UpdatePrivateRepoForkPRWorkflowSettingsInOrganization(ctx, "o", input) }) } + +func TestActionsService_GetOrganizationForkPRContributorApprovalPermissions(t *testing.T) { + t.Parallel() + client, mux, _ := setup(t) + + mux.HandleFunc("/orgs/o/actions/permissions/fork-pr-contributor-approval", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "GET") + fmt.Fprint(w, `{"approval_policy": "require_approval"}`) + }) + + ctx := t.Context() + policy, _, err := client.Actions.GetOrganizationForkPRContributorApprovalPermissions(ctx, "o") + if err != nil { + t.Errorf("Actions.GetOrganizationForkPRContributorApprovalPermissions returned error: %v", err) + } + want := &ContributorApprovalPermissions{ApprovalPolicy: "require_approval"} + if !cmp.Equal(policy, want) { + t.Errorf("Actions.GetOrganizationForkPRContributorApprovalPermissions returned %+v, want %+v", policy, want) + } + + const methodName = "GetOrganizationForkPRContributorApprovalPermissions" + testBadOptions(t, methodName, func() (err error) { + _, _, err = client.Actions.GetOrganizationForkPRContributorApprovalPermissions(ctx, "\n") + return err + }) + + testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { + got, resp, err := client.Actions.GetOrganizationForkPRContributorApprovalPermissions(ctx, "o") + if got != nil { + t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) + } + return resp, err + }) +} + +func TestActionsService_UpdateOrganizationForkPRContributorApprovalPermissions(t *testing.T) { + t.Parallel() + client, mux, _ := setup(t) + + input := ContributorApprovalPermissions{ApprovalPolicy: "require_approval"} + + mux.HandleFunc("/orgs/o/actions/permissions/fork-pr-contributor-approval", func(w http.ResponseWriter, r *http.Request) { + v := new(ContributorApprovalPermissions) + assertNilError(t, json.NewDecoder(r.Body).Decode(v)) + + testMethod(t, r, "PUT") + if !cmp.Equal(v, &input) { + t.Errorf("Request body = %+v, want %+v", v, &input) + } + w.WriteHeader(http.StatusNoContent) + }) + + ctx := t.Context() + resp, err := client.Actions.UpdateOrganizationForkPRContributorApprovalPermissions(ctx, "o", input) + if err != nil { + t.Errorf("Actions.UpdateOrganizationForkPRContributorApprovalPermissions returned error: %v", err) + } + + if resp.StatusCode != http.StatusNoContent { + t.Errorf("Actions.UpdateOrganizationForkPRContributorApprovalPermissions = %v, want %v", resp.StatusCode, http.StatusNoContent) + } + + const methodName = "UpdateOrganizationForkPRContributorApprovalPermissions" + testBadOptions(t, methodName, func() (err error) { + _, err = client.Actions.UpdateOrganizationForkPRContributorApprovalPermissions(ctx, "\n", input) + return err + }) + + testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { + return client.Actions.UpdateOrganizationForkPRContributorApprovalPermissions(ctx, "o", input) + }) +} diff --git a/github/actions_workflows.go b/github/actions_workflows.go index ff82b4c30ed..e0bcde35115 100644 --- a/github/actions_workflows.go +++ b/github/actions_workflows.go @@ -76,6 +76,16 @@ type WorkflowsPermissionsOpt struct { RequireApprovalForForkPRWorkflows *bool `json:"require_approval_for_fork_pr_workflows,omitempty"` } +// ContributorApprovalPermissions represents the policy that controls +// when fork PR workflows require approval from a maintainer. +type ContributorApprovalPermissions struct { + ApprovalPolicy string `json:"approval_policy"` +} + +func (p ContributorApprovalPermissions) String() string { + return Stringify(p) +} + // ListWorkflows lists all workflows in a repository. // // GitHub API docs: https://docs.github.com/rest/actions/workflows#list-repository-workflows diff --git a/github/github-stringify_test.go b/github/github-stringify_test.go index 87f04155cb9..b2ec1ec175b 100644 --- a/github/github-stringify_test.go +++ b/github/github-stringify_test.go @@ -472,6 +472,17 @@ func TestCommitsComparison_String(t *testing.T) { } } +func TestContributorApprovalPermissions_String(t *testing.T) { + t.Parallel() + v := ContributorApprovalPermissions{ + ApprovalPolicy: "", + } + want := `github.ContributorApprovalPermissions{ApprovalPolicy:""}` + if got := v.String(); got != want { + t.Errorf("ContributorApprovalPermissions.String = %v, want %v", got, want) + } +} + func TestContributorStats_String(t *testing.T) { t.Parallel() v := ContributorStats{ diff --git a/github/repos_actions_permissions.go b/github/repos_actions_permissions.go index 4d634464920..751fd79a894 100644 --- a/github/repos_actions_permissions.go +++ b/github/repos_actions_permissions.go @@ -190,3 +190,40 @@ func (s *RepositoriesService) UpdatePrivateRepoForkPRWorkflowSettings(ctx contex return s.client.Do(ctx, req, nil) } + +// GetForkPRContributorApprovalPermissions gets the fork PR contributor approval policy for a repository. +// +// GitHub API docs: https://docs.github.com/rest/actions/permissions#get-fork-pr-contributor-approval-permissions-for-a-repository +// +//meta:operation GET /repos/{owner}/{repo}/actions/permissions/fork-pr-contributor-approval +func (s *ActionsService) GetForkPRContributorApprovalPermissions(ctx context.Context, owner, repo string) (*ContributorApprovalPermissions, *Response, error) { + u := fmt.Sprintf("repos/%v/%v/actions/permissions/fork-pr-contributor-approval", owner, repo) + + req, err := s.client.NewRequest("GET", u, nil) + if err != nil { + return nil, nil, err + } + + policy := new(ContributorApprovalPermissions) + resp, err := s.client.Do(ctx, req, policy) + if err != nil { + return nil, resp, err + } + + return policy, resp, nil +} + +// UpdateForkPRContributorApprovalPermissions sets the fork PR contributor approval policy for a repository. +// +// GitHub API docs: https://docs.github.com/rest/actions/permissions#set-fork-pr-contributor-approval-permissions-for-a-repository +// +//meta:operation PUT /repos/{owner}/{repo}/actions/permissions/fork-pr-contributor-approval +func (s *ActionsService) UpdateForkPRContributorApprovalPermissions(ctx context.Context, owner, repo string, policy ContributorApprovalPermissions) (*Response, error) { + u := fmt.Sprintf("repos/%v/%v/actions/permissions/fork-pr-contributor-approval", owner, repo) + req, err := s.client.NewRequest("PUT", u, policy) + if err != nil { + return nil, err + } + + return s.client.Do(ctx, req, nil) +} diff --git a/github/repos_actions_permissions_test.go b/github/repos_actions_permissions_test.go index 5666c2dc73d..8d07eb7a676 100644 --- a/github/repos_actions_permissions_test.go +++ b/github/repos_actions_permissions_test.go @@ -345,3 +345,75 @@ func TestRepositoriesService_UpdatePrivateRepoForkPRWorkflowSettings(t *testing. return client.Repositories.UpdatePrivateRepoForkPRWorkflowSettings(ctx, "o", "r", input) }) } + +func TestActionsService_GetForkPRContributorApprovalPermissions(t *testing.T) { + t.Parallel() + client, mux, _ := setup(t) + + mux.HandleFunc("/repos/o/r/actions/permissions/fork-pr-contributor-approval", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "GET") + fmt.Fprint(w, `{"approval_policy": "require_approval"}`) + }) + + ctx := t.Context() + policy, _, err := client.Actions.GetForkPRContributorApprovalPermissions(ctx, "o", "r") + if err != nil { + t.Errorf("Actions.GetForkPRContributorApprovalPermissions returned error: %v", err) + } + want := &ContributorApprovalPermissions{ApprovalPolicy: "require_approval"} + if !cmp.Equal(policy, want) { + t.Errorf("Actions.GetForkPRContributorApprovalPermissions returned %+v, want %+v", policy, want) + } + + const methodName = "GetForkPRContributorApprovalPermissions" + testBadOptions(t, methodName, func() (err error) { + _, _, err = client.Actions.GetForkPRContributorApprovalPermissions(ctx, "\n", "\n") + return err + }) + + testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { + got, resp, err := client.Actions.GetForkPRContributorApprovalPermissions(ctx, "o", "r") + if got != nil { + t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) + } + return resp, err + }) +} + +func TestActionsService_UpdateForkPRContributorApprovalPermissions(t *testing.T) { + t.Parallel() + client, mux, _ := setup(t) + + input := ContributorApprovalPermissions{ApprovalPolicy: "require_approval"} + + mux.HandleFunc("/repos/o/r/actions/permissions/fork-pr-contributor-approval", func(w http.ResponseWriter, r *http.Request) { + v := new(ContributorApprovalPermissions) + assertNilError(t, json.NewDecoder(r.Body).Decode(v)) + + testMethod(t, r, "PUT") + if !cmp.Equal(v, &input) { + t.Errorf("Request body = %+v, want %+v", v, &input) + } + w.WriteHeader(http.StatusNoContent) + }) + + ctx := t.Context() + resp, err := client.Actions.UpdateForkPRContributorApprovalPermissions(ctx, "o", "r", input) + if err != nil { + t.Errorf("Actions.UpdateForkPRContributorApprovalPermissions returned error: %v", err) + } + + if resp.StatusCode != http.StatusNoContent { + t.Errorf("Actions.UpdateForkPRContributorApprovalPermissions = %v, want %v", resp.StatusCode, http.StatusNoContent) + } + + const methodName = "UpdateForkPRContributorApprovalPermissions" + testBadOptions(t, methodName, func() (err error) { + _, err = client.Actions.UpdateForkPRContributorApprovalPermissions(ctx, "\n", "\n", input) + return err + }) + + testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { + return client.Actions.UpdateForkPRContributorApprovalPermissions(ctx, "o", "r", input) + }) +}