1
2
3
4
5
6 package github
7
8 import (
9 "context"
10 "encoding/json"
11 "fmt"
12 "strings"
13 )
14
15
16
17
18
19 type RepositoriesService service
20
21
22 type Repository struct {
23 ID *int64 `json:"id,omitempty"`
24 NodeID *string `json:"node_id,omitempty"`
25 Owner *User `json:"owner,omitempty"`
26 Name *string `json:"name,omitempty"`
27 FullName *string `json:"full_name,omitempty"`
28 Description *string `json:"description,omitempty"`
29 Homepage *string `json:"homepage,omitempty"`
30 CodeOfConduct *CodeOfConduct `json:"code_of_conduct,omitempty"`
31 DefaultBranch *string `json:"default_branch,omitempty"`
32 MasterBranch *string `json:"master_branch,omitempty"`
33 CreatedAt *Timestamp `json:"created_at,omitempty"`
34 PushedAt *Timestamp `json:"pushed_at,omitempty"`
35 UpdatedAt *Timestamp `json:"updated_at,omitempty"`
36 HTMLURL *string `json:"html_url,omitempty"`
37 CloneURL *string `json:"clone_url,omitempty"`
38 GitURL *string `json:"git_url,omitempty"`
39 MirrorURL *string `json:"mirror_url,omitempty"`
40 SSHURL *string `json:"ssh_url,omitempty"`
41 SVNURL *string `json:"svn_url,omitempty"`
42 Language *string `json:"language,omitempty"`
43 Fork *bool `json:"fork,omitempty"`
44 ForksCount *int `json:"forks_count,omitempty"`
45 NetworkCount *int `json:"network_count,omitempty"`
46 OpenIssuesCount *int `json:"open_issues_count,omitempty"`
47 StargazersCount *int `json:"stargazers_count,omitempty"`
48 SubscribersCount *int `json:"subscribers_count,omitempty"`
49 WatchersCount *int `json:"watchers_count,omitempty"`
50 Size *int `json:"size,omitempty"`
51 AutoInit *bool `json:"auto_init,omitempty"`
52 Parent *Repository `json:"parent,omitempty"`
53 Source *Repository `json:"source,omitempty"`
54 TemplateRepository *Repository `json:"template_repository,omitempty"`
55 Organization *Organization `json:"organization,omitempty"`
56 Permissions *map[string]bool `json:"permissions,omitempty"`
57 AllowRebaseMerge *bool `json:"allow_rebase_merge,omitempty"`
58 AllowSquashMerge *bool `json:"allow_squash_merge,omitempty"`
59 AllowMergeCommit *bool `json:"allow_merge_commit,omitempty"`
60 DeleteBranchOnMerge *bool `json:"delete_branch_on_merge,omitempty"`
61 Topics []string `json:"topics,omitempty"`
62 Archived *bool `json:"archived,omitempty"`
63 Disabled *bool `json:"disabled,omitempty"`
64
65
66 License *License `json:"license,omitempty"`
67
68
69 Private *bool `json:"private,omitempty"`
70 HasIssues *bool `json:"has_issues,omitempty"`
71 HasWiki *bool `json:"has_wiki,omitempty"`
72 HasPages *bool `json:"has_pages,omitempty"`
73 HasProjects *bool `json:"has_projects,omitempty"`
74 HasDownloads *bool `json:"has_downloads,omitempty"`
75 IsTemplate *bool `json:"is_template,omitempty"`
76 LicenseTemplate *string `json:"license_template,omitempty"`
77 GitignoreTemplate *string `json:"gitignore_template,omitempty"`
78
79
80 TeamID *int64 `json:"team_id,omitempty"`
81
82
83 URL *string `json:"url,omitempty"`
84 ArchiveURL *string `json:"archive_url,omitempty"`
85 AssigneesURL *string `json:"assignees_url,omitempty"`
86 BlobsURL *string `json:"blobs_url,omitempty"`
87 BranchesURL *string `json:"branches_url,omitempty"`
88 CollaboratorsURL *string `json:"collaborators_url,omitempty"`
89 CommentsURL *string `json:"comments_url,omitempty"`
90 CommitsURL *string `json:"commits_url,omitempty"`
91 CompareURL *string `json:"compare_url,omitempty"`
92 ContentsURL *string `json:"contents_url,omitempty"`
93 ContributorsURL *string `json:"contributors_url,omitempty"`
94 DeploymentsURL *string `json:"deployments_url,omitempty"`
95 DownloadsURL *string `json:"downloads_url,omitempty"`
96 EventsURL *string `json:"events_url,omitempty"`
97 ForksURL *string `json:"forks_url,omitempty"`
98 GitCommitsURL *string `json:"git_commits_url,omitempty"`
99 GitRefsURL *string `json:"git_refs_url,omitempty"`
100 GitTagsURL *string `json:"git_tags_url,omitempty"`
101 HooksURL *string `json:"hooks_url,omitempty"`
102 IssueCommentURL *string `json:"issue_comment_url,omitempty"`
103 IssueEventsURL *string `json:"issue_events_url,omitempty"`
104 IssuesURL *string `json:"issues_url,omitempty"`
105 KeysURL *string `json:"keys_url,omitempty"`
106 LabelsURL *string `json:"labels_url,omitempty"`
107 LanguagesURL *string `json:"languages_url,omitempty"`
108 MergesURL *string `json:"merges_url,omitempty"`
109 MilestonesURL *string `json:"milestones_url,omitempty"`
110 NotificationsURL *string `json:"notifications_url,omitempty"`
111 PullsURL *string `json:"pulls_url,omitempty"`
112 ReleasesURL *string `json:"releases_url,omitempty"`
113 StargazersURL *string `json:"stargazers_url,omitempty"`
114 StatusesURL *string `json:"statuses_url,omitempty"`
115 SubscribersURL *string `json:"subscribers_url,omitempty"`
116 SubscriptionURL *string `json:"subscription_url,omitempty"`
117 TagsURL *string `json:"tags_url,omitempty"`
118 TreesURL *string `json:"trees_url,omitempty"`
119 TeamsURL *string `json:"teams_url,omitempty"`
120
121
122
123 TextMatches []*TextMatch `json:"text_matches,omitempty"`
124
125
126
127
128 Visibility *string `json:"visibility,omitempty"`
129 }
130
131 func (r Repository) String() string {
132 return Stringify(r)
133 }
134
135
136
137 type BranchListOptions struct {
138
139
140
141
142 Protected *bool `url:"protected,omitempty"`
143
144 ListOptions
145 }
146
147
148
149 type RepositoryListOptions struct {
150
151
152 Visibility string `url:"visibility,omitempty"`
153
154
155
156
157
158
159
160
161
162
163 Affiliation string `url:"affiliation,omitempty"`
164
165
166
167
168
169 Type string `url:"type,omitempty"`
170
171
172
173 Sort string `url:"sort,omitempty"`
174
175
176
177 Direction string `url:"direction,omitempty"`
178
179 ListOptions
180 }
181
182
183
184
185
186
187 func (s *RepositoriesService) List(ctx context.Context, user string, opts *RepositoryListOptions) ([]*Repository, *Response, error) {
188 var u string
189 if user != "" {
190 u = fmt.Sprintf("users/%v/repos", user)
191 } else {
192 u = "user/repos"
193 }
194 u, err := addOptions(u, opts)
195 if err != nil {
196 return nil, nil, err
197 }
198
199 req, err := s.client.NewRequest("GET", u, nil)
200 if err != nil {
201 return nil, nil, err
202 }
203
204
205 acceptHeaders := []string{mediaTypeTopicsPreview}
206 req.Header.Set("Accept", strings.Join(acceptHeaders, ", "))
207
208 var repos []*Repository
209 resp, err := s.client.Do(ctx, req, &repos)
210 if err != nil {
211 return nil, resp, err
212 }
213
214 return repos, resp, nil
215 }
216
217
218
219 type RepositoryListByOrgOptions struct {
220
221
222 Type string `url:"type,omitempty"`
223
224
225
226 Sort string `url:"sort,omitempty"`
227
228
229
230 Direction string `url:"direction,omitempty"`
231
232 ListOptions
233 }
234
235
236
237
238 func (s *RepositoriesService) ListByOrg(ctx context.Context, org string, opts *RepositoryListByOrgOptions) ([]*Repository, *Response, error) {
239 u := fmt.Sprintf("orgs/%v/repos", org)
240 u, err := addOptions(u, opts)
241 if err != nil {
242 return nil, nil, err
243 }
244
245 req, err := s.client.NewRequest("GET", u, nil)
246 if err != nil {
247 return nil, nil, err
248 }
249
250
251 acceptHeaders := []string{mediaTypeTopicsPreview}
252 req.Header.Set("Accept", strings.Join(acceptHeaders, ", "))
253
254 var repos []*Repository
255 resp, err := s.client.Do(ctx, req, &repos)
256 if err != nil {
257 return nil, resp, err
258 }
259
260 return repos, resp, nil
261 }
262
263
264
265 type RepositoryListAllOptions struct {
266
267 Since int64 `url:"since,omitempty"`
268 }
269
270
271
272
273 func (s *RepositoriesService) ListAll(ctx context.Context, opts *RepositoryListAllOptions) ([]*Repository, *Response, error) {
274 u, err := addOptions("repositories", opts)
275 if err != nil {
276 return nil, nil, err
277 }
278
279 req, err := s.client.NewRequest("GET", u, nil)
280 if err != nil {
281 return nil, nil, err
282 }
283
284 var repos []*Repository
285 resp, err := s.client.Do(ctx, req, &repos)
286 if err != nil {
287 return nil, resp, err
288 }
289
290 return repos, resp, nil
291 }
292
293
294
295
296
297
298 type createRepoRequest struct {
299
300 Name *string `json:"name,omitempty"`
301 Description *string `json:"description,omitempty"`
302 Homepage *string `json:"homepage,omitempty"`
303
304 Private *bool `json:"private,omitempty"`
305 Visibility *string `json:"visibility,omitempty"`
306 HasIssues *bool `json:"has_issues,omitempty"`
307 HasProjects *bool `json:"has_projects,omitempty"`
308 HasWiki *bool `json:"has_wiki,omitempty"`
309 IsTemplate *bool `json:"is_template,omitempty"`
310
311
312 TeamID *int64 `json:"team_id,omitempty"`
313
314 AutoInit *bool `json:"auto_init,omitempty"`
315 GitignoreTemplate *string `json:"gitignore_template,omitempty"`
316 LicenseTemplate *string `json:"license_template,omitempty"`
317 AllowSquashMerge *bool `json:"allow_squash_merge,omitempty"`
318 AllowMergeCommit *bool `json:"allow_merge_commit,omitempty"`
319 AllowRebaseMerge *bool `json:"allow_rebase_merge,omitempty"`
320 DeleteBranchOnMerge *bool `json:"delete_branch_on_merge,omitempty"`
321 }
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337 func (s *RepositoriesService) Create(ctx context.Context, org string, repo *Repository) (*Repository, *Response, error) {
338 var u string
339 if org != "" {
340 u = fmt.Sprintf("orgs/%v/repos", org)
341 } else {
342 u = "user/repos"
343 }
344
345 repoReq := &createRepoRequest{
346 Name: repo.Name,
347 Description: repo.Description,
348 Homepage: repo.Homepage,
349 Private: repo.Private,
350 Visibility: repo.Visibility,
351 HasIssues: repo.HasIssues,
352 HasProjects: repo.HasProjects,
353 HasWiki: repo.HasWiki,
354 IsTemplate: repo.IsTemplate,
355 TeamID: repo.TeamID,
356 AutoInit: repo.AutoInit,
357 GitignoreTemplate: repo.GitignoreTemplate,
358 LicenseTemplate: repo.LicenseTemplate,
359 AllowSquashMerge: repo.AllowSquashMerge,
360 AllowMergeCommit: repo.AllowMergeCommit,
361 AllowRebaseMerge: repo.AllowRebaseMerge,
362 DeleteBranchOnMerge: repo.DeleteBranchOnMerge,
363 }
364
365 req, err := s.client.NewRequest("POST", u, repoReq)
366 if err != nil {
367 return nil, nil, err
368 }
369
370 acceptHeaders := []string{mediaTypeRepositoryTemplatePreview, mediaTypeRepositoryVisibilityPreview}
371 req.Header.Set("Accept", strings.Join(acceptHeaders, ", "))
372 r := new(Repository)
373 resp, err := s.client.Do(ctx, req, r)
374 if err != nil {
375 return nil, resp, err
376 }
377
378 return r, resp, nil
379 }
380
381
382 type TemplateRepoRequest struct {
383
384 Name *string `json:"name,omitempty"`
385 Owner *string `json:"owner,omitempty"`
386 Description *string `json:"description,omitempty"`
387
388 Private *bool `json:"private,omitempty"`
389 }
390
391
392
393
394 func (s *RepositoriesService) CreateFromTemplate(ctx context.Context, templateOwner, templateRepo string, templateRepoReq *TemplateRepoRequest) (*Repository, *Response, error) {
395 u := fmt.Sprintf("repos/%v/%v/generate", templateOwner, templateRepo)
396
397 req, err := s.client.NewRequest("POST", u, templateRepoReq)
398 if err != nil {
399 return nil, nil, err
400 }
401
402 req.Header.Set("Accept", mediaTypeRepositoryTemplatePreview)
403 r := new(Repository)
404 resp, err := s.client.Do(ctx, req, r)
405 if err != nil {
406 return nil, resp, err
407 }
408
409 return r, resp, nil
410 }
411
412
413
414
415 func (s *RepositoriesService) Get(ctx context.Context, owner, repo string) (*Repository, *Response, error) {
416 u := fmt.Sprintf("repos/%v/%v", owner, repo)
417 req, err := s.client.NewRequest("GET", u, nil)
418 if err != nil {
419 return nil, nil, err
420 }
421
422
423
424 acceptHeaders := []string{
425 mediaTypeCodesOfConductPreview,
426 mediaTypeTopicsPreview,
427 mediaTypeRepositoryTemplatePreview,
428 mediaTypeRepositoryVisibilityPreview,
429 }
430 req.Header.Set("Accept", strings.Join(acceptHeaders, ", "))
431
432 repository := new(Repository)
433 resp, err := s.client.Do(ctx, req, repository)
434 if err != nil {
435 return nil, resp, err
436 }
437
438 return repository, resp, nil
439 }
440
441
442
443
444 func (s *RepositoriesService) GetCodeOfConduct(ctx context.Context, owner, repo string) (*CodeOfConduct, *Response, error) {
445 u := fmt.Sprintf("repos/%v/%v/community/code_of_conduct", owner, repo)
446 req, err := s.client.NewRequest("GET", u, nil)
447 if err != nil {
448 return nil, nil, err
449 }
450
451
452 req.Header.Set("Accept", mediaTypeCodesOfConductPreview)
453
454 coc := new(CodeOfConduct)
455 resp, err := s.client.Do(ctx, req, coc)
456 if err != nil {
457 return nil, resp, err
458 }
459
460 return coc, resp, nil
461 }
462
463
464
465
466 func (s *RepositoriesService) GetByID(ctx context.Context, id int64) (*Repository, *Response, error) {
467 u := fmt.Sprintf("repositories/%d", id)
468 req, err := s.client.NewRequest("GET", u, nil)
469 if err != nil {
470 return nil, nil, err
471 }
472
473 repository := new(Repository)
474 resp, err := s.client.Do(ctx, req, repository)
475 if err != nil {
476 return nil, resp, err
477 }
478
479 return repository, resp, nil
480 }
481
482
483
484
485 func (s *RepositoriesService) Edit(ctx context.Context, owner, repo string, repository *Repository) (*Repository, *Response, error) {
486 u := fmt.Sprintf("repos/%v/%v", owner, repo)
487 req, err := s.client.NewRequest("PATCH", u, repository)
488 if err != nil {
489 return nil, nil, err
490 }
491
492 acceptHeaders := []string{mediaTypeRepositoryTemplatePreview, mediaTypeRepositoryVisibilityPreview}
493 req.Header.Set("Accept", strings.Join(acceptHeaders, ", "))
494 r := new(Repository)
495 resp, err := s.client.Do(ctx, req, r)
496 if err != nil {
497 return nil, resp, err
498 }
499
500 return r, resp, nil
501 }
502
503
504
505
506 func (s *RepositoriesService) Delete(ctx context.Context, owner, repo string) (*Response, error) {
507 u := fmt.Sprintf("repos/%v/%v", owner, repo)
508 req, err := s.client.NewRequest("DELETE", u, nil)
509 if err != nil {
510 return nil, err
511 }
512
513 return s.client.Do(ctx, req, nil)
514 }
515
516
517 type Contributor struct {
518 Login *string `json:"login,omitempty"`
519 ID *int64 `json:"id,omitempty"`
520 NodeID *string `json:"node_id,omitempty"`
521 AvatarURL *string `json:"avatar_url,omitempty"`
522 GravatarID *string `json:"gravatar_id,omitempty"`
523 URL *string `json:"url,omitempty"`
524 HTMLURL *string `json:"html_url,omitempty"`
525 FollowersURL *string `json:"followers_url,omitempty"`
526 FollowingURL *string `json:"following_url,omitempty"`
527 GistsURL *string `json:"gists_url,omitempty"`
528 StarredURL *string `json:"starred_url,omitempty"`
529 SubscriptionsURL *string `json:"subscriptions_url,omitempty"`
530 OrganizationsURL *string `json:"organizations_url,omitempty"`
531 ReposURL *string `json:"repos_url,omitempty"`
532 EventsURL *string `json:"events_url,omitempty"`
533 ReceivedEventsURL *string `json:"received_events_url,omitempty"`
534 Type *string `json:"type,omitempty"`
535 SiteAdmin *bool `json:"site_admin,omitempty"`
536 Contributions *int `json:"contributions,omitempty"`
537 }
538
539
540
541 type ListContributorsOptions struct {
542
543 Anon string `url:"anon,omitempty"`
544
545 ListOptions
546 }
547
548
549
550
551 func (s *RepositoriesService) GetVulnerabilityAlerts(ctx context.Context, owner, repository string) (bool, *Response, error) {
552 u := fmt.Sprintf("repos/%v/%v/vulnerability-alerts", owner, repository)
553
554 req, err := s.client.NewRequest("GET", u, nil)
555 if err != nil {
556 return false, nil, err
557 }
558
559
560 req.Header.Set("Accept", mediaTypeRequiredVulnerabilityAlertsPreview)
561
562 resp, err := s.client.Do(ctx, req, nil)
563 vulnerabilityAlertsEnabled, err := parseBoolResponse(err)
564
565 return vulnerabilityAlertsEnabled, resp, err
566 }
567
568
569
570
571 func (s *RepositoriesService) EnableVulnerabilityAlerts(ctx context.Context, owner, repository string) (*Response, error) {
572 u := fmt.Sprintf("repos/%v/%v/vulnerability-alerts", owner, repository)
573
574 req, err := s.client.NewRequest("PUT", u, nil)
575 if err != nil {
576 return nil, err
577 }
578
579
580 req.Header.Set("Accept", mediaTypeRequiredVulnerabilityAlertsPreview)
581
582 return s.client.Do(ctx, req, nil)
583 }
584
585
586
587
588 func (s *RepositoriesService) DisableVulnerabilityAlerts(ctx context.Context, owner, repository string) (*Response, error) {
589 u := fmt.Sprintf("repos/%v/%v/vulnerability-alerts", owner, repository)
590
591 req, err := s.client.NewRequest("DELETE", u, nil)
592 if err != nil {
593 return nil, err
594 }
595
596
597 req.Header.Set("Accept", mediaTypeRequiredVulnerabilityAlertsPreview)
598
599 return s.client.Do(ctx, req, nil)
600 }
601
602
603
604
605 func (s *RepositoriesService) EnableAutomatedSecurityFixes(ctx context.Context, owner, repository string) (*Response, error) {
606 u := fmt.Sprintf("repos/%v/%v/automated-security-fixes", owner, repository)
607
608 req, err := s.client.NewRequest("PUT", u, nil)
609 if err != nil {
610 return nil, err
611 }
612
613
614 req.Header.Set("Accept", mediaTypeRequiredAutomatedSecurityFixesPreview)
615
616 return s.client.Do(ctx, req, nil)
617 }
618
619
620
621
622 func (s *RepositoriesService) DisableAutomatedSecurityFixes(ctx context.Context, owner, repository string) (*Response, error) {
623 u := fmt.Sprintf("repos/%v/%v/automated-security-fixes", owner, repository)
624
625 req, err := s.client.NewRequest("DELETE", u, nil)
626 if err != nil {
627 return nil, err
628 }
629
630
631 req.Header.Set("Accept", mediaTypeRequiredAutomatedSecurityFixesPreview)
632
633 return s.client.Do(ctx, req, nil)
634 }
635
636
637
638
639 func (s *RepositoriesService) ListContributors(ctx context.Context, owner string, repository string, opts *ListContributorsOptions) ([]*Contributor, *Response, error) {
640 u := fmt.Sprintf("repos/%v/%v/contributors", owner, repository)
641 u, err := addOptions(u, opts)
642 if err != nil {
643 return nil, nil, err
644 }
645
646 req, err := s.client.NewRequest("GET", u, nil)
647 if err != nil {
648 return nil, nil, err
649 }
650
651 var contributor []*Contributor
652 resp, err := s.client.Do(ctx, req, &contributor)
653 if err != nil {
654 return nil, nil, err
655 }
656
657 return contributor, resp, nil
658 }
659
660
661
662
663
664
665
666
667
668
669
670 func (s *RepositoriesService) ListLanguages(ctx context.Context, owner string, repo string) (map[string]int, *Response, error) {
671 u := fmt.Sprintf("repos/%v/%v/languages", owner, repo)
672 req, err := s.client.NewRequest("GET", u, nil)
673 if err != nil {
674 return nil, nil, err
675 }
676
677 languages := make(map[string]int)
678 resp, err := s.client.Do(ctx, req, &languages)
679 if err != nil {
680 return nil, resp, err
681 }
682
683 return languages, resp, nil
684 }
685
686
687
688
689 func (s *RepositoriesService) ListTeams(ctx context.Context, owner string, repo string, opts *ListOptions) ([]*Team, *Response, error) {
690 u := fmt.Sprintf("repos/%v/%v/teams", owner, repo)
691 u, err := addOptions(u, opts)
692 if err != nil {
693 return nil, nil, err
694 }
695
696 req, err := s.client.NewRequest("GET", u, nil)
697 if err != nil {
698 return nil, nil, err
699 }
700
701 var teams []*Team
702 resp, err := s.client.Do(ctx, req, &teams)
703 if err != nil {
704 return nil, resp, err
705 }
706
707 return teams, resp, nil
708 }
709
710
711 type RepositoryTag struct {
712 Name *string `json:"name,omitempty"`
713 Commit *Commit `json:"commit,omitempty"`
714 ZipballURL *string `json:"zipball_url,omitempty"`
715 TarballURL *string `json:"tarball_url,omitempty"`
716 }
717
718
719
720
721 func (s *RepositoriesService) ListTags(ctx context.Context, owner string, repo string, opts *ListOptions) ([]*RepositoryTag, *Response, error) {
722 u := fmt.Sprintf("repos/%v/%v/tags", owner, repo)
723 u, err := addOptions(u, opts)
724 if err != nil {
725 return nil, nil, err
726 }
727
728 req, err := s.client.NewRequest("GET", u, nil)
729 if err != nil {
730 return nil, nil, err
731 }
732
733 var tags []*RepositoryTag
734 resp, err := s.client.Do(ctx, req, &tags)
735 if err != nil {
736 return nil, resp, err
737 }
738
739 return tags, resp, nil
740 }
741
742
743 type Branch struct {
744 Name *string `json:"name,omitempty"`
745 Commit *RepositoryCommit `json:"commit,omitempty"`
746 Protected *bool `json:"protected,omitempty"`
747 }
748
749
750 type Protection struct {
751 RequiredStatusChecks *RequiredStatusChecks `json:"required_status_checks"`
752 RequiredPullRequestReviews *PullRequestReviewsEnforcement `json:"required_pull_request_reviews"`
753 EnforceAdmins *AdminEnforcement `json:"enforce_admins"`
754 Restrictions *BranchRestrictions `json:"restrictions"`
755 RequireLinearHistory *RequireLinearHistory `json:"required_linear_history"`
756 AllowForcePushes *AllowForcePushes `json:"allow_force_pushes"`
757 AllowDeletions *AllowDeletions `json:"allow_deletions"`
758 }
759
760
761 type ProtectionRequest struct {
762 RequiredStatusChecks *RequiredStatusChecks `json:"required_status_checks"`
763 RequiredPullRequestReviews *PullRequestReviewsEnforcementRequest `json:"required_pull_request_reviews"`
764 EnforceAdmins bool `json:"enforce_admins"`
765 Restrictions *BranchRestrictionsRequest `json:"restrictions"`
766
767 RequireLinearHistory *bool `json:"required_linear_history,omitempty"`
768
769 AllowForcePushes *bool `json:"allow_force_pushes,omitempty"`
770
771 AllowDeletions *bool `json:"allow_deletions,omitempty"`
772 }
773
774
775 type RequiredStatusChecks struct {
776
777 Strict bool `json:"strict"`
778
779
780 Contexts []string `json:"contexts"`
781 }
782
783
784 type RequiredStatusChecksRequest struct {
785 Strict *bool `json:"strict,omitempty"`
786 Contexts []string `json:"contexts,omitempty"`
787 }
788
789
790 type PullRequestReviewsEnforcement struct {
791
792 DismissalRestrictions *DismissalRestrictions `json:"dismissal_restrictions,omitempty"`
793
794 DismissStaleReviews bool `json:"dismiss_stale_reviews"`
795
796 RequireCodeOwnerReviews bool `json:"require_code_owner_reviews"`
797
798
799 RequiredApprovingReviewCount int `json:"required_approving_review_count"`
800 }
801
802
803
804
805 type PullRequestReviewsEnforcementRequest struct {
806
807
808
809 DismissalRestrictionsRequest *DismissalRestrictionsRequest `json:"dismissal_restrictions,omitempty"`
810
811 DismissStaleReviews bool `json:"dismiss_stale_reviews"`
812
813 RequireCodeOwnerReviews bool `json:"require_code_owner_reviews"`
814
815
816 RequiredApprovingReviewCount int `json:"required_approving_review_count"`
817 }
818
819
820
821
822 type PullRequestReviewsEnforcementUpdate struct {
823
824 DismissalRestrictionsRequest *DismissalRestrictionsRequest `json:"dismissal_restrictions,omitempty"`
825
826 DismissStaleReviews *bool `json:"dismiss_stale_reviews,omitempty"`
827
828 RequireCodeOwnerReviews bool `json:"require_code_owner_reviews,omitempty"`
829
830
831 RequiredApprovingReviewCount int `json:"required_approving_review_count"`
832 }
833
834
835 type RequireLinearHistory struct {
836 Enabled bool `json:"enabled"`
837 }
838
839
840 type AllowDeletions struct {
841 Enabled bool `json:"enabled"`
842 }
843
844
845 type AllowForcePushes struct {
846 Enabled bool `json:"enabled"`
847 }
848
849
850 type AdminEnforcement struct {
851 URL *string `json:"url,omitempty"`
852 Enabled bool `json:"enabled"`
853 }
854
855
856
857 type BranchRestrictions struct {
858
859 Users []*User `json:"users"`
860
861 Teams []*Team `json:"teams"`
862
863 Apps []*App `json:"apps"`
864 }
865
866
867
868
869
870 type BranchRestrictionsRequest struct {
871
872 Users []string `json:"users"`
873
874 Teams []string `json:"teams"`
875
876 Apps []string `json:"apps,omitempty"`
877 }
878
879
880 type DismissalRestrictions struct {
881
882 Users []*User `json:"users"`
883
884 Teams []*Team `json:"teams"`
885 }
886
887
888
889
890
891
892 type DismissalRestrictionsRequest struct {
893
894 Users *[]string `json:"users,omitempty"`
895
896 Teams *[]string `json:"teams,omitempty"`
897 }
898
899
900 type SignaturesProtectedBranch struct {
901 URL *string `json:"url,omitempty"`
902
903 Enabled *bool `json:"enabled,omitempty"`
904 }
905
906
907
908
909 func (s *RepositoriesService) ListBranches(ctx context.Context, owner string, repo string, opts *BranchListOptions) ([]*Branch, *Response, error) {
910 u := fmt.Sprintf("repos/%v/%v/branches", owner, repo)
911 u, err := addOptions(u, opts)
912 if err != nil {
913 return nil, nil, err
914 }
915
916 req, err := s.client.NewRequest("GET", u, nil)
917 if err != nil {
918 return nil, nil, err
919 }
920
921
922 req.Header.Set("Accept", mediaTypeRequiredApprovingReviewsPreview)
923
924 var branches []*Branch
925 resp, err := s.client.Do(ctx, req, &branches)
926 if err != nil {
927 return nil, resp, err
928 }
929
930 return branches, resp, nil
931 }
932
933
934
935
936 func (s *RepositoriesService) GetBranch(ctx context.Context, owner, repo, branch string) (*Branch, *Response, error) {
937 u := fmt.Sprintf("repos/%v/%v/branches/%v", owner, repo, branch)
938 req, err := s.client.NewRequest("GET", u, nil)
939 if err != nil {
940 return nil, nil, err
941 }
942
943
944 req.Header.Set("Accept", mediaTypeRequiredApprovingReviewsPreview)
945
946 b := new(Branch)
947 resp, err := s.client.Do(ctx, req, b)
948 if err != nil {
949 return nil, resp, err
950 }
951
952 return b, resp, nil
953 }
954
955
956
957
958 func (s *RepositoriesService) GetBranchProtection(ctx context.Context, owner, repo, branch string) (*Protection, *Response, error) {
959 u := fmt.Sprintf("repos/%v/%v/branches/%v/protection", owner, repo, branch)
960 req, err := s.client.NewRequest("GET", u, nil)
961 if err != nil {
962 return nil, nil, err
963 }
964
965
966 req.Header.Set("Accept", mediaTypeRequiredApprovingReviewsPreview)
967
968 p := new(Protection)
969 resp, err := s.client.Do(ctx, req, p)
970 if err != nil {
971 return nil, resp, err
972 }
973
974 return p, resp, nil
975 }
976
977
978
979
980 func (s *RepositoriesService) GetRequiredStatusChecks(ctx context.Context, owner, repo, branch string) (*RequiredStatusChecks, *Response, error) {
981 u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/required_status_checks", owner, repo, branch)
982 req, err := s.client.NewRequest("GET", u, nil)
983 if err != nil {
984 return nil, nil, err
985 }
986
987
988 req.Header.Set("Accept", mediaTypeRequiredApprovingReviewsPreview)
989
990 p := new(RequiredStatusChecks)
991 resp, err := s.client.Do(ctx, req, p)
992 if err != nil {
993 return nil, resp, err
994 }
995
996 return p, resp, nil
997 }
998
999
1000
1001
1002 func (s *RepositoriesService) ListRequiredStatusChecksContexts(ctx context.Context, owner, repo, branch string) (contexts []string, resp *Response, err error) {
1003 u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/required_status_checks/contexts", owner, repo, branch)
1004 req, err := s.client.NewRequest("GET", u, nil)
1005 if err != nil {
1006 return nil, nil, err
1007 }
1008
1009
1010 req.Header.Set("Accept", mediaTypeRequiredApprovingReviewsPreview)
1011
1012 resp, err = s.client.Do(ctx, req, &contexts)
1013 if err != nil {
1014 return nil, resp, err
1015 }
1016
1017 return contexts, resp, nil
1018 }
1019
1020
1021
1022
1023 func (s *RepositoriesService) UpdateBranchProtection(ctx context.Context, owner, repo, branch string, preq *ProtectionRequest) (*Protection, *Response, error) {
1024 u := fmt.Sprintf("repos/%v/%v/branches/%v/protection", owner, repo, branch)
1025 req, err := s.client.NewRequest("PUT", u, preq)
1026 if err != nil {
1027 return nil, nil, err
1028 }
1029
1030
1031 req.Header.Set("Accept", mediaTypeRequiredApprovingReviewsPreview)
1032
1033 p := new(Protection)
1034 resp, err := s.client.Do(ctx, req, p)
1035 if err != nil {
1036 return nil, resp, err
1037 }
1038
1039 return p, resp, nil
1040 }
1041
1042
1043
1044
1045 func (s *RepositoriesService) RemoveBranchProtection(ctx context.Context, owner, repo, branch string) (*Response, error) {
1046 u := fmt.Sprintf("repos/%v/%v/branches/%v/protection", owner, repo, branch)
1047 req, err := s.client.NewRequest("DELETE", u, nil)
1048 if err != nil {
1049 return nil, err
1050 }
1051
1052
1053 req.Header.Set("Accept", mediaTypeRequiredApprovingReviewsPreview)
1054
1055 return s.client.Do(ctx, req, nil)
1056 }
1057
1058
1059
1060
1061 func (s *RepositoriesService) GetSignaturesProtectedBranch(ctx context.Context, owner, repo, branch string) (*SignaturesProtectedBranch, *Response, error) {
1062 u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/required_signatures", owner, repo, branch)
1063 req, err := s.client.NewRequest("GET", u, nil)
1064 if err != nil {
1065 return nil, nil, err
1066 }
1067
1068
1069 req.Header.Set("Accept", mediaTypeSignaturePreview)
1070
1071 p := new(SignaturesProtectedBranch)
1072 resp, err := s.client.Do(ctx, req, p)
1073 if err != nil {
1074 return nil, resp, err
1075 }
1076
1077 return p, resp, nil
1078 }
1079
1080
1081
1082
1083
1084 func (s *RepositoriesService) RequireSignaturesOnProtectedBranch(ctx context.Context, owner, repo, branch string) (*SignaturesProtectedBranch, *Response, error) {
1085 u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/required_signatures", owner, repo, branch)
1086 req, err := s.client.NewRequest("POST", u, nil)
1087 if err != nil {
1088 return nil, nil, err
1089 }
1090
1091
1092 req.Header.Set("Accept", mediaTypeSignaturePreview)
1093
1094 r := new(SignaturesProtectedBranch)
1095 resp, err := s.client.Do(ctx, req, r)
1096 if err != nil {
1097 return nil, resp, err
1098 }
1099
1100 return r, resp, err
1101 }
1102
1103
1104
1105
1106 func (s *RepositoriesService) OptionalSignaturesOnProtectedBranch(ctx context.Context, owner, repo, branch string) (*Response, error) {
1107 u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/required_signatures", owner, repo, branch)
1108 req, err := s.client.NewRequest("DELETE", u, nil)
1109 if err != nil {
1110 return nil, err
1111 }
1112
1113
1114 req.Header.Set("Accept", mediaTypeSignaturePreview)
1115
1116 return s.client.Do(ctx, req, nil)
1117 }
1118
1119
1120
1121
1122 func (s *RepositoriesService) UpdateRequiredStatusChecks(ctx context.Context, owner, repo, branch string, sreq *RequiredStatusChecksRequest) (*RequiredStatusChecks, *Response, error) {
1123 u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/required_status_checks", owner, repo, branch)
1124 req, err := s.client.NewRequest("PATCH", u, sreq)
1125 if err != nil {
1126 return nil, nil, err
1127 }
1128
1129 sc := new(RequiredStatusChecks)
1130 resp, err := s.client.Do(ctx, req, sc)
1131 if err != nil {
1132 return nil, resp, err
1133 }
1134
1135 return sc, resp, nil
1136 }
1137
1138
1139
1140
1141 func (s *RepositoriesService) License(ctx context.Context, owner, repo string) (*RepositoryLicense, *Response, error) {
1142 u := fmt.Sprintf("repos/%v/%v/license", owner, repo)
1143 req, err := s.client.NewRequest("GET", u, nil)
1144 if err != nil {
1145 return nil, nil, err
1146 }
1147
1148 r := &RepositoryLicense{}
1149 resp, err := s.client.Do(ctx, req, r)
1150 if err != nil {
1151 return nil, resp, err
1152 }
1153
1154 return r, resp, nil
1155 }
1156
1157
1158
1159
1160 func (s *RepositoriesService) GetPullRequestReviewEnforcement(ctx context.Context, owner, repo, branch string) (*PullRequestReviewsEnforcement, *Response, error) {
1161 u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/required_pull_request_reviews", owner, repo, branch)
1162 req, err := s.client.NewRequest("GET", u, nil)
1163 if err != nil {
1164 return nil, nil, err
1165 }
1166
1167
1168 req.Header.Set("Accept", mediaTypeRequiredApprovingReviewsPreview)
1169
1170 r := new(PullRequestReviewsEnforcement)
1171 resp, err := s.client.Do(ctx, req, r)
1172 if err != nil {
1173 return nil, resp, err
1174 }
1175
1176 return r, resp, nil
1177 }
1178
1179
1180
1181
1182
1183 func (s *RepositoriesService) UpdatePullRequestReviewEnforcement(ctx context.Context, owner, repo, branch string, patch *PullRequestReviewsEnforcementUpdate) (*PullRequestReviewsEnforcement, *Response, error) {
1184 u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/required_pull_request_reviews", owner, repo, branch)
1185 req, err := s.client.NewRequest("PATCH", u, patch)
1186 if err != nil {
1187 return nil, nil, err
1188 }
1189
1190
1191 req.Header.Set("Accept", mediaTypeRequiredApprovingReviewsPreview)
1192
1193 r := new(PullRequestReviewsEnforcement)
1194 resp, err := s.client.Do(ctx, req, r)
1195 if err != nil {
1196 return nil, resp, err
1197 }
1198
1199 return r, resp, err
1200 }
1201
1202
1203
1204
1205
1206 func (s *RepositoriesService) DisableDismissalRestrictions(ctx context.Context, owner, repo, branch string) (*PullRequestReviewsEnforcement, *Response, error) {
1207 u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/required_pull_request_reviews", owner, repo, branch)
1208
1209 data := new(struct {
1210 DismissalRestrictionsRequest `json:"dismissal_restrictions"`
1211 })
1212
1213 req, err := s.client.NewRequest("PATCH", u, data)
1214 if err != nil {
1215 return nil, nil, err
1216 }
1217
1218
1219 req.Header.Set("Accept", mediaTypeRequiredApprovingReviewsPreview)
1220
1221 r := new(PullRequestReviewsEnforcement)
1222 resp, err := s.client.Do(ctx, req, r)
1223 if err != nil {
1224 return nil, resp, err
1225 }
1226
1227 return r, resp, err
1228 }
1229
1230
1231
1232
1233 func (s *RepositoriesService) RemovePullRequestReviewEnforcement(ctx context.Context, owner, repo, branch string) (*Response, error) {
1234 u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/required_pull_request_reviews", owner, repo, branch)
1235 req, err := s.client.NewRequest("DELETE", u, nil)
1236 if err != nil {
1237 return nil, err
1238 }
1239
1240
1241 req.Header.Set("Accept", mediaTypeRequiredApprovingReviewsPreview)
1242
1243 return s.client.Do(ctx, req, nil)
1244 }
1245
1246
1247
1248
1249 func (s *RepositoriesService) GetAdminEnforcement(ctx context.Context, owner, repo, branch string) (*AdminEnforcement, *Response, error) {
1250 u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/enforce_admins", owner, repo, branch)
1251 req, err := s.client.NewRequest("GET", u, nil)
1252 if err != nil {
1253 return nil, nil, err
1254 }
1255
1256
1257 req.Header.Set("Accept", mediaTypeRequiredApprovingReviewsPreview)
1258
1259 r := new(AdminEnforcement)
1260 resp, err := s.client.Do(ctx, req, r)
1261 if err != nil {
1262 return nil, resp, err
1263 }
1264
1265 return r, resp, nil
1266 }
1267
1268
1269
1270
1271
1272 func (s *RepositoriesService) AddAdminEnforcement(ctx context.Context, owner, repo, branch string) (*AdminEnforcement, *Response, error) {
1273 u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/enforce_admins", owner, repo, branch)
1274 req, err := s.client.NewRequest("POST", u, nil)
1275 if err != nil {
1276 return nil, nil, err
1277 }
1278
1279
1280 req.Header.Set("Accept", mediaTypeRequiredApprovingReviewsPreview)
1281
1282 r := new(AdminEnforcement)
1283 resp, err := s.client.Do(ctx, req, r)
1284 if err != nil {
1285 return nil, resp, err
1286 }
1287
1288 return r, resp, err
1289 }
1290
1291
1292
1293
1294 func (s *RepositoriesService) RemoveAdminEnforcement(ctx context.Context, owner, repo, branch string) (*Response, error) {
1295 u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/enforce_admins", owner, repo, branch)
1296 req, err := s.client.NewRequest("DELETE", u, nil)
1297 if err != nil {
1298 return nil, err
1299 }
1300
1301
1302 req.Header.Set("Accept", mediaTypeRequiredApprovingReviewsPreview)
1303
1304 return s.client.Do(ctx, req, nil)
1305 }
1306
1307
1308 type repositoryTopics struct {
1309 Names []string `json:"names"`
1310 }
1311
1312
1313
1314
1315 func (s *RepositoriesService) ListAllTopics(ctx context.Context, owner, repo string) ([]string, *Response, error) {
1316 u := fmt.Sprintf("repos/%v/%v/topics", owner, repo)
1317 req, err := s.client.NewRequest("GET", u, nil)
1318 if err != nil {
1319 return nil, nil, err
1320 }
1321
1322
1323 req.Header.Set("Accept", mediaTypeTopicsPreview)
1324
1325 topics := new(repositoryTopics)
1326 resp, err := s.client.Do(ctx, req, topics)
1327 if err != nil {
1328 return nil, resp, err
1329 }
1330
1331 return topics.Names, resp, nil
1332 }
1333
1334
1335
1336
1337 func (s *RepositoriesService) ReplaceAllTopics(ctx context.Context, owner, repo string, topics []string) ([]string, *Response, error) {
1338 u := fmt.Sprintf("repos/%v/%v/topics", owner, repo)
1339 t := &repositoryTopics{
1340 Names: topics,
1341 }
1342 if t.Names == nil {
1343 t.Names = []string{}
1344 }
1345 req, err := s.client.NewRequest("PUT", u, t)
1346 if err != nil {
1347 return nil, nil, err
1348 }
1349
1350
1351 req.Header.Set("Accept", mediaTypeTopicsPreview)
1352
1353 t = new(repositoryTopics)
1354 resp, err := s.client.Do(ctx, req, t)
1355 if err != nil {
1356 return nil, resp, err
1357 }
1358
1359 return t.Names, resp, nil
1360 }
1361
1362
1363
1364
1365
1366 func (s *RepositoriesService) ListApps(ctx context.Context, owner, repo, branch string) ([]*App, *Response, error) {
1367 u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/restrictions/apps", owner, repo, branch)
1368 req, err := s.client.NewRequest("GET", u, nil)
1369 if err != nil {
1370 return nil, nil, err
1371 }
1372
1373 var apps []*App
1374 resp, err := s.client.Do(ctx, req, &apps)
1375 if err != nil {
1376 return nil, resp, err
1377 }
1378
1379 return apps, resp, nil
1380 }
1381
1382
1383
1384
1385
1386
1387
1388
1389 func (s *RepositoriesService) ReplaceAppRestrictions(ctx context.Context, owner, repo, branch string, slug []string) ([]*App, *Response, error) {
1390 u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/restrictions/apps", owner, repo, branch)
1391 req, err := s.client.NewRequest("PUT", u, slug)
1392 if err != nil {
1393 return nil, nil, err
1394 }
1395
1396 var apps []*App
1397 resp, err := s.client.Do(ctx, req, &apps)
1398 if err != nil {
1399 return nil, nil, err
1400 }
1401
1402 return apps, resp, nil
1403 }
1404
1405
1406
1407
1408
1409
1410
1411 func (s *RepositoriesService) AddAppRestrictions(ctx context.Context, owner, repo, branch string, slug []string) ([]*App, *Response, error) {
1412 u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/restrictions/apps", owner, repo, branch)
1413 req, err := s.client.NewRequest("POST", u, slug)
1414 if err != nil {
1415 return nil, nil, err
1416 }
1417
1418 var apps []*App
1419 resp, err := s.client.Do(ctx, req, &apps)
1420 if err != nil {
1421 return nil, nil, err
1422 }
1423
1424 return apps, resp, nil
1425 }
1426
1427
1428
1429
1430
1431
1432
1433 func (s *RepositoriesService) RemoveAppRestrictions(ctx context.Context, owner, repo, branch string, slug []string) ([]*App, *Response, error) {
1434 u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/restrictions/apps", owner, repo, branch)
1435 req, err := s.client.NewRequest("DELETE", u, slug)
1436 if err != nil {
1437 return nil, nil, err
1438 }
1439
1440 var apps []*App
1441 resp, err := s.client.Do(ctx, req, &apps)
1442 if err != nil {
1443 return nil, nil, err
1444 }
1445
1446 return apps, resp, nil
1447 }
1448
1449
1450 type TransferRequest struct {
1451 NewOwner string `json:"new_owner"`
1452 TeamID []int64 `json:"team_ids,omitempty"`
1453 }
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464 func (s *RepositoriesService) Transfer(ctx context.Context, owner, repo string, transfer TransferRequest) (*Repository, *Response, error) {
1465 u := fmt.Sprintf("repos/%v/%v/transfer", owner, repo)
1466
1467 req, err := s.client.NewRequest("POST", u, &transfer)
1468 if err != nil {
1469 return nil, nil, err
1470 }
1471
1472 r := new(Repository)
1473 resp, err := s.client.Do(ctx, req, r)
1474 if err != nil {
1475 return nil, resp, err
1476 }
1477
1478 return r, resp, nil
1479 }
1480
1481
1482 type DispatchRequestOptions struct {
1483
1484 EventType string `json:"event_type"`
1485
1486
1487 ClientPayload *json.RawMessage `json:"client_payload,omitempty"`
1488 }
1489
1490
1491
1492
1493 func (s *RepositoriesService) Dispatch(ctx context.Context, owner, repo string, opts DispatchRequestOptions) (*Repository, *Response, error) {
1494 u := fmt.Sprintf("repos/%v/%v/dispatches", owner, repo)
1495
1496 req, err := s.client.NewRequest("POST", u, &opts)
1497 if err != nil {
1498 return nil, nil, err
1499 }
1500
1501 r := new(Repository)
1502 resp, err := s.client.Do(ctx, req, r)
1503 if err != nil {
1504 return nil, resp, err
1505 }
1506
1507 return r, resp, nil
1508 }
1509
View as plain text