1
2
3
4
5
6 package github
7
8 import (
9 "context"
10 "encoding/json"
11 "errors"
12 "fmt"
13 "net/http"
14 "strings"
15 )
16
17 const githubBranchNotProtected string = "Branch not protected"
18
19 var ErrBranchNotProtected = errors.New("branch is not protected")
20
21
22
23
24
25 type RepositoriesService service
26
27
28 type Repository struct {
29 ID *int64 `json:"id,omitempty"`
30 NodeID *string `json:"node_id,omitempty"`
31 Owner *User `json:"owner,omitempty"`
32 Name *string `json:"name,omitempty"`
33 FullName *string `json:"full_name,omitempty"`
34 Description *string `json:"description,omitempty"`
35 Homepage *string `json:"homepage,omitempty"`
36 CodeOfConduct *CodeOfConduct `json:"code_of_conduct,omitempty"`
37 DefaultBranch *string `json:"default_branch,omitempty"`
38 MasterBranch *string `json:"master_branch,omitempty"`
39 CreatedAt *Timestamp `json:"created_at,omitempty"`
40 PushedAt *Timestamp `json:"pushed_at,omitempty"`
41 UpdatedAt *Timestamp `json:"updated_at,omitempty"`
42 HTMLURL *string `json:"html_url,omitempty"`
43 CloneURL *string `json:"clone_url,omitempty"`
44 GitURL *string `json:"git_url,omitempty"`
45 MirrorURL *string `json:"mirror_url,omitempty"`
46 SSHURL *string `json:"ssh_url,omitempty"`
47 SVNURL *string `json:"svn_url,omitempty"`
48 Language *string `json:"language,omitempty"`
49 Fork *bool `json:"fork,omitempty"`
50 ForksCount *int `json:"forks_count,omitempty"`
51 NetworkCount *int `json:"network_count,omitempty"`
52 OpenIssuesCount *int `json:"open_issues_count,omitempty"`
53 OpenIssues *int `json:"open_issues,omitempty"`
54 StargazersCount *int `json:"stargazers_count,omitempty"`
55 SubscribersCount *int `json:"subscribers_count,omitempty"`
56 WatchersCount *int `json:"watchers_count,omitempty"`
57 Watchers *int `json:"watchers,omitempty"`
58 Size *int `json:"size,omitempty"`
59 AutoInit *bool `json:"auto_init,omitempty"`
60 Parent *Repository `json:"parent,omitempty"`
61 Source *Repository `json:"source,omitempty"`
62 TemplateRepository *Repository `json:"template_repository,omitempty"`
63 Organization *Organization `json:"organization,omitempty"`
64 Permissions map[string]bool `json:"permissions,omitempty"`
65 AllowRebaseMerge *bool `json:"allow_rebase_merge,omitempty"`
66 AllowUpdateBranch *bool `json:"allow_update_branch,omitempty"`
67 AllowSquashMerge *bool `json:"allow_squash_merge,omitempty"`
68 AllowMergeCommit *bool `json:"allow_merge_commit,omitempty"`
69 AllowAutoMerge *bool `json:"allow_auto_merge,omitempty"`
70 AllowForking *bool `json:"allow_forking,omitempty"`
71 WebCommitSignoffRequired *bool `json:"web_commit_signoff_required,omitempty"`
72 DeleteBranchOnMerge *bool `json:"delete_branch_on_merge,omitempty"`
73 UseSquashPRTitleAsDefault *bool `json:"use_squash_pr_title_as_default,omitempty"`
74 SquashMergeCommitTitle *string `json:"squash_merge_commit_title,omitempty"`
75 SquashMergeCommitMessage *string `json:"squash_merge_commit_message,omitempty"`
76 MergeCommitTitle *string `json:"merge_commit_title,omitempty"`
77 MergeCommitMessage *string `json:"merge_commit_message,omitempty"`
78 Topics []string `json:"topics,omitempty"`
79 Archived *bool `json:"archived,omitempty"`
80 Disabled *bool `json:"disabled,omitempty"`
81
82
83 License *License `json:"license,omitempty"`
84
85
86 Private *bool `json:"private,omitempty"`
87 HasIssues *bool `json:"has_issues,omitempty"`
88 HasWiki *bool `json:"has_wiki,omitempty"`
89 HasPages *bool `json:"has_pages,omitempty"`
90 HasProjects *bool `json:"has_projects,omitempty"`
91 HasDownloads *bool `json:"has_downloads,omitempty"`
92 HasDiscussions *bool `json:"has_discussions,omitempty"`
93 IsTemplate *bool `json:"is_template,omitempty"`
94 LicenseTemplate *string `json:"license_template,omitempty"`
95 GitignoreTemplate *string `json:"gitignore_template,omitempty"`
96
97
98 SecurityAndAnalysis *SecurityAndAnalysis `json:"security_and_analysis,omitempty"`
99
100
101 TeamID *int64 `json:"team_id,omitempty"`
102
103
104 URL *string `json:"url,omitempty"`
105 ArchiveURL *string `json:"archive_url,omitempty"`
106 AssigneesURL *string `json:"assignees_url,omitempty"`
107 BlobsURL *string `json:"blobs_url,omitempty"`
108 BranchesURL *string `json:"branches_url,omitempty"`
109 CollaboratorsURL *string `json:"collaborators_url,omitempty"`
110 CommentsURL *string `json:"comments_url,omitempty"`
111 CommitsURL *string `json:"commits_url,omitempty"`
112 CompareURL *string `json:"compare_url,omitempty"`
113 ContentsURL *string `json:"contents_url,omitempty"`
114 ContributorsURL *string `json:"contributors_url,omitempty"`
115 DeploymentsURL *string `json:"deployments_url,omitempty"`
116 DownloadsURL *string `json:"downloads_url,omitempty"`
117 EventsURL *string `json:"events_url,omitempty"`
118 ForksURL *string `json:"forks_url,omitempty"`
119 GitCommitsURL *string `json:"git_commits_url,omitempty"`
120 GitRefsURL *string `json:"git_refs_url,omitempty"`
121 GitTagsURL *string `json:"git_tags_url,omitempty"`
122 HooksURL *string `json:"hooks_url,omitempty"`
123 IssueCommentURL *string `json:"issue_comment_url,omitempty"`
124 IssueEventsURL *string `json:"issue_events_url,omitempty"`
125 IssuesURL *string `json:"issues_url,omitempty"`
126 KeysURL *string `json:"keys_url,omitempty"`
127 LabelsURL *string `json:"labels_url,omitempty"`
128 LanguagesURL *string `json:"languages_url,omitempty"`
129 MergesURL *string `json:"merges_url,omitempty"`
130 MilestonesURL *string `json:"milestones_url,omitempty"`
131 NotificationsURL *string `json:"notifications_url,omitempty"`
132 PullsURL *string `json:"pulls_url,omitempty"`
133 ReleasesURL *string `json:"releases_url,omitempty"`
134 StargazersURL *string `json:"stargazers_url,omitempty"`
135 StatusesURL *string `json:"statuses_url,omitempty"`
136 SubscribersURL *string `json:"subscribers_url,omitempty"`
137 SubscriptionURL *string `json:"subscription_url,omitempty"`
138 TagsURL *string `json:"tags_url,omitempty"`
139 TreesURL *string `json:"trees_url,omitempty"`
140 TeamsURL *string `json:"teams_url,omitempty"`
141
142
143
144 TextMatches []*TextMatch `json:"text_matches,omitempty"`
145
146
147
148
149 Visibility *string `json:"visibility,omitempty"`
150
151
152
153 RoleName *string `json:"role_name,omitempty"`
154 }
155
156 func (r Repository) String() string {
157 return Stringify(r)
158 }
159
160
161
162 type BranchListOptions struct {
163
164
165
166
167 Protected *bool `url:"protected,omitempty"`
168
169 ListOptions
170 }
171
172
173
174 type RepositoryListOptions struct {
175
176
177 Visibility string `url:"visibility,omitempty"`
178
179
180
181
182
183
184
185
186
187
188 Affiliation string `url:"affiliation,omitempty"`
189
190
191
192
193
194 Type string `url:"type,omitempty"`
195
196
197
198 Sort string `url:"sort,omitempty"`
199
200
201
202 Direction string `url:"direction,omitempty"`
203
204 ListOptions
205 }
206
207
208
209 type SecurityAndAnalysis struct {
210 AdvancedSecurity *AdvancedSecurity `json:"advanced_security,omitempty"`
211 SecretScanning *SecretScanning `json:"secret_scanning,omitempty"`
212 SecretScanningPushProtection *SecretScanningPushProtection `json:"secret_scanning_push_protection,omitempty"`
213 DependabotSecurityUpdates *DependabotSecurityUpdates `json:"dependabot_security_updates,omitempty"`
214 }
215
216 func (s SecurityAndAnalysis) String() string {
217 return Stringify(s)
218 }
219
220
221
222
223 type AdvancedSecurity struct {
224 Status *string `json:"status,omitempty"`
225 }
226
227 func (a AdvancedSecurity) String() string {
228 return Stringify(a)
229 }
230
231
232
233
234 type SecretScanning struct {
235 Status *string `json:"status,omitempty"`
236 }
237
238 func (s SecretScanning) String() string {
239 return Stringify(s)
240 }
241
242
243
244
245 type SecretScanningPushProtection struct {
246 Status *string `json:"status,omitempty"`
247 }
248
249 func (s SecretScanningPushProtection) String() string {
250 return Stringify(s)
251 }
252
253
254
255
256 type DependabotSecurityUpdates struct {
257 Status *string `json:"status,omitempty"`
258 }
259
260 func (d DependabotSecurityUpdates) String() string {
261 return Stringify(d)
262 }
263
264
265
266
267
268
269 func (s *RepositoriesService) List(ctx context.Context, user string, opts *RepositoryListOptions) ([]*Repository, *Response, error) {
270 var u string
271 if user != "" {
272 u = fmt.Sprintf("users/%v/repos", user)
273 } else {
274 u = "user/repos"
275 }
276 u, err := addOptions(u, opts)
277 if err != nil {
278 return nil, nil, err
279 }
280
281 req, err := s.client.NewRequest("GET", u, nil)
282 if err != nil {
283 return nil, nil, err
284 }
285
286
287 acceptHeaders := []string{mediaTypeTopicsPreview, mediaTypeRepositoryVisibilityPreview}
288 req.Header.Set("Accept", strings.Join(acceptHeaders, ", "))
289
290 var repos []*Repository
291 resp, err := s.client.Do(ctx, req, &repos)
292 if err != nil {
293 return nil, resp, err
294 }
295
296 return repos, resp, nil
297 }
298
299
300
301 type RepositoryListByOrgOptions struct {
302
303
304 Type string `url:"type,omitempty"`
305
306
307
308 Sort string `url:"sort,omitempty"`
309
310
311
312 Direction string `url:"direction,omitempty"`
313
314 ListOptions
315 }
316
317
318
319
320 func (s *RepositoriesService) ListByOrg(ctx context.Context, org string, opts *RepositoryListByOrgOptions) ([]*Repository, *Response, error) {
321 u := fmt.Sprintf("orgs/%v/repos", org)
322 u, err := addOptions(u, opts)
323 if err != nil {
324 return nil, nil, err
325 }
326
327 req, err := s.client.NewRequest("GET", u, nil)
328 if err != nil {
329 return nil, nil, err
330 }
331
332
333 acceptHeaders := []string{mediaTypeTopicsPreview, mediaTypeRepositoryVisibilityPreview}
334 req.Header.Set("Accept", strings.Join(acceptHeaders, ", "))
335
336 var repos []*Repository
337 resp, err := s.client.Do(ctx, req, &repos)
338 if err != nil {
339 return nil, resp, err
340 }
341
342 return repos, resp, nil
343 }
344
345
346
347 type RepositoryListAllOptions struct {
348
349 Since int64 `url:"since,omitempty"`
350 }
351
352
353
354
355 func (s *RepositoriesService) ListAll(ctx context.Context, opts *RepositoryListAllOptions) ([]*Repository, *Response, error) {
356 u, err := addOptions("repositories", opts)
357 if err != nil {
358 return nil, nil, err
359 }
360
361 req, err := s.client.NewRequest("GET", u, nil)
362 if err != nil {
363 return nil, nil, err
364 }
365
366 var repos []*Repository
367 resp, err := s.client.Do(ctx, req, &repos)
368 if err != nil {
369 return nil, resp, err
370 }
371
372 return repos, resp, nil
373 }
374
375
376
377
378
379
380 type createRepoRequest struct {
381
382 Name *string `json:"name,omitempty"`
383 Description *string `json:"description,omitempty"`
384 Homepage *string `json:"homepage,omitempty"`
385
386 Private *bool `json:"private,omitempty"`
387 Visibility *string `json:"visibility,omitempty"`
388 HasIssues *bool `json:"has_issues,omitempty"`
389 HasProjects *bool `json:"has_projects,omitempty"`
390 HasWiki *bool `json:"has_wiki,omitempty"`
391 HasDiscussions *bool `json:"has_discussions,omitempty"`
392 IsTemplate *bool `json:"is_template,omitempty"`
393
394
395 TeamID *int64 `json:"team_id,omitempty"`
396
397 AutoInit *bool `json:"auto_init,omitempty"`
398 GitignoreTemplate *string `json:"gitignore_template,omitempty"`
399 LicenseTemplate *string `json:"license_template,omitempty"`
400 AllowSquashMerge *bool `json:"allow_squash_merge,omitempty"`
401 AllowMergeCommit *bool `json:"allow_merge_commit,omitempty"`
402 AllowRebaseMerge *bool `json:"allow_rebase_merge,omitempty"`
403 AllowUpdateBranch *bool `json:"allow_update_branch,omitempty"`
404 AllowAutoMerge *bool `json:"allow_auto_merge,omitempty"`
405 AllowForking *bool `json:"allow_forking,omitempty"`
406 DeleteBranchOnMerge *bool `json:"delete_branch_on_merge,omitempty"`
407 UseSquashPRTitleAsDefault *bool `json:"use_squash_pr_title_as_default,omitempty"`
408 SquashMergeCommitTitle *string `json:"squash_merge_commit_title,omitempty"`
409 SquashMergeCommitMessage *string `json:"squash_merge_commit_message,omitempty"`
410 MergeCommitTitle *string `json:"merge_commit_title,omitempty"`
411 MergeCommitMessage *string `json:"merge_commit_message,omitempty"`
412 }
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428 func (s *RepositoriesService) Create(ctx context.Context, org string, repo *Repository) (*Repository, *Response, error) {
429 var u string
430 if org != "" {
431 u = fmt.Sprintf("orgs/%v/repos", org)
432 } else {
433 u = "user/repos"
434 }
435
436 repoReq := &createRepoRequest{
437 Name: repo.Name,
438 Description: repo.Description,
439 Homepage: repo.Homepage,
440 Private: repo.Private,
441 Visibility: repo.Visibility,
442 HasIssues: repo.HasIssues,
443 HasProjects: repo.HasProjects,
444 HasWiki: repo.HasWiki,
445 HasDiscussions: repo.HasDiscussions,
446 IsTemplate: repo.IsTemplate,
447 TeamID: repo.TeamID,
448 AutoInit: repo.AutoInit,
449 GitignoreTemplate: repo.GitignoreTemplate,
450 LicenseTemplate: repo.LicenseTemplate,
451 AllowSquashMerge: repo.AllowSquashMerge,
452 AllowMergeCommit: repo.AllowMergeCommit,
453 AllowRebaseMerge: repo.AllowRebaseMerge,
454 AllowUpdateBranch: repo.AllowUpdateBranch,
455 AllowAutoMerge: repo.AllowAutoMerge,
456 AllowForking: repo.AllowForking,
457 DeleteBranchOnMerge: repo.DeleteBranchOnMerge,
458 UseSquashPRTitleAsDefault: repo.UseSquashPRTitleAsDefault,
459 SquashMergeCommitTitle: repo.SquashMergeCommitTitle,
460 SquashMergeCommitMessage: repo.SquashMergeCommitMessage,
461 MergeCommitTitle: repo.MergeCommitTitle,
462 MergeCommitMessage: repo.MergeCommitMessage,
463 }
464
465 req, err := s.client.NewRequest("POST", u, repoReq)
466 if err != nil {
467 return nil, nil, err
468 }
469
470 acceptHeaders := []string{mediaTypeRepositoryTemplatePreview, mediaTypeRepositoryVisibilityPreview}
471 req.Header.Set("Accept", strings.Join(acceptHeaders, ", "))
472 r := new(Repository)
473 resp, err := s.client.Do(ctx, req, r)
474 if err != nil {
475 return nil, resp, err
476 }
477
478 return r, resp, nil
479 }
480
481
482 type TemplateRepoRequest struct {
483
484 Name *string `json:"name,omitempty"`
485 Owner *string `json:"owner,omitempty"`
486 Description *string `json:"description,omitempty"`
487
488 IncludeAllBranches *bool `json:"include_all_branches,omitempty"`
489 Private *bool `json:"private,omitempty"`
490 }
491
492
493
494
495 func (s *RepositoriesService) CreateFromTemplate(ctx context.Context, templateOwner, templateRepo string, templateRepoReq *TemplateRepoRequest) (*Repository, *Response, error) {
496 u := fmt.Sprintf("repos/%v/%v/generate", templateOwner, templateRepo)
497
498 req, err := s.client.NewRequest("POST", u, templateRepoReq)
499 if err != nil {
500 return nil, nil, err
501 }
502
503 req.Header.Set("Accept", mediaTypeRepositoryTemplatePreview)
504 r := new(Repository)
505 resp, err := s.client.Do(ctx, req, r)
506 if err != nil {
507 return nil, resp, err
508 }
509
510 return r, resp, nil
511 }
512
513
514
515
516 func (s *RepositoriesService) Get(ctx context.Context, owner, repo string) (*Repository, *Response, error) {
517 u := fmt.Sprintf("repos/%v/%v", owner, repo)
518 req, err := s.client.NewRequest("GET", u, nil)
519 if err != nil {
520 return nil, nil, err
521 }
522
523
524
525 acceptHeaders := []string{
526 mediaTypeCodesOfConductPreview,
527 mediaTypeTopicsPreview,
528 mediaTypeRepositoryTemplatePreview,
529 mediaTypeRepositoryVisibilityPreview,
530 }
531 req.Header.Set("Accept", strings.Join(acceptHeaders, ", "))
532
533 repository := new(Repository)
534 resp, err := s.client.Do(ctx, req, repository)
535 if err != nil {
536 return nil, resp, err
537 }
538
539 return repository, resp, nil
540 }
541
542
543
544
545
546
547 func (s *RepositoriesService) GetCodeOfConduct(ctx context.Context, owner, repo string) (*CodeOfConduct, *Response, error) {
548 u := fmt.Sprintf("repos/%v/%v", owner, repo)
549 req, err := s.client.NewRequest("GET", u, nil)
550 if err != nil {
551 return nil, nil, err
552 }
553
554
555 req.Header.Set("Accept", mediaTypeCodesOfConductPreview)
556
557 r := new(Repository)
558 resp, err := s.client.Do(ctx, req, r)
559 if err != nil {
560 return nil, resp, err
561 }
562
563 return r.GetCodeOfConduct(), resp, nil
564 }
565
566
567
568
569 func (s *RepositoriesService) GetByID(ctx context.Context, id int64) (*Repository, *Response, error) {
570 u := fmt.Sprintf("repositories/%d", id)
571 req, err := s.client.NewRequest("GET", u, nil)
572 if err != nil {
573 return nil, nil, err
574 }
575
576 repository := new(Repository)
577 resp, err := s.client.Do(ctx, req, repository)
578 if err != nil {
579 return nil, resp, err
580 }
581
582 return repository, resp, nil
583 }
584
585
586
587
588 func (s *RepositoriesService) Edit(ctx context.Context, owner, repo string, repository *Repository) (*Repository, *Response, error) {
589 u := fmt.Sprintf("repos/%v/%v", owner, repo)
590 req, err := s.client.NewRequest("PATCH", u, repository)
591 if err != nil {
592 return nil, nil, err
593 }
594
595 acceptHeaders := []string{mediaTypeRepositoryTemplatePreview, mediaTypeRepositoryVisibilityPreview}
596 req.Header.Set("Accept", strings.Join(acceptHeaders, ", "))
597 r := new(Repository)
598 resp, err := s.client.Do(ctx, req, r)
599 if err != nil {
600 return nil, resp, err
601 }
602
603 return r, resp, nil
604 }
605
606
607
608
609 func (s *RepositoriesService) Delete(ctx context.Context, owner, repo string) (*Response, error) {
610 u := fmt.Sprintf("repos/%v/%v", owner, repo)
611 req, err := s.client.NewRequest("DELETE", u, nil)
612 if err != nil {
613 return nil, err
614 }
615
616 return s.client.Do(ctx, req, nil)
617 }
618
619
620 type Contributor struct {
621 Login *string `json:"login,omitempty"`
622 ID *int64 `json:"id,omitempty"`
623 NodeID *string `json:"node_id,omitempty"`
624 AvatarURL *string `json:"avatar_url,omitempty"`
625 GravatarID *string `json:"gravatar_id,omitempty"`
626 URL *string `json:"url,omitempty"`
627 HTMLURL *string `json:"html_url,omitempty"`
628 FollowersURL *string `json:"followers_url,omitempty"`
629 FollowingURL *string `json:"following_url,omitempty"`
630 GistsURL *string `json:"gists_url,omitempty"`
631 StarredURL *string `json:"starred_url,omitempty"`
632 SubscriptionsURL *string `json:"subscriptions_url,omitempty"`
633 OrganizationsURL *string `json:"organizations_url,omitempty"`
634 ReposURL *string `json:"repos_url,omitempty"`
635 EventsURL *string `json:"events_url,omitempty"`
636 ReceivedEventsURL *string `json:"received_events_url,omitempty"`
637 Type *string `json:"type,omitempty"`
638 SiteAdmin *bool `json:"site_admin,omitempty"`
639 Contributions *int `json:"contributions,omitempty"`
640 Name *string `json:"name,omitempty"`
641 Email *string `json:"email,omitempty"`
642 }
643
644
645
646 type ListContributorsOptions struct {
647
648 Anon string `url:"anon,omitempty"`
649
650 ListOptions
651 }
652
653
654
655
656 func (s *RepositoriesService) GetVulnerabilityAlerts(ctx context.Context, owner, repository string) (bool, *Response, error) {
657 u := fmt.Sprintf("repos/%v/%v/vulnerability-alerts", owner, repository)
658
659 req, err := s.client.NewRequest("GET", u, nil)
660 if err != nil {
661 return false, nil, err
662 }
663
664
665 req.Header.Set("Accept", mediaTypeRequiredVulnerabilityAlertsPreview)
666
667 resp, err := s.client.Do(ctx, req, nil)
668 vulnerabilityAlertsEnabled, err := parseBoolResponse(err)
669 return vulnerabilityAlertsEnabled, resp, err
670 }
671
672
673
674
675 func (s *RepositoriesService) EnableVulnerabilityAlerts(ctx context.Context, owner, repository string) (*Response, error) {
676 u := fmt.Sprintf("repos/%v/%v/vulnerability-alerts", owner, repository)
677
678 req, err := s.client.NewRequest("PUT", u, nil)
679 if err != nil {
680 return nil, err
681 }
682
683
684 req.Header.Set("Accept", mediaTypeRequiredVulnerabilityAlertsPreview)
685
686 return s.client.Do(ctx, req, nil)
687 }
688
689
690
691
692 func (s *RepositoriesService) DisableVulnerabilityAlerts(ctx context.Context, owner, repository string) (*Response, error) {
693 u := fmt.Sprintf("repos/%v/%v/vulnerability-alerts", owner, repository)
694
695 req, err := s.client.NewRequest("DELETE", u, nil)
696 if err != nil {
697 return nil, err
698 }
699
700
701 req.Header.Set("Accept", mediaTypeRequiredVulnerabilityAlertsPreview)
702
703 return s.client.Do(ctx, req, nil)
704 }
705
706
707
708
709 func (s *RepositoriesService) GetAutomatedSecurityFixes(ctx context.Context, owner, repository string) (*AutomatedSecurityFixes, *Response, error) {
710 u := fmt.Sprintf("repos/%v/%v/automated-security-fixes", owner, repository)
711
712 req, err := s.client.NewRequest("GET", u, nil)
713 if err != nil {
714 return nil, nil, err
715 }
716
717 p := new(AutomatedSecurityFixes)
718 resp, err := s.client.Do(ctx, req, p)
719 if err != nil {
720 return nil, resp, err
721 }
722 return p, resp, nil
723 }
724
725
726
727
728 func (s *RepositoriesService) EnableAutomatedSecurityFixes(ctx context.Context, owner, repository string) (*Response, error) {
729 u := fmt.Sprintf("repos/%v/%v/automated-security-fixes", owner, repository)
730
731 req, err := s.client.NewRequest("PUT", u, nil)
732 if err != nil {
733 return nil, err
734 }
735
736 return s.client.Do(ctx, req, nil)
737 }
738
739
740
741
742 func (s *RepositoriesService) DisableAutomatedSecurityFixes(ctx context.Context, owner, repository string) (*Response, error) {
743 u := fmt.Sprintf("repos/%v/%v/automated-security-fixes", owner, repository)
744
745 req, err := s.client.NewRequest("DELETE", u, nil)
746 if err != nil {
747 return nil, err
748 }
749
750 return s.client.Do(ctx, req, nil)
751 }
752
753
754
755
756 func (s *RepositoriesService) ListContributors(ctx context.Context, owner string, repository string, opts *ListContributorsOptions) ([]*Contributor, *Response, error) {
757 u := fmt.Sprintf("repos/%v/%v/contributors", owner, repository)
758 u, err := addOptions(u, opts)
759 if err != nil {
760 return nil, nil, err
761 }
762
763 req, err := s.client.NewRequest("GET", u, nil)
764 if err != nil {
765 return nil, nil, err
766 }
767
768 var contributor []*Contributor
769 resp, err := s.client.Do(ctx, req, &contributor)
770 if err != nil {
771 return nil, resp, err
772 }
773
774 return contributor, resp, nil
775 }
776
777
778
779
780
781
782
783
784
785
786
787 func (s *RepositoriesService) ListLanguages(ctx context.Context, owner string, repo string) (map[string]int, *Response, error) {
788 u := fmt.Sprintf("repos/%v/%v/languages", owner, repo)
789 req, err := s.client.NewRequest("GET", u, nil)
790 if err != nil {
791 return nil, nil, err
792 }
793
794 languages := make(map[string]int)
795 resp, err := s.client.Do(ctx, req, &languages)
796 if err != nil {
797 return nil, resp, err
798 }
799
800 return languages, resp, nil
801 }
802
803
804
805
806 func (s *RepositoriesService) ListTeams(ctx context.Context, owner string, repo string, opts *ListOptions) ([]*Team, *Response, error) {
807 u := fmt.Sprintf("repos/%v/%v/teams", owner, repo)
808 u, err := addOptions(u, opts)
809 if err != nil {
810 return nil, nil, err
811 }
812
813 req, err := s.client.NewRequest("GET", u, nil)
814 if err != nil {
815 return nil, nil, err
816 }
817
818 var teams []*Team
819 resp, err := s.client.Do(ctx, req, &teams)
820 if err != nil {
821 return nil, resp, err
822 }
823
824 return teams, resp, nil
825 }
826
827
828 type RepositoryTag struct {
829 Name *string `json:"name,omitempty"`
830 Commit *Commit `json:"commit,omitempty"`
831 ZipballURL *string `json:"zipball_url,omitempty"`
832 TarballURL *string `json:"tarball_url,omitempty"`
833 }
834
835
836
837
838 func (s *RepositoriesService) ListTags(ctx context.Context, owner string, repo string, opts *ListOptions) ([]*RepositoryTag, *Response, error) {
839 u := fmt.Sprintf("repos/%v/%v/tags", owner, repo)
840 u, err := addOptions(u, opts)
841 if err != nil {
842 return nil, nil, err
843 }
844
845 req, err := s.client.NewRequest("GET", u, nil)
846 if err != nil {
847 return nil, nil, err
848 }
849
850 var tags []*RepositoryTag
851 resp, err := s.client.Do(ctx, req, &tags)
852 if err != nil {
853 return nil, resp, err
854 }
855
856 return tags, resp, nil
857 }
858
859
860 type Branch struct {
861 Name *string `json:"name,omitempty"`
862 Commit *RepositoryCommit `json:"commit,omitempty"`
863 Protected *bool `json:"protected,omitempty"`
864 }
865
866
867 type Protection struct {
868 RequiredStatusChecks *RequiredStatusChecks `json:"required_status_checks"`
869 RequiredPullRequestReviews *PullRequestReviewsEnforcement `json:"required_pull_request_reviews"`
870 EnforceAdmins *AdminEnforcement `json:"enforce_admins"`
871 Restrictions *BranchRestrictions `json:"restrictions"`
872 RequireLinearHistory *RequireLinearHistory `json:"required_linear_history"`
873 AllowForcePushes *AllowForcePushes `json:"allow_force_pushes"`
874 AllowDeletions *AllowDeletions `json:"allow_deletions"`
875 RequiredConversationResolution *RequiredConversationResolution `json:"required_conversation_resolution"`
876 BlockCreations *BlockCreations `json:"block_creations,omitempty"`
877 LockBranch *LockBranch `json:"lock_branch,omitempty"`
878 AllowForkSyncing *AllowForkSyncing `json:"allow_fork_syncing,omitempty"`
879 RequiredSignatures *SignaturesProtectedBranch `json:"required_signatures,omitempty"`
880 URL *string `json:"url,omitempty"`
881 }
882
883
884
885
886 type BlockCreations struct {
887 Enabled *bool `json:"enabled,omitempty"`
888 }
889
890
891 type LockBranch struct {
892 Enabled *bool `json:"enabled,omitempty"`
893 }
894
895
896 type AllowForkSyncing struct {
897 Enabled *bool `json:"enabled,omitempty"`
898 }
899
900
901 type BranchProtectionRule struct {
902 ID *int64 `json:"id,omitempty"`
903 RepositoryID *int64 `json:"repository_id,omitempty"`
904 Name *string `json:"name,omitempty"`
905 CreatedAt *Timestamp `json:"created_at,omitempty"`
906 UpdatedAt *Timestamp `json:"updated_at,omitempty"`
907 PullRequestReviewsEnforcementLevel *string `json:"pull_request_reviews_enforcement_level,omitempty"`
908 RequiredApprovingReviewCount *int `json:"required_approving_review_count,omitempty"`
909 DismissStaleReviewsOnPush *bool `json:"dismiss_stale_reviews_on_push,omitempty"`
910 AuthorizedDismissalActorsOnly *bool `json:"authorized_dismissal_actors_only,omitempty"`
911 IgnoreApprovalsFromContributors *bool `json:"ignore_approvals_from_contributors,omitempty"`
912 RequireCodeOwnerReview *bool `json:"require_code_owner_review,omitempty"`
913 RequiredStatusChecks []string `json:"required_status_checks,omitempty"`
914 RequiredStatusChecksEnforcementLevel *string `json:"required_status_checks_enforcement_level,omitempty"`
915 StrictRequiredStatusChecksPolicy *bool `json:"strict_required_status_checks_policy,omitempty"`
916 SignatureRequirementEnforcementLevel *string `json:"signature_requirement_enforcement_level,omitempty"`
917 LinearHistoryRequirementEnforcementLevel *string `json:"linear_history_requirement_enforcement_level,omitempty"`
918 AdminEnforced *bool `json:"admin_enforced,omitempty"`
919 AllowForcePushesEnforcementLevel *string `json:"allow_force_pushes_enforcement_level,omitempty"`
920 AllowDeletionsEnforcementLevel *string `json:"allow_deletions_enforcement_level,omitempty"`
921 MergeQueueEnforcementLevel *string `json:"merge_queue_enforcement_level,omitempty"`
922 RequiredDeploymentsEnforcementLevel *string `json:"required_deployments_enforcement_level,omitempty"`
923 RequiredConversationResolutionLevel *string `json:"required_conversation_resolution_level,omitempty"`
924 AuthorizedActorsOnly *bool `json:"authorized_actors_only,omitempty"`
925 AuthorizedActorNames []string `json:"authorized_actor_names,omitempty"`
926 }
927
928
929 type ProtectionChanges struct {
930 AdminEnforced *AdminEnforcedChanges `json:"admin_enforced,omitempty"`
931 AllowDeletionsEnforcementLevel *AllowDeletionsEnforcementLevelChanges `json:"allow_deletions_enforcement_level,omitempty"`
932 AuthorizedActorNames *AuthorizedActorNames `json:"authorized_actor_names,omitempty"`
933 AuthorizedActorsOnly *AuthorizedActorsOnly `json:"authorized_actors_only,omitempty"`
934 AuthorizedDismissalActorsOnly *AuthorizedDismissalActorsOnlyChanges `json:"authorized_dismissal_actors_only,omitempty"`
935 CreateProtected *CreateProtectedChanges `json:"create_protected,omitempty"`
936 DismissStaleReviewsOnPush *DismissStaleReviewsOnPushChanges `json:"dismiss_stale_reviews_on_push,omitempty"`
937 LinearHistoryRequirementEnforcementLevel *LinearHistoryRequirementEnforcementLevelChanges `json:"linear_history_requirement_enforcement_level,omitempty"`
938 PullRequestReviewsEnforcementLevel *PullRequestReviewsEnforcementLevelChanges `json:"pull_request_reviews_enforcement_level,omitempty"`
939 RequireCodeOwnerReview *RequireCodeOwnerReviewChanges `json:"require_code_owner_review,omitempty"`
940 RequiredConversationResolutionLevel *RequiredConversationResolutionLevelChanges `json:"required_conversation_resolution_level,omitempty"`
941 RequiredDeploymentsEnforcementLevel *RequiredDeploymentsEnforcementLevelChanges `json:"required_deployments_enforcement_level,omitempty"`
942 RequiredStatusChecks *RequiredStatusChecksChanges `json:"required_status_checks,omitempty"`
943 RequiredStatusChecksEnforcementLevel *RequiredStatusChecksEnforcementLevelChanges `json:"required_status_checks_enforcement_level,omitempty"`
944 SignatureRequirementEnforcementLevel *SignatureRequirementEnforcementLevelChanges `json:"signature_requirement_enforcement_level,omitempty"`
945 }
946
947
948 type AdminEnforcedChanges struct {
949 From *bool `json:"from,omitempty"`
950 }
951
952
953 type AllowDeletionsEnforcementLevelChanges struct {
954 From *string `json:"from,omitempty"`
955 }
956
957
958 type AuthorizedActorNames struct {
959 From []string `json:"from,omitempty"`
960 }
961
962
963 type AuthorizedActorsOnly struct {
964 From *bool `json:"from,omitempty"`
965 }
966
967
968 type AuthorizedDismissalActorsOnlyChanges struct {
969 From *bool `json:"from,omitempty"`
970 }
971
972
973 type CreateProtectedChanges struct {
974 From *bool `json:"from,omitempty"`
975 }
976
977
978 type DismissStaleReviewsOnPushChanges struct {
979 From *bool `json:"from,omitempty"`
980 }
981
982
983 type LinearHistoryRequirementEnforcementLevelChanges struct {
984 From *string `json:"from,omitempty"`
985 }
986
987
988 type PullRequestReviewsEnforcementLevelChanges struct {
989 From *string `json:"from,omitempty"`
990 }
991
992
993 type RequireCodeOwnerReviewChanges struct {
994 From *bool `json:"from,omitempty"`
995 }
996
997
998 type RequiredConversationResolutionLevelChanges struct {
999 From *string `json:"from,omitempty"`
1000 }
1001
1002
1003 type RequiredDeploymentsEnforcementLevelChanges struct {
1004 From *string `json:"from,omitempty"`
1005 }
1006
1007
1008 type RequiredStatusChecksChanges struct {
1009 From []string `json:"from,omitempty"`
1010 }
1011
1012
1013 type RequiredStatusChecksEnforcementLevelChanges struct {
1014 From *string `json:"from,omitempty"`
1015 }
1016
1017
1018 type SignatureRequirementEnforcementLevelChanges struct {
1019 From *string `json:"from,omitempty"`
1020 }
1021
1022
1023 type ProtectionRequest struct {
1024 RequiredStatusChecks *RequiredStatusChecks `json:"required_status_checks"`
1025 RequiredPullRequestReviews *PullRequestReviewsEnforcementRequest `json:"required_pull_request_reviews"`
1026 EnforceAdmins bool `json:"enforce_admins"`
1027 Restrictions *BranchRestrictionsRequest `json:"restrictions"`
1028
1029 RequireLinearHistory *bool `json:"required_linear_history,omitempty"`
1030
1031 AllowForcePushes *bool `json:"allow_force_pushes,omitempty"`
1032
1033 AllowDeletions *bool `json:"allow_deletions,omitempty"`
1034
1035
1036 RequiredConversationResolution *bool `json:"required_conversation_resolution,omitempty"`
1037
1038
1039 BlockCreations *bool `json:"block_creations,omitempty"`
1040
1041 LockBranch *bool `json:"lock_branch,omitempty"`
1042
1043
1044 AllowForkSyncing *bool `json:"allow_fork_syncing,omitempty"`
1045 }
1046
1047
1048 type RequiredStatusChecks struct {
1049
1050 Strict bool `json:"strict"`
1051
1052
1053
1054 Contexts []string `json:"contexts,omitempty"`
1055
1056
1057 Checks []*RequiredStatusCheck `json:"checks"`
1058 ContextsURL *string `json:"contexts_url,omitempty"`
1059 URL *string `json:"url,omitempty"`
1060 }
1061
1062
1063 type RequiredStatusChecksRequest struct {
1064 Strict *bool `json:"strict,omitempty"`
1065
1066
1067 Contexts []string `json:"contexts,omitempty"`
1068 Checks []*RequiredStatusCheck `json:"checks,omitempty"`
1069 }
1070
1071
1072 type RequiredStatusCheck struct {
1073
1074 Context string `json:"context"`
1075
1076
1077
1078
1079
1080 AppID *int64 `json:"app_id,omitempty"`
1081 }
1082
1083
1084 type PullRequestReviewsEnforcement struct {
1085
1086 BypassPullRequestAllowances *BypassPullRequestAllowances `json:"bypass_pull_request_allowances,omitempty"`
1087
1088 DismissalRestrictions *DismissalRestrictions `json:"dismissal_restrictions,omitempty"`
1089
1090 DismissStaleReviews bool `json:"dismiss_stale_reviews"`
1091
1092 RequireCodeOwnerReviews bool `json:"require_code_owner_reviews"`
1093
1094
1095 RequiredApprovingReviewCount int `json:"required_approving_review_count"`
1096
1097 RequireLastPushApproval bool `json:"require_last_push_approval"`
1098 }
1099
1100
1101
1102
1103 type PullRequestReviewsEnforcementRequest struct {
1104
1105 BypassPullRequestAllowancesRequest *BypassPullRequestAllowancesRequest `json:"bypass_pull_request_allowances,omitempty"`
1106
1107
1108
1109 DismissalRestrictionsRequest *DismissalRestrictionsRequest `json:"dismissal_restrictions,omitempty"`
1110
1111 DismissStaleReviews bool `json:"dismiss_stale_reviews"`
1112
1113 RequireCodeOwnerReviews bool `json:"require_code_owner_reviews"`
1114
1115
1116 RequiredApprovingReviewCount int `json:"required_approving_review_count"`
1117
1118 RequireLastPushApproval *bool `json:"require_last_push_approval,omitempty"`
1119 }
1120
1121
1122
1123
1124 type PullRequestReviewsEnforcementUpdate struct {
1125
1126 BypassPullRequestAllowancesRequest *BypassPullRequestAllowancesRequest `json:"bypass_pull_request_allowances,omitempty"`
1127
1128 DismissalRestrictionsRequest *DismissalRestrictionsRequest `json:"dismissal_restrictions,omitempty"`
1129
1130 DismissStaleReviews *bool `json:"dismiss_stale_reviews,omitempty"`
1131
1132 RequireCodeOwnerReviews *bool `json:"require_code_owner_reviews,omitempty"`
1133
1134
1135 RequiredApprovingReviewCount int `json:"required_approving_review_count"`
1136
1137 RequireLastPushApproval *bool `json:"require_last_push_approval,omitempty"`
1138 }
1139
1140
1141 type RequireLinearHistory struct {
1142 Enabled bool `json:"enabled"`
1143 }
1144
1145
1146 type AllowDeletions struct {
1147 Enabled bool `json:"enabled"`
1148 }
1149
1150
1151 type AllowForcePushes struct {
1152 Enabled bool `json:"enabled"`
1153 }
1154
1155
1156 type RequiredConversationResolution struct {
1157 Enabled bool `json:"enabled"`
1158 }
1159
1160
1161 type AdminEnforcement struct {
1162 URL *string `json:"url,omitempty"`
1163 Enabled bool `json:"enabled"`
1164 }
1165
1166
1167
1168 type BranchRestrictions struct {
1169
1170 Users []*User `json:"users"`
1171
1172 Teams []*Team `json:"teams"`
1173
1174 Apps []*App `json:"apps"`
1175 }
1176
1177
1178
1179
1180
1181 type BranchRestrictionsRequest struct {
1182
1183 Users []string `json:"users"`
1184
1185 Teams []string `json:"teams"`
1186
1187 Apps []string `json:"apps"`
1188 }
1189
1190
1191 type BypassPullRequestAllowances struct {
1192
1193 Users []*User `json:"users"`
1194
1195 Teams []*Team `json:"teams"`
1196
1197 Apps []*App `json:"apps"`
1198 }
1199
1200
1201
1202
1203
1204 type BypassPullRequestAllowancesRequest struct {
1205
1206 Users []string `json:"users"`
1207
1208 Teams []string `json:"teams"`
1209
1210 Apps []string `json:"apps"`
1211 }
1212
1213
1214 type DismissalRestrictions struct {
1215
1216 Users []*User `json:"users"`
1217
1218 Teams []*Team `json:"teams"`
1219
1220 Apps []*App `json:"apps"`
1221 }
1222
1223
1224
1225
1226
1227
1228 type DismissalRestrictionsRequest struct {
1229
1230 Users *[]string `json:"users,omitempty"`
1231
1232 Teams *[]string `json:"teams,omitempty"`
1233
1234 Apps *[]string `json:"apps,omitempty"`
1235 }
1236
1237
1238 type SignaturesProtectedBranch struct {
1239 URL *string `json:"url,omitempty"`
1240
1241 Enabled *bool `json:"enabled,omitempty"`
1242 }
1243
1244
1245 type AutomatedSecurityFixes struct {
1246 Enabled *bool `json:"enabled"`
1247 Paused *bool `json:"paused"`
1248 }
1249
1250
1251
1252
1253 func (s *RepositoriesService) ListBranches(ctx context.Context, owner string, repo string, opts *BranchListOptions) ([]*Branch, *Response, error) {
1254 u := fmt.Sprintf("repos/%v/%v/branches", owner, repo)
1255 u, err := addOptions(u, opts)
1256 if err != nil {
1257 return nil, nil, err
1258 }
1259
1260 req, err := s.client.NewRequest("GET", u, nil)
1261 if err != nil {
1262 return nil, nil, err
1263 }
1264
1265 var branches []*Branch
1266 resp, err := s.client.Do(ctx, req, &branches)
1267 if err != nil {
1268 return nil, resp, err
1269 }
1270
1271 return branches, resp, nil
1272 }
1273
1274
1275
1276
1277 func (s *RepositoriesService) GetBranch(ctx context.Context, owner, repo, branch string, followRedirects bool) (*Branch, *Response, error) {
1278 u := fmt.Sprintf("repos/%v/%v/branches/%v", owner, repo, branch)
1279
1280 resp, err := s.client.roundTripWithOptionalFollowRedirect(ctx, u, followRedirects)
1281 if err != nil {
1282 return nil, nil, err
1283 }
1284 defer resp.Body.Close()
1285
1286 if resp.StatusCode != http.StatusOK {
1287 return nil, newResponse(resp), fmt.Errorf("unexpected status code: %s", resp.Status)
1288 }
1289
1290 b := new(Branch)
1291 err = json.NewDecoder(resp.Body).Decode(b)
1292 return b, newResponse(resp), err
1293 }
1294
1295
1296 type renameBranchRequest struct {
1297 NewName string `json:"new_name"`
1298 }
1299
1300
1301
1302
1303
1304
1305
1306 func (s *RepositoriesService) RenameBranch(ctx context.Context, owner, repo, branch, newName string) (*Branch, *Response, error) {
1307 u := fmt.Sprintf("repos/%v/%v/branches/%v/rename", owner, repo, branch)
1308 r := &renameBranchRequest{NewName: newName}
1309 req, err := s.client.NewRequest("POST", u, r)
1310 if err != nil {
1311 return nil, nil, err
1312 }
1313
1314 b := new(Branch)
1315 resp, err := s.client.Do(ctx, req, b)
1316 if err != nil {
1317 return nil, resp, err
1318 }
1319
1320 return b, resp, nil
1321 }
1322
1323
1324
1325
1326 func (s *RepositoriesService) GetBranchProtection(ctx context.Context, owner, repo, branch string) (*Protection, *Response, error) {
1327 u := fmt.Sprintf("repos/%v/%v/branches/%v/protection", owner, repo, branch)
1328 req, err := s.client.NewRequest("GET", u, nil)
1329 if err != nil {
1330 return nil, nil, err
1331 }
1332
1333
1334 req.Header.Set("Accept", mediaTypeRequiredApprovingReviewsPreview)
1335
1336 p := new(Protection)
1337 resp, err := s.client.Do(ctx, req, p)
1338 if err != nil {
1339 if isBranchNotProtected(err) {
1340 err = ErrBranchNotProtected
1341 }
1342 return nil, resp, err
1343 }
1344
1345 return p, resp, nil
1346 }
1347
1348
1349
1350
1351 func (s *RepositoriesService) GetRequiredStatusChecks(ctx context.Context, owner, repo, branch string) (*RequiredStatusChecks, *Response, error) {
1352 u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/required_status_checks", owner, repo, branch)
1353 req, err := s.client.NewRequest("GET", u, nil)
1354 if err != nil {
1355 return nil, nil, err
1356 }
1357
1358 p := new(RequiredStatusChecks)
1359 resp, err := s.client.Do(ctx, req, p)
1360 if err != nil {
1361 if isBranchNotProtected(err) {
1362 err = ErrBranchNotProtected
1363 }
1364 return nil, resp, err
1365 }
1366
1367 return p, resp, nil
1368 }
1369
1370
1371
1372
1373 func (s *RepositoriesService) ListRequiredStatusChecksContexts(ctx context.Context, owner, repo, branch string) (contexts []string, resp *Response, err error) {
1374 u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/required_status_checks/contexts", owner, repo, branch)
1375 req, err := s.client.NewRequest("GET", u, nil)
1376 if err != nil {
1377 return nil, nil, err
1378 }
1379
1380 resp, err = s.client.Do(ctx, req, &contexts)
1381 if err != nil {
1382 if isBranchNotProtected(err) {
1383 err = ErrBranchNotProtected
1384 }
1385 return nil, resp, err
1386 }
1387
1388 return contexts, resp, nil
1389 }
1390
1391
1392
1393
1394 func (s *RepositoriesService) UpdateBranchProtection(ctx context.Context, owner, repo, branch string, preq *ProtectionRequest) (*Protection, *Response, error) {
1395 u := fmt.Sprintf("repos/%v/%v/branches/%v/protection", owner, repo, branch)
1396 req, err := s.client.NewRequest("PUT", u, preq)
1397 if err != nil {
1398 return nil, nil, err
1399 }
1400
1401
1402 req.Header.Set("Accept", mediaTypeRequiredApprovingReviewsPreview)
1403
1404 p := new(Protection)
1405 resp, err := s.client.Do(ctx, req, p)
1406 if err != nil {
1407 return nil, resp, err
1408 }
1409
1410 return p, resp, nil
1411 }
1412
1413
1414
1415
1416 func (s *RepositoriesService) RemoveBranchProtection(ctx context.Context, owner, repo, branch string) (*Response, error) {
1417 u := fmt.Sprintf("repos/%v/%v/branches/%v/protection", owner, repo, branch)
1418 req, err := s.client.NewRequest("DELETE", u, nil)
1419 if err != nil {
1420 return nil, err
1421 }
1422
1423 return s.client.Do(ctx, req, nil)
1424 }
1425
1426
1427
1428
1429 func (s *RepositoriesService) GetSignaturesProtectedBranch(ctx context.Context, owner, repo, branch string) (*SignaturesProtectedBranch, *Response, error) {
1430 u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/required_signatures", owner, repo, branch)
1431 req, err := s.client.NewRequest("GET", u, nil)
1432 if err != nil {
1433 return nil, nil, err
1434 }
1435
1436
1437 req.Header.Set("Accept", mediaTypeSignaturePreview)
1438
1439 p := new(SignaturesProtectedBranch)
1440 resp, err := s.client.Do(ctx, req, p)
1441 if err != nil {
1442 return nil, resp, err
1443 }
1444
1445 return p, resp, nil
1446 }
1447
1448
1449
1450
1451
1452 func (s *RepositoriesService) RequireSignaturesOnProtectedBranch(ctx context.Context, owner, repo, branch string) (*SignaturesProtectedBranch, *Response, error) {
1453 u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/required_signatures", owner, repo, branch)
1454 req, err := s.client.NewRequest("POST", u, nil)
1455 if err != nil {
1456 return nil, nil, err
1457 }
1458
1459
1460 req.Header.Set("Accept", mediaTypeSignaturePreview)
1461
1462 r := new(SignaturesProtectedBranch)
1463 resp, err := s.client.Do(ctx, req, r)
1464 if err != nil {
1465 return nil, resp, err
1466 }
1467
1468 return r, resp, nil
1469 }
1470
1471
1472
1473
1474 func (s *RepositoriesService) OptionalSignaturesOnProtectedBranch(ctx context.Context, owner, repo, branch string) (*Response, error) {
1475 u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/required_signatures", owner, repo, branch)
1476 req, err := s.client.NewRequest("DELETE", u, nil)
1477 if err != nil {
1478 return nil, err
1479 }
1480
1481
1482 req.Header.Set("Accept", mediaTypeSignaturePreview)
1483
1484 return s.client.Do(ctx, req, nil)
1485 }
1486
1487
1488
1489
1490 func (s *RepositoriesService) UpdateRequiredStatusChecks(ctx context.Context, owner, repo, branch string, sreq *RequiredStatusChecksRequest) (*RequiredStatusChecks, *Response, error) {
1491 u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/required_status_checks", owner, repo, branch)
1492 req, err := s.client.NewRequest("PATCH", u, sreq)
1493 if err != nil {
1494 return nil, nil, err
1495 }
1496
1497 sc := new(RequiredStatusChecks)
1498 resp, err := s.client.Do(ctx, req, sc)
1499 if err != nil {
1500 return nil, resp, err
1501 }
1502
1503 return sc, resp, nil
1504 }
1505
1506
1507
1508
1509 func (s *RepositoriesService) RemoveRequiredStatusChecks(ctx context.Context, owner, repo, branch string) (*Response, error) {
1510 u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/required_status_checks", owner, repo, branch)
1511 req, err := s.client.NewRequest("DELETE", u, nil)
1512 if err != nil {
1513 return nil, err
1514 }
1515
1516 return s.client.Do(ctx, req, nil)
1517 }
1518
1519
1520
1521
1522 func (s *RepositoriesService) License(ctx context.Context, owner, repo string) (*RepositoryLicense, *Response, error) {
1523 u := fmt.Sprintf("repos/%v/%v/license", owner, repo)
1524 req, err := s.client.NewRequest("GET", u, nil)
1525 if err != nil {
1526 return nil, nil, err
1527 }
1528
1529 r := &RepositoryLicense{}
1530 resp, err := s.client.Do(ctx, req, r)
1531 if err != nil {
1532 return nil, resp, err
1533 }
1534
1535 return r, resp, nil
1536 }
1537
1538
1539
1540
1541 func (s *RepositoriesService) GetPullRequestReviewEnforcement(ctx context.Context, owner, repo, branch string) (*PullRequestReviewsEnforcement, *Response, error) {
1542 u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/required_pull_request_reviews", owner, repo, branch)
1543 req, err := s.client.NewRequest("GET", u, nil)
1544 if err != nil {
1545 return nil, nil, err
1546 }
1547
1548
1549 req.Header.Set("Accept", mediaTypeRequiredApprovingReviewsPreview)
1550
1551 r := new(PullRequestReviewsEnforcement)
1552 resp, err := s.client.Do(ctx, req, r)
1553 if err != nil {
1554 return nil, resp, err
1555 }
1556
1557 return r, resp, nil
1558 }
1559
1560
1561
1562
1563
1564 func (s *RepositoriesService) UpdatePullRequestReviewEnforcement(ctx context.Context, owner, repo, branch string, patch *PullRequestReviewsEnforcementUpdate) (*PullRequestReviewsEnforcement, *Response, error) {
1565 u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/required_pull_request_reviews", owner, repo, branch)
1566 req, err := s.client.NewRequest("PATCH", u, patch)
1567 if err != nil {
1568 return nil, nil, err
1569 }
1570
1571
1572 req.Header.Set("Accept", mediaTypeRequiredApprovingReviewsPreview)
1573
1574 r := new(PullRequestReviewsEnforcement)
1575 resp, err := s.client.Do(ctx, req, r)
1576 if err != nil {
1577 return nil, resp, err
1578 }
1579
1580 return r, resp, nil
1581 }
1582
1583
1584
1585
1586
1587 func (s *RepositoriesService) DisableDismissalRestrictions(ctx context.Context, owner, repo, branch string) (*PullRequestReviewsEnforcement, *Response, error) {
1588 u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/required_pull_request_reviews", owner, repo, branch)
1589
1590 data := new(struct {
1591 DismissalRestrictionsRequest `json:"dismissal_restrictions"`
1592 })
1593
1594 req, err := s.client.NewRequest("PATCH", u, data)
1595 if err != nil {
1596 return nil, nil, err
1597 }
1598
1599
1600 req.Header.Set("Accept", mediaTypeRequiredApprovingReviewsPreview)
1601
1602 r := new(PullRequestReviewsEnforcement)
1603 resp, err := s.client.Do(ctx, req, r)
1604 if err != nil {
1605 return nil, resp, err
1606 }
1607
1608 return r, resp, nil
1609 }
1610
1611
1612
1613
1614 func (s *RepositoriesService) RemovePullRequestReviewEnforcement(ctx context.Context, owner, repo, branch string) (*Response, error) {
1615 u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/required_pull_request_reviews", owner, repo, branch)
1616 req, err := s.client.NewRequest("DELETE", u, nil)
1617 if err != nil {
1618 return nil, err
1619 }
1620
1621 return s.client.Do(ctx, req, nil)
1622 }
1623
1624
1625
1626
1627 func (s *RepositoriesService) GetAdminEnforcement(ctx context.Context, owner, repo, branch string) (*AdminEnforcement, *Response, error) {
1628 u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/enforce_admins", owner, repo, branch)
1629 req, err := s.client.NewRequest("GET", u, nil)
1630 if err != nil {
1631 return nil, nil, err
1632 }
1633
1634 r := new(AdminEnforcement)
1635 resp, err := s.client.Do(ctx, req, r)
1636 if err != nil {
1637 return nil, resp, err
1638 }
1639
1640 return r, resp, nil
1641 }
1642
1643
1644
1645
1646
1647 func (s *RepositoriesService) AddAdminEnforcement(ctx context.Context, owner, repo, branch string) (*AdminEnforcement, *Response, error) {
1648 u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/enforce_admins", owner, repo, branch)
1649 req, err := s.client.NewRequest("POST", u, nil)
1650 if err != nil {
1651 return nil, nil, err
1652 }
1653
1654 r := new(AdminEnforcement)
1655 resp, err := s.client.Do(ctx, req, r)
1656 if err != nil {
1657 return nil, resp, err
1658 }
1659
1660 return r, resp, nil
1661 }
1662
1663
1664
1665
1666 func (s *RepositoriesService) RemoveAdminEnforcement(ctx context.Context, owner, repo, branch string) (*Response, error) {
1667 u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/enforce_admins", owner, repo, branch)
1668 req, err := s.client.NewRequest("DELETE", u, nil)
1669 if err != nil {
1670 return nil, err
1671 }
1672
1673 return s.client.Do(ctx, req, nil)
1674 }
1675
1676
1677 type repositoryTopics struct {
1678 Names []string `json:"names"`
1679 }
1680
1681
1682
1683
1684 func (s *RepositoriesService) ListAllTopics(ctx context.Context, owner, repo string) ([]string, *Response, error) {
1685 u := fmt.Sprintf("repos/%v/%v/topics", owner, repo)
1686 req, err := s.client.NewRequest("GET", u, nil)
1687 if err != nil {
1688 return nil, nil, err
1689 }
1690
1691
1692 req.Header.Set("Accept", mediaTypeTopicsPreview)
1693
1694 topics := new(repositoryTopics)
1695 resp, err := s.client.Do(ctx, req, topics)
1696 if err != nil {
1697 return nil, resp, err
1698 }
1699
1700 return topics.Names, resp, nil
1701 }
1702
1703
1704
1705
1706 func (s *RepositoriesService) ReplaceAllTopics(ctx context.Context, owner, repo string, topics []string) ([]string, *Response, error) {
1707 u := fmt.Sprintf("repos/%v/%v/topics", owner, repo)
1708 t := &repositoryTopics{
1709 Names: topics,
1710 }
1711 if t.Names == nil {
1712 t.Names = []string{}
1713 }
1714 req, err := s.client.NewRequest("PUT", u, t)
1715 if err != nil {
1716 return nil, nil, err
1717 }
1718
1719
1720 req.Header.Set("Accept", mediaTypeTopicsPreview)
1721
1722 t = new(repositoryTopics)
1723 resp, err := s.client.Do(ctx, req, t)
1724 if err != nil {
1725 return nil, resp, err
1726 }
1727
1728 return t.Names, resp, nil
1729 }
1730
1731
1732
1733
1734
1735
1736
1737 func (s *RepositoriesService) ListApps(ctx context.Context, owner, repo, branch string) ([]*App, *Response, error) {
1738 u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/restrictions/apps", owner, repo, branch)
1739 req, err := s.client.NewRequest("GET", u, nil)
1740 if err != nil {
1741 return nil, nil, err
1742 }
1743
1744 var apps []*App
1745 resp, err := s.client.Do(ctx, req, &apps)
1746 if err != nil {
1747 return nil, resp, err
1748 }
1749
1750 return apps, resp, nil
1751 }
1752
1753
1754
1755
1756
1757
1758
1759 func (s *RepositoriesService) ListAppRestrictions(ctx context.Context, owner, repo, branch string) ([]*App, *Response, error) {
1760 return s.ListApps(ctx, owner, repo, branch)
1761 }
1762
1763
1764
1765
1766
1767
1768
1769
1770 func (s *RepositoriesService) ReplaceAppRestrictions(ctx context.Context, owner, repo, branch string, apps []string) ([]*App, *Response, error) {
1771 u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/restrictions/apps", owner, repo, branch)
1772 req, err := s.client.NewRequest("PUT", u, apps)
1773 if err != nil {
1774 return nil, nil, err
1775 }
1776
1777 var newApps []*App
1778 resp, err := s.client.Do(ctx, req, &newApps)
1779 if err != nil {
1780 return nil, resp, err
1781 }
1782
1783 return newApps, resp, nil
1784 }
1785
1786
1787
1788
1789
1790
1791
1792 func (s *RepositoriesService) AddAppRestrictions(ctx context.Context, owner, repo, branch string, apps []string) ([]*App, *Response, error) {
1793 u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/restrictions/apps", owner, repo, branch)
1794 req, err := s.client.NewRequest("POST", u, apps)
1795 if err != nil {
1796 return nil, nil, err
1797 }
1798
1799 var newApps []*App
1800 resp, err := s.client.Do(ctx, req, &newApps)
1801 if err != nil {
1802 return nil, resp, err
1803 }
1804
1805 return newApps, resp, nil
1806 }
1807
1808
1809
1810
1811
1812
1813
1814 func (s *RepositoriesService) RemoveAppRestrictions(ctx context.Context, owner, repo, branch string, apps []string) ([]*App, *Response, error) {
1815 u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/restrictions/apps", owner, repo, branch)
1816 req, err := s.client.NewRequest("DELETE", u, apps)
1817 if err != nil {
1818 return nil, nil, err
1819 }
1820
1821 var newApps []*App
1822 resp, err := s.client.Do(ctx, req, &newApps)
1823 if err != nil {
1824 return nil, resp, err
1825 }
1826
1827 return newApps, resp, nil
1828 }
1829
1830
1831
1832
1833
1834 func (s *RepositoriesService) ListTeamRestrictions(ctx context.Context, owner, repo, branch string) ([]*Team, *Response, error) {
1835 u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/restrictions/teams", owner, repo, branch)
1836 req, err := s.client.NewRequest("GET", u, nil)
1837 if err != nil {
1838 return nil, nil, err
1839 }
1840
1841 var teams []*Team
1842 resp, err := s.client.Do(ctx, req, &teams)
1843 if err != nil {
1844 return nil, resp, err
1845 }
1846
1847 return teams, resp, nil
1848 }
1849
1850
1851
1852
1853
1854
1855
1856
1857 func (s *RepositoriesService) ReplaceTeamRestrictions(ctx context.Context, owner, repo, branch string, teams []string) ([]*Team, *Response, error) {
1858 u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/restrictions/teams", owner, repo, branch)
1859 req, err := s.client.NewRequest("PUT", u, teams)
1860 if err != nil {
1861 return nil, nil, err
1862 }
1863
1864 var newTeams []*Team
1865 resp, err := s.client.Do(ctx, req, &newTeams)
1866 if err != nil {
1867 return nil, resp, err
1868 }
1869
1870 return newTeams, resp, nil
1871 }
1872
1873
1874
1875
1876
1877
1878
1879 func (s *RepositoriesService) AddTeamRestrictions(ctx context.Context, owner, repo, branch string, teams []string) ([]*Team, *Response, error) {
1880 u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/restrictions/teams", owner, repo, branch)
1881 req, err := s.client.NewRequest("POST", u, teams)
1882 if err != nil {
1883 return nil, nil, err
1884 }
1885
1886 var newTeams []*Team
1887 resp, err := s.client.Do(ctx, req, &newTeams)
1888 if err != nil {
1889 return nil, resp, err
1890 }
1891
1892 return newTeams, resp, nil
1893 }
1894
1895
1896
1897
1898
1899
1900
1901 func (s *RepositoriesService) RemoveTeamRestrictions(ctx context.Context, owner, repo, branch string, teams []string) ([]*Team, *Response, error) {
1902 u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/restrictions/teams", owner, repo, branch)
1903 req, err := s.client.NewRequest("DELETE", u, teams)
1904 if err != nil {
1905 return nil, nil, err
1906 }
1907
1908 var newTeams []*Team
1909 resp, err := s.client.Do(ctx, req, &newTeams)
1910 if err != nil {
1911 return nil, resp, err
1912 }
1913
1914 return newTeams, resp, nil
1915 }
1916
1917
1918
1919
1920
1921 func (s *RepositoriesService) ListUserRestrictions(ctx context.Context, owner, repo, branch string) ([]*User, *Response, error) {
1922 u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/restrictions/users", owner, repo, branch)
1923 req, err := s.client.NewRequest("GET", u, nil)
1924 if err != nil {
1925 return nil, nil, err
1926 }
1927
1928 var users []*User
1929 resp, err := s.client.Do(ctx, req, &users)
1930 if err != nil {
1931 return nil, resp, err
1932 }
1933
1934 return users, resp, nil
1935 }
1936
1937
1938
1939
1940
1941
1942
1943
1944 func (s *RepositoriesService) ReplaceUserRestrictions(ctx context.Context, owner, repo, branch string, users []string) ([]*User, *Response, error) {
1945 u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/restrictions/users", owner, repo, branch)
1946 req, err := s.client.NewRequest("PUT", u, users)
1947 if err != nil {
1948 return nil, nil, err
1949 }
1950
1951 var newUsers []*User
1952 resp, err := s.client.Do(ctx, req, &newUsers)
1953 if err != nil {
1954 return nil, resp, err
1955 }
1956
1957 return newUsers, resp, nil
1958 }
1959
1960
1961
1962
1963
1964
1965
1966 func (s *RepositoriesService) AddUserRestrictions(ctx context.Context, owner, repo, branch string, users []string) ([]*User, *Response, error) {
1967 u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/restrictions/users", owner, repo, branch)
1968 req, err := s.client.NewRequest("POST", u, users)
1969 if err != nil {
1970 return nil, nil, err
1971 }
1972
1973 var newUsers []*User
1974 resp, err := s.client.Do(ctx, req, &newUsers)
1975 if err != nil {
1976 return nil, resp, err
1977 }
1978
1979 return newUsers, resp, nil
1980 }
1981
1982
1983
1984
1985
1986
1987
1988 func (s *RepositoriesService) RemoveUserRestrictions(ctx context.Context, owner, repo, branch string, users []string) ([]*User, *Response, error) {
1989 u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/restrictions/users", owner, repo, branch)
1990 req, err := s.client.NewRequest("DELETE", u, users)
1991 if err != nil {
1992 return nil, nil, err
1993 }
1994
1995 var newUsers []*User
1996 resp, err := s.client.Do(ctx, req, &newUsers)
1997 if err != nil {
1998 return nil, resp, err
1999 }
2000
2001 return newUsers, resp, nil
2002 }
2003
2004
2005 type TransferRequest struct {
2006 NewOwner string `json:"new_owner"`
2007 NewName *string `json:"new_name,omitempty"`
2008 TeamID []int64 `json:"team_ids,omitempty"`
2009 }
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020 func (s *RepositoriesService) Transfer(ctx context.Context, owner, repo string, transfer TransferRequest) (*Repository, *Response, error) {
2021 u := fmt.Sprintf("repos/%v/%v/transfer", owner, repo)
2022
2023 req, err := s.client.NewRequest("POST", u, &transfer)
2024 if err != nil {
2025 return nil, nil, err
2026 }
2027
2028 r := new(Repository)
2029 resp, err := s.client.Do(ctx, req, r)
2030 if err != nil {
2031 return nil, resp, err
2032 }
2033
2034 return r, resp, nil
2035 }
2036
2037
2038 type DispatchRequestOptions struct {
2039
2040 EventType string `json:"event_type"`
2041
2042
2043 ClientPayload *json.RawMessage `json:"client_payload,omitempty"`
2044 }
2045
2046
2047
2048
2049 func (s *RepositoriesService) Dispatch(ctx context.Context, owner, repo string, opts DispatchRequestOptions) (*Repository, *Response, error) {
2050 u := fmt.Sprintf("repos/%v/%v/dispatches", owner, repo)
2051
2052 req, err := s.client.NewRequest("POST", u, &opts)
2053 if err != nil {
2054 return nil, nil, err
2055 }
2056
2057 r := new(Repository)
2058 resp, err := s.client.Do(ctx, req, r)
2059 if err != nil {
2060 return nil, resp, err
2061 }
2062
2063 return r, resp, nil
2064 }
2065
2066
2067
2068 func isBranchNotProtected(err error) bool {
2069 errorResponse, ok := err.(*ErrorResponse)
2070 return ok && errorResponse.Message == githubBranchNotProtected
2071 }
2072
2073
2074
2075
2076
2077 func (s *RepositoriesService) EnablePrivateReporting(ctx context.Context, owner, repo string) (*Response, error) {
2078 u := fmt.Sprintf("repos/%v/%v/private-vulnerability-reporting", owner, repo)
2079
2080 req, err := s.client.NewRequest("PUT", u, nil)
2081 if err != nil {
2082 return nil, err
2083 }
2084
2085 resp, err := s.client.Do(ctx, req, nil)
2086 if err != nil {
2087 return resp, err
2088 }
2089
2090 return resp, nil
2091 }
2092
2093
2094
2095
2096
2097 func (s *RepositoriesService) DisablePrivateReporting(ctx context.Context, owner, repo string) (*Response, error) {
2098 u := fmt.Sprintf("repos/%v/%v/private-vulnerability-reporting", owner, repo)
2099
2100 req, err := s.client.NewRequest("DELETE", u, nil)
2101 if err != nil {
2102 return nil, err
2103 }
2104
2105 resp, err := s.client.Do(ctx, req, nil)
2106 if err != nil {
2107 return resp, err
2108 }
2109
2110 return resp, nil
2111 }
2112
View as plain text