Skip to content

Commit 18ac81b

Browse files
Add support for organization Immutable Releases API (#3774)
1 parent 06b8b3a commit 18ac81b

4 files changed

Lines changed: 497 additions & 0 deletions

File tree

github/github-accessors.go

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

github/github-accessors_test.go

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

github/orgs_immutable_releases.go

Lines changed: 174 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,174 @@
1+
// Copyright 2025 The go-github AUTHORS. All rights reserved.
2+
//
3+
// Use of this source code is governed by a BSD-style
4+
// license that can be found in the LICENSE file.
5+
6+
package github
7+
8+
import (
9+
"context"
10+
"fmt"
11+
)
12+
13+
// ImmutableReleaseSettings represents the response from the immutable releases settings endpoint.
14+
type ImmutableReleaseSettings struct {
15+
// EnforcedRepositories specifies how immutable releases are enforced in the organization. Possible values include "all", "none", or "selected".
16+
EnforcedRepositories *string `json:"enforced_repositories,omitempty"`
17+
// SelectedRepositoriesURL provides the API URL for managing the repositories
18+
// selected for immutable releases enforcement when EnforcedRepositories is set to "selected".
19+
SelectedRepositoriesURL *string `json:"selected_repositories_url,omitempty"`
20+
}
21+
22+
// ImmutableReleasePolicy is for setting the immutable releases policy for repositories in an organization.
23+
type ImmutableReleasePolicy struct {
24+
// EnforcedRepositories specifies how immutable releases are enforced in the organization. Possible values include "all", "none", or "selected".
25+
EnforcedRepositories *string `json:"enforced_repositories,omitempty"`
26+
// An array of repository ids for which immutable releases enforcement should be applied.
27+
// You can only provide a list of repository ids when the enforced_repositories is set to "selected"
28+
SelectedRepositoryIDs []int64 `json:"selected_repository_ids,omitempty"`
29+
}
30+
31+
// setImmutableReleasesRepositoriesOptions represents the request body for setting repositories.
32+
type setImmutableReleasesRepositoriesOptions struct {
33+
SelectedRepositoryIDs []int64 `json:"selected_repository_ids"`
34+
}
35+
36+
// GetImmutableReleasesSettings returns the immutable releases configuration that applies to repositories within the given organization.
37+
//
38+
// GitHub API docs: https://docs.github.com/rest/orgs/orgs#get-immutable-releases-settings-for-an-organization
39+
//
40+
//meta:operation GET /orgs/{org}/settings/immutable-releases
41+
func (s *OrganizationsService) GetImmutableReleasesSettings(ctx context.Context, org string) (*ImmutableReleaseSettings, *Response, error) {
42+
u := fmt.Sprintf("orgs/%v/settings/immutable-releases", org)
43+
44+
req, err := s.client.NewRequest("GET", u, nil)
45+
if err != nil {
46+
return nil, nil, err
47+
}
48+
49+
var settings *ImmutableReleaseSettings
50+
resp, err := s.client.Do(ctx, req, &settings)
51+
if err != nil {
52+
return nil, resp, err
53+
}
54+
55+
return settings, resp, nil
56+
}
57+
58+
// UpdateImmutableReleasesSettings sets immutable releases settings for an organization.
59+
//
60+
// GitHub API docs: https://docs.github.com/rest/orgs/orgs#set-immutable-releases-settings-for-an-organization
61+
//
62+
//meta:operation PUT /orgs/{org}/settings/immutable-releases
63+
func (s *OrganizationsService) UpdateImmutableReleasesSettings(ctx context.Context, org string, opts ImmutableReleasePolicy) (*Response, error) {
64+
u := fmt.Sprintf("orgs/%v/settings/immutable-releases", org)
65+
66+
req, err := s.client.NewRequest("PUT", u, opts)
67+
if err != nil {
68+
return nil, err
69+
}
70+
71+
resp, err := s.client.Do(ctx, req, nil)
72+
if err != nil {
73+
return resp, err
74+
}
75+
76+
return resp, nil
77+
}
78+
79+
// ListImmutableReleaseRepositories lists selected repositories for immutable releases enforcement in an organization.
80+
//
81+
// GitHub API docs: https://docs.github.com/rest/orgs/orgs#list-selected-repositories-for-immutable-releases-enforcement
82+
//
83+
//meta:operation GET /orgs/{org}/settings/immutable-releases/repositories
84+
func (s *OrganizationsService) ListImmutableReleaseRepositories(ctx context.Context, org string, opts *ListOptions) (*ListRepositories, *Response, error) {
85+
u := fmt.Sprintf("orgs/%v/settings/immutable-releases/repositories", org)
86+
87+
u, err := addOptions(u, opts)
88+
if err != nil {
89+
return nil, nil, err
90+
}
91+
92+
req, err := s.client.NewRequest("GET", u, nil)
93+
if err != nil {
94+
return nil, nil, err
95+
}
96+
97+
var repositories *ListRepositories
98+
resp, err := s.client.Do(ctx, req, &repositories)
99+
if err != nil {
100+
return nil, resp, err
101+
}
102+
103+
return repositories, resp, nil
104+
}
105+
106+
// SetImmutableReleaseRepositories sets selected repositories for immutable releases enforcement.
107+
// It requires the organization's immutable releases policy for enforced_repositories to be set to "selected".
108+
//
109+
// GitHub API docs: https://docs.github.com/rest/orgs/orgs#set-selected-repositories-for-immutable-releases-enforcement
110+
//
111+
//meta:operation PUT /orgs/{org}/settings/immutable-releases/repositories
112+
func (s *OrganizationsService) SetImmutableReleaseRepositories(ctx context.Context, org string, repositoryIDs []int64) (*Response, error) {
113+
u := fmt.Sprintf("orgs/%v/settings/immutable-releases/repositories", org)
114+
115+
body := &setImmutableReleasesRepositoriesOptions{
116+
SelectedRepositoryIDs: repositoryIDs,
117+
}
118+
119+
req, err := s.client.NewRequest("PUT", u, body)
120+
if err != nil {
121+
return nil, err
122+
}
123+
124+
resp, err := s.client.Do(ctx, req, nil)
125+
if err != nil {
126+
return resp, err
127+
}
128+
129+
return resp, nil
130+
}
131+
132+
// EnableRepositoryForImmutableRelease enables a selected repository for immutable releases in an organization.
133+
// It requires enforced_repositories to be set to "selected".
134+
//
135+
// GitHub API docs: https://docs.github.com/rest/orgs/orgs#enable-a-selected-repository-for-immutable-releases-in-an-organization
136+
//
137+
//meta:operation PUT /orgs/{org}/settings/immutable-releases/repositories/{repository_id}
138+
func (s *OrganizationsService) EnableRepositoryForImmutableRelease(ctx context.Context, org string, repoID int64) (*Response, error) {
139+
u := fmt.Sprintf("orgs/%v/settings/immutable-releases/repositories/%v", org, repoID)
140+
141+
req, err := s.client.NewRequest("PUT", u, nil)
142+
if err != nil {
143+
return nil, err
144+
}
145+
146+
resp, err := s.client.Do(ctx, req, nil)
147+
if err != nil {
148+
return resp, err
149+
}
150+
151+
return resp, nil
152+
}
153+
154+
// DisableRepositoryForImmutableRelease removes a repository from the organization's selected list for immutable releases enforcement.
155+
// It requires enforced_repositories to be set to "selected".
156+
//
157+
// GitHub API docs: https://docs.github.com/rest/orgs/orgs#disable-a-selected-repository-for-immutable-releases-in-an-organization
158+
//
159+
//meta:operation DELETE /orgs/{org}/settings/immutable-releases/repositories/{repository_id}
160+
func (s *OrganizationsService) DisableRepositoryForImmutableRelease(ctx context.Context, org string, repoID int64) (*Response, error) {
161+
u := fmt.Sprintf("orgs/%v/settings/immutable-releases/repositories/%v", org, repoID)
162+
163+
req, err := s.client.NewRequest("DELETE", u, nil)
164+
if err != nil {
165+
return nil, err
166+
}
167+
168+
resp, err := s.client.Do(ctx, req, nil)
169+
if err != nil {
170+
return resp, err
171+
}
172+
173+
return resp, nil
174+
}

0 commit comments

Comments
 (0)