Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
86 changes: 80 additions & 6 deletions github/copilot.go
Original file line number Diff line number Diff line change
Expand Up @@ -390,25 +390,77 @@ func (s *CopilotService) ListOrganizationCodingAgentRepositories(ctx context.Con
return result, resp, nil
}

// CopilotOrganizationContentExclusionDetails lists all Copilot content exclusion
// rules for an organization, keyed by repository full name. Each value is the
// list of file paths excluded from Copilot for that repository.
type CopilotOrganizationContentExclusionDetails map[string][]string
// CopilotContentExclusionDetails lists Copilot content exclusion path rules,
// keyed by repository identifier. Each value is the list of file paths excluded
// from Copilot for that repository.
//
// NOTE Breaking API change: renamed from CopilotOrganizationContentExclusionDetails.
Comment on lines +396 to +397

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is not needed:

Suggested change
//
// NOTE Breaking API change: renamed from CopilotOrganizationContentExclusionDetails.

type CopilotContentExclusionDetails map[string][]string

// CopilotContentExclusionUpdateResponse represents the response from setting
// Copilot content exclusion rules.
type CopilotContentExclusionUpdateResponse struct {
Message *string `json:"message,omitempty"`
}

// GetOrganizationContentExclusionDetails gets the Copilot content exclusion rules for an organization.
//
// GitHub API docs: https://docs.github.com/rest/copilot/copilot-content-exclusion-management?apiVersion=2022-11-28#get-copilot-content-exclusion-rules-for-an-organization
//
//meta:operation GET /orgs/{org}/copilot/content_exclusion
func (s *CopilotService) GetOrganizationContentExclusionDetails(ctx context.Context, org string) (CopilotOrganizationContentExclusionDetails, *Response, error) {
func (s *CopilotService) GetOrganizationContentExclusionDetails(ctx context.Context, org string) (CopilotContentExclusionDetails, *Response, error) {
u := fmt.Sprintf("orgs/%v/copilot/content_exclusion", org)

req, err := s.client.NewRequest(ctx, "GET", u, nil)
if err != nil {
return nil, nil, err
}

details := CopilotOrganizationContentExclusionDetails{}
details := CopilotContentExclusionDetails{}
resp, err := s.client.Do(req, &details)
if err != nil {
return nil, resp, err
}

return details, resp, nil
}

// SetOrganizationContentExclusionDetails sets Copilot content exclusion path rules for an organization.
//
// GitHub API docs: https://docs.github.com/rest/copilot/copilot-content-exclusion-management?apiVersion=2022-11-28#set-copilot-content-exclusion-rules-for-an-organization
//
//meta:operation PUT /orgs/{org}/copilot/content_exclusion
func (s *CopilotService) SetOrganizationContentExclusionDetails(ctx context.Context, org string, body CopilotContentExclusionDetails) (*CopilotContentExclusionUpdateResponse, *Response, error) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
func (s *CopilotService) SetOrganizationContentExclusionDetails(ctx context.Context, org string, body CopilotContentExclusionDetails) (*CopilotContentExclusionUpdateResponse, *Response, error) {
func (s *CopilotService) SetOrganizationContentExclusionDetails(ctx context.Context, org string, body CopilotSetContentExclusionDetailsRequest) (*CopilotSetContentExclusionResponse, *Response, error) {

u := fmt.Sprintf("orgs/%v/copilot/content_exclusion", org)

req, err := s.client.NewRequest(ctx, "PUT", u, body)
if err != nil {
return nil, nil, err
}

var result *CopilotContentExclusionUpdateResponse
resp, err := s.client.Do(req, &result)
if err != nil {
return nil, resp, err
}

return result, resp, nil
}

// GetEnterpriseContentExclusionDetails gets the Copilot content exclusion rules for an enterprise.
//
// GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/copilot/copilot-content-exclusion-management?apiVersion=2022-11-28#get-copilot-content-exclusion-rules-for-an-enterprise
//
//meta:operation GET /enterprises/{enterprise}/copilot/content_exclusion
func (s *CopilotService) GetEnterpriseContentExclusionDetails(ctx context.Context, enterprise string) (CopilotContentExclusionDetails, *Response, error) {
u := fmt.Sprintf("enterprises/%v/copilot/content_exclusion", enterprise)

req, err := s.client.NewRequest(ctx, "GET", u, nil)
if err != nil {
return nil, nil, err
}

details := CopilotContentExclusionDetails{}
resp, err := s.client.Do(req, &details)
if err != nil {
return nil, resp, err
Expand All @@ -417,6 +469,28 @@ func (s *CopilotService) GetOrganizationContentExclusionDetails(ctx context.Cont
return details, resp, nil
}

// SetEnterpriseContentExclusionDetails sets Copilot content exclusion path rules for an enterprise.
//
// GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/copilot/copilot-content-exclusion-management?apiVersion=2022-11-28#set-copilot-content-exclusion-rules-for-an-enterprise
//
//meta:operation PUT /enterprises/{enterprise}/copilot/content_exclusion
func (s *CopilotService) SetEnterpriseContentExclusionDetails(ctx context.Context, enterprise string, body CopilotContentExclusionDetails) (*CopilotContentExclusionUpdateResponse, *Response, error) {
u := fmt.Sprintf("enterprises/%v/copilot/content_exclusion", enterprise)

req, err := s.client.NewRequest(ctx, "PUT", u, body)
if err != nil {
return nil, nil, err
}

var result *CopilotContentExclusionUpdateResponse
resp, err := s.client.Do(req, &result)
if err != nil {
return nil, resp, err
}

return result, resp, nil
}

// AddCopilotTeams adds teams to the Copilot for Business subscription for an organization.
//
// GitHub API docs: https://docs.github.com/rest/copilot/copilot-user-management?apiVersion=2022-11-28#add-teams-to-the-copilot-subscription-for-an-organization
Expand Down
128 changes: 127 additions & 1 deletion github/copilot_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -845,7 +845,7 @@ func TestCopilotService_GetOrganizationContentExclusionDetails(t *testing.T) {
t.Errorf("Copilot.GetOrganizationContentExclusionDetails returned error: %v", err)
}

want := CopilotOrganizationContentExclusionDetails{
want := CopilotContentExclusionDetails{
"octo-repo": {"/src/some-dir/kernel.rs"},
"octo-repo-2": {"/docs/secret.md", "**/*.env"},
}
Expand All @@ -869,6 +869,132 @@ func TestCopilotService_GetOrganizationContentExclusionDetails(t *testing.T) {
})
}

func TestCopilotService_SetOrganizationContentExclusionDetails(t *testing.T) {
t.Parallel()
client, mux, _ := setup(t)

input := CopilotContentExclusionDetails{
"octo-repo": {"/src/some-dir/kernel.rs"},
}

mux.HandleFunc("/orgs/o/copilot/content_exclusion", func(w http.ResponseWriter, r *http.Request) {
testMethod(t, r, "PUT")
testJSONBody(t, r, input)
fmt.Fprint(w, `{"message": "Content exclusion rules updated"}`)
})

ctx := t.Context()
got, _, err := client.Copilot.SetOrganizationContentExclusionDetails(ctx, "o", input)
if err != nil {
t.Errorf("Copilot.SetOrganizationContentExclusionDetails returned error: %v", err)
}

want := &CopilotContentExclusionUpdateResponse{
Message: new("Content exclusion rules updated"),
}
if !cmp.Equal(got, want) {
t.Errorf("Copilot.SetOrganizationContentExclusionDetails returned %+v, want %+v", got, want)
}

const methodName = "SetOrganizationContentExclusionDetails"
testBadOptions(t, methodName, func() (err error) {
_, _, err = client.Copilot.SetOrganizationContentExclusionDetails(ctx, "\n", input)
return err
})

testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
got, resp, err := client.Copilot.SetOrganizationContentExclusionDetails(ctx, "o", input)
if got != nil {
t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
}
return resp, err
})
}

func TestCopilotService_GetEnterpriseContentExclusionDetails(t *testing.T) {
t.Parallel()
client, mux, _ := setup(t)

mux.HandleFunc("/enterprises/e/copilot/content_exclusion", func(w http.ResponseWriter, r *http.Request) {
testMethod(t, r, "GET")
fmt.Fprint(w, `{
"git@github.com:*/copilot": ["/__tests__/**"],
"octo-org/octo-repo": ["/src/some-dir/kernel.rs"]
}`)
})

ctx := t.Context()
got, _, err := client.Copilot.GetEnterpriseContentExclusionDetails(ctx, "e")
if err != nil {
t.Errorf("Copilot.GetEnterpriseContentExclusionDetails returned error: %v", err)
}

want := CopilotContentExclusionDetails{
"git@github.com:*/copilot": {"/__tests__/**"},
"octo-org/octo-repo": {"/src/some-dir/kernel.rs"},
}
if !cmp.Equal(got, want) {
t.Errorf("Copilot.GetEnterpriseContentExclusionDetails returned %+v, want %+v", got, want)
}

const methodName = "GetEnterpriseContentExclusionDetails"
testBadOptions(t, methodName, func() (err error) {
_, _, err = client.Copilot.GetEnterpriseContentExclusionDetails(ctx, "\n")
return err
})

testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
got, resp, err := client.Copilot.GetEnterpriseContentExclusionDetails(ctx, "e")
if got != nil {
t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
}
return resp, err
})
}

func TestCopilotService_SetEnterpriseContentExclusionDetails(t *testing.T) {
t.Parallel()
client, mux, _ := setup(t)

input := CopilotContentExclusionDetails{
"git@github.com:*/copilot": {"/__tests__/**"},
"octo-org/octo-repo": {"/src/some-dir/kernel.rs"},
}

mux.HandleFunc("/enterprises/e/copilot/content_exclusion", func(w http.ResponseWriter, r *http.Request) {
testMethod(t, r, "PUT")
testJSONBody(t, r, input)
fmt.Fprint(w, `{"message": "Content exclusion rules updated"}`)
})

ctx := t.Context()
got, _, err := client.Copilot.SetEnterpriseContentExclusionDetails(ctx, "e", input)
if err != nil {
t.Errorf("Copilot.SetEnterpriseContentExclusionDetails returned error: %v", err)
}

want := &CopilotContentExclusionUpdateResponse{
Message: new("Content exclusion rules updated"),
}
if !cmp.Equal(got, want) {
t.Errorf("Copilot.SetEnterpriseContentExclusionDetails returned %+v, want %+v", got, want)
}

const methodName = "SetEnterpriseContentExclusionDetails"
testBadOptions(t, methodName, func() (err error) {
_, _, err = client.Copilot.SetEnterpriseContentExclusionDetails(ctx, "\n", input)
return err
})

testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
got, resp, err := client.Copilot.SetEnterpriseContentExclusionDetails(ctx, "e", input)
if got != nil {
t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
}
return resp, err
})
}

func TestCopilotService_AddCopilotTeams(t *testing.T) {
t.Parallel()
client, mux, _ := setup(t)
Expand Down
8 changes: 8 additions & 0 deletions github/github-accessors.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

11 changes: 11 additions & 0 deletions github/github-accessors_test.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading