Skip to content

Commit 7057678

Browse files
authored
Merge branch 'master' into required-workflows-rulesets
2 parents 2814a48 + 630bfdb commit 7057678

File tree

4 files changed

+166
-74
lines changed

4 files changed

+166
-74
lines changed

github/examples_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,14 +49,14 @@ func ExampleRepositoriesService_GetReadme() {
4949
fmt.Printf("google/go-github README:\n%v\n", content)
5050
}
5151

52-
func ExampleRepositoriesService_List() {
52+
func ExampleRepositoriesService_ListByUser() {
5353
client := github.NewClient(nil)
5454

5555
user := "willnorris"
56-
opt := &github.RepositoryListOptions{Type: "owner", Sort: "updated", Direction: "desc"}
56+
opt := &github.RepositoryListByUserOptions{Type: "owner", Sort: "updated", Direction: "desc"}
5757

5858
ctx := context.Background()
59-
repos, _, err := client.Repositories.List(ctx, user, opt)
59+
repos, _, err := client.Repositories.ListByUser(ctx, user, opt)
6060
if err != nil {
6161
fmt.Println(err)
6262
}

github/repos.go

Lines changed: 119 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -173,33 +173,19 @@ type BranchListOptions struct {
173173
// RepositoryListOptions specifies the optional parameters to the
174174
// RepositoriesService.List method.
175175
type RepositoryListOptions struct {
176-
// Visibility of repositories to list. Can be one of all, public, or private.
177-
// Default: all
176+
// See RepositoryListByAuthenticatedUserOptions.Visibility
178177
Visibility string `url:"visibility,omitempty"`
179178

180-
// List repos of given affiliation[s].
181-
// Comma-separated list of values. Can include:
182-
// * owner: Repositories that are owned by the authenticated user.
183-
// * collaborator: Repositories that the user has been added to as a
184-
// collaborator.
185-
// * organization_member: Repositories that the user has access to through
186-
// being a member of an organization. This includes every repository on
187-
// every team that the user is on.
188-
// Default: owner,collaborator,organization_member
179+
// See RepositoryListByAuthenticatedUserOptions.Affiliation
189180
Affiliation string `url:"affiliation,omitempty"`
190181

191-
// Type of repositories to list.
192-
// Can be one of all, owner, public, private, member. Default: all
193-
// Will cause a 422 error if used in the same request as visibility or
194-
// affiliation.
182+
// See RepositoryListByUserOptions.Type or RepositoryListByAuthenticatedUserOptions.Type
195183
Type string `url:"type,omitempty"`
196184

197-
// How to sort the repository list. Can be one of created, updated, pushed,
198-
// full_name. Default: full_name
185+
// See RepositoryListByUserOptions.Sort or RepositoryListByAuthenticatedUserOptions.Sort
199186
Sort string `url:"sort,omitempty"`
200187

201-
// Direction in which to sort repositories. Can be one of asc or desc.
202-
// Default: when using full_name: asc; otherwise desc
188+
// See RepositoryListByUserOptions.Direction or RepositoryListByAuthenticatedUserOptions.Direction
203189
Direction string `url:"direction,omitempty"`
204190

205191
ListOptions
@@ -262,21 +248,66 @@ func (d DependabotSecurityUpdates) String() string {
262248
return Stringify(d)
263249
}
264250

265-
// List the repositories for a user. Passing the empty string will list
266-
// repositories for the authenticated user.
251+
// List calls either RepositoriesService.ListByUser or RepositoriesService.ListByAuthenticatedUser
252+
// depending on whether user is empty.
253+
//
254+
// Deprecated: Use RepositoriesService.ListByUser or RepositoriesService.ListByAuthenticatedUser instead.
267255
//
268256
// GitHub API docs: https://docs.github.com/rest/repos/repos#list-repositories-for-a-user
269257
// GitHub API docs: https://docs.github.com/rest/repos/repos#list-repositories-for-the-authenticated-user
270258
//
271259
//meta:operation GET /user/repos
272260
//meta:operation GET /users/{username}/repos
273261
func (s *RepositoriesService) List(ctx context.Context, user string, opts *RepositoryListOptions) ([]*Repository, *Response, error) {
274-
var u string
275-
if user != "" {
276-
u = fmt.Sprintf("users/%v/repos", user)
277-
} else {
278-
u = "user/repos"
262+
if opts == nil {
263+
opts = &RepositoryListOptions{}
279264
}
265+
if user != "" {
266+
return s.ListByUser(ctx, user, &RepositoryListByUserOptions{
267+
Type: opts.Type,
268+
Sort: opts.Sort,
269+
Direction: opts.Direction,
270+
ListOptions: opts.ListOptions,
271+
})
272+
}
273+
return s.ListByAuthenticatedUser(ctx, &RepositoryListByAuthenticatedUserOptions{
274+
Visibility: opts.Visibility,
275+
Affiliation: opts.Affiliation,
276+
Type: opts.Type,
277+
Sort: opts.Sort,
278+
Direction: opts.Direction,
279+
ListOptions: opts.ListOptions,
280+
})
281+
}
282+
283+
// RepositoryListByUserOptions specifies the optional parameters to the
284+
// RepositoriesService.ListByUser method.
285+
type RepositoryListByUserOptions struct {
286+
// Limit results to repositories of the specified type.
287+
// Default: owner
288+
// Can be one of: all, owner, member
289+
Type string `url:"type,omitempty"`
290+
291+
// The property to sort the results by.
292+
// Default: full_name
293+
// Can be one of: created, updated, pushed, full_name
294+
Sort string `url:"sort,omitempty"`
295+
296+
// The order to sort by.
297+
// Default: asc when using full_name, otherwise desc.
298+
// Can be one of: asc, desc
299+
Direction string `url:"direction,omitempty"`
300+
301+
ListOptions
302+
}
303+
304+
// ListByUser lists public repositories for the specified user.
305+
//
306+
// GitHub API docs: https://docs.github.com/rest/repos/repos#list-repositories-for-a-user
307+
//
308+
//meta:operation GET /users/{username}/repos
309+
func (s *RepositoriesService) ListByUser(ctx context.Context, user string, opts *RepositoryListByUserOptions) ([]*Repository, *Response, error) {
310+
u := fmt.Sprintf("users/%v/repos", user)
280311
u, err := addOptions(u, opts)
281312
if err != nil {
282313
return nil, nil, err
@@ -287,9 +318,68 @@ func (s *RepositoriesService) List(ctx context.Context, user string, opts *Repos
287318
return nil, nil, err
288319
}
289320

290-
// TODO: remove custom Accept headers when APIs fully launch.
291-
acceptHeaders := []string{mediaTypeTopicsPreview, mediaTypeRepositoryVisibilityPreview}
292-
req.Header.Set("Accept", strings.Join(acceptHeaders, ", "))
321+
var repos []*Repository
322+
resp, err := s.client.Do(ctx, req, &repos)
323+
if err != nil {
324+
return nil, resp, err
325+
}
326+
327+
return repos, resp, nil
328+
}
329+
330+
// RepositoryListByAuthenticatedUserOptions specifies the optional parameters to the
331+
// RepositoriesService.ListByAuthenticatedUser method.
332+
type RepositoryListByAuthenticatedUserOptions struct {
333+
// Limit results to repositories with the specified visibility.
334+
// Default: all
335+
// Can be one of: all, public, private
336+
Visibility string `url:"visibility,omitempty"`
337+
338+
// List repos of given affiliation[s].
339+
// Comma-separated list of values. Can include:
340+
// * owner: Repositories that are owned by the authenticated user.
341+
// * collaborator: Repositories that the user has been added to as a
342+
// collaborator.
343+
// * organization_member: Repositories that the user has access to through
344+
// being a member of an organization. This includes every repository on
345+
// every team that the user is on.
346+
// Default: owner,collaborator,organization_member
347+
Affiliation string `url:"affiliation,omitempty"`
348+
349+
// Limit results to repositories of the specified type. Will cause a 422 error if
350+
// used in the same request as visibility or affiliation.
351+
// Default: all
352+
// Can be one of: all, owner, public, private, member
353+
Type string `url:"type,omitempty"`
354+
355+
// The property to sort the results by.
356+
// Default: full_name
357+
// Can be one of: created, updated, pushed, full_name
358+
Sort string `url:"sort,omitempty"`
359+
360+
// Direction in which to sort repositories. Can be one of asc or desc.
361+
// Default: when using full_name: asc; otherwise desc
362+
Direction string `url:"direction,omitempty"`
363+
364+
ListOptions
365+
}
366+
367+
// ListByAuthenticatedUser lists repositories for the authenticated user.
368+
//
369+
// GitHub API docs: https://docs.github.com/rest/repos/repos#list-repositories-for-the-authenticated-user
370+
//
371+
//meta:operation GET /user/repos
372+
func (s *RepositoriesService) ListByAuthenticatedUser(ctx context.Context, opts *RepositoryListByAuthenticatedUserOptions) ([]*Repository, *Response, error) {
373+
u := "user/repos"
374+
u, err := addOptions(u, opts)
375+
if err != nil {
376+
return nil, nil, err
377+
}
378+
379+
req, err := s.client.NewRequest("GET", u, nil)
380+
if err != nil {
381+
return nil, nil, err
382+
}
293383

294384
var repos []*Repository
295385
resp, err := s.client.Do(ctx, req, &repos)

github/repos_test.go

Lines changed: 33 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -18,115 +18,115 @@ import (
1818
"github.com/google/go-cmp/cmp"
1919
)
2020

21-
func TestRepositoriesService_List_authenticatedUser(t *testing.T) {
21+
func TestRepositoriesService_ListByAuthenticatedUser(t *testing.T) {
2222
client, mux, _, teardown := setup()
2323
defer teardown()
2424

25-
wantAcceptHeaders := []string{mediaTypeTopicsPreview, mediaTypeRepositoryVisibilityPreview}
2625
mux.HandleFunc("/user/repos", func(w http.ResponseWriter, r *http.Request) {
2726
testMethod(t, r, "GET")
28-
testHeader(t, r, "Accept", strings.Join(wantAcceptHeaders, ", "))
2927
fmt.Fprint(w, `[{"id":1},{"id":2}]`)
3028
})
3129

3230
ctx := context.Background()
33-
got, _, err := client.Repositories.List(ctx, "", nil)
31+
got, _, err := client.Repositories.ListByAuthenticatedUser(ctx, nil)
3432
if err != nil {
3533
t.Errorf("Repositories.List returned error: %v", err)
3634
}
3735

3836
want := []*Repository{{ID: Int64(1)}, {ID: Int64(2)}}
3937
if !cmp.Equal(got, want) {
40-
t.Errorf("Repositories.List returned %+v, want %+v", got, want)
38+
t.Errorf("Repositories.ListByAuthenticatedUser returned %+v, want %+v", got, want)
4139
}
4240

43-
const methodName = "List"
44-
testBadOptions(t, methodName, func() (err error) {
45-
_, _, err = client.Repositories.List(ctx, "\n", &RepositoryListOptions{})
46-
return err
47-
})
41+
const methodName = "ListByAuthenticatedUser"
4842

4943
testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
50-
got, resp, err := client.Repositories.List(ctx, "", nil)
44+
got, resp, err := client.Repositories.ListByAuthenticatedUser(ctx, nil)
5145
if got != nil {
5246
t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
5347
}
5448
return resp, err
5549
})
5650
}
5751

58-
func TestRepositoriesService_List_specifiedUser(t *testing.T) {
52+
func TestRepositoriesService_ListByUser(t *testing.T) {
5953
client, mux, _, teardown := setup()
6054
defer teardown()
6155

62-
wantAcceptHeaders := []string{mediaTypeTopicsPreview, mediaTypeRepositoryVisibilityPreview}
6356
mux.HandleFunc("/users/u/repos", func(w http.ResponseWriter, r *http.Request) {
6457
testMethod(t, r, "GET")
65-
testHeader(t, r, "Accept", strings.Join(wantAcceptHeaders, ", "))
6658
testFormValues(t, r, values{
67-
"visibility": "public",
68-
"affiliation": "owner,collaborator",
69-
"sort": "created",
70-
"direction": "asc",
71-
"page": "2",
59+
"sort": "created",
60+
"direction": "asc",
61+
"page": "2",
7262
})
7363
fmt.Fprint(w, `[{"id":1}]`)
7464
})
7565

76-
opt := &RepositoryListOptions{
77-
Visibility: "public",
78-
Affiliation: "owner,collaborator",
66+
opt := &RepositoryListByUserOptions{
7967
Sort: "created",
8068
Direction: "asc",
8169
ListOptions: ListOptions{Page: 2},
8270
}
8371
ctx := context.Background()
84-
repos, _, err := client.Repositories.List(ctx, "u", opt)
72+
repos, _, err := client.Repositories.ListByUser(ctx, "u", opt)
8573
if err != nil {
8674
t.Errorf("Repositories.List returned error: %v", err)
8775
}
8876

8977
want := []*Repository{{ID: Int64(1)}}
9078
if !cmp.Equal(repos, want) {
91-
t.Errorf("Repositories.List returned %+v, want %+v", repos, want)
79+
t.Errorf("Repositories.ListByUser returned %+v, want %+v", repos, want)
9280
}
81+
82+
const methodName = "ListByUser"
83+
testBadOptions(t, methodName, func() (err error) {
84+
_, _, err = client.Repositories.ListByUser(ctx, "\n", &RepositoryListByUserOptions{})
85+
return err
86+
})
87+
88+
testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
89+
got, resp, err := client.Repositories.ListByUser(ctx, "u", nil)
90+
if got != nil {
91+
t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
92+
}
93+
return resp, err
94+
})
9395
}
9496

95-
func TestRepositoriesService_List_specifiedUser_type(t *testing.T) {
97+
func TestRepositoriesService_ListByUser_type(t *testing.T) {
9698
client, mux, _, teardown := setup()
9799
defer teardown()
98100

99-
wantAcceptHeaders := []string{mediaTypeTopicsPreview, mediaTypeRepositoryVisibilityPreview}
100101
mux.HandleFunc("/users/u/repos", func(w http.ResponseWriter, r *http.Request) {
101102
testMethod(t, r, "GET")
102-
testHeader(t, r, "Accept", strings.Join(wantAcceptHeaders, ", "))
103103
testFormValues(t, r, values{
104104
"type": "owner",
105105
})
106106
fmt.Fprint(w, `[{"id":1}]`)
107107
})
108108

109-
opt := &RepositoryListOptions{
109+
opt := &RepositoryListByUserOptions{
110110
Type: "owner",
111111
}
112112
ctx := context.Background()
113-
repos, _, err := client.Repositories.List(ctx, "u", opt)
113+
repos, _, err := client.Repositories.ListByUser(ctx, "u", opt)
114114
if err != nil {
115-
t.Errorf("Repositories.List returned error: %v", err)
115+
t.Errorf("Repositories.ListByUser returned error: %v", err)
116116
}
117117

118118
want := []*Repository{{ID: Int64(1)}}
119119
if !cmp.Equal(repos, want) {
120-
t.Errorf("Repositories.List returned %+v, want %+v", repos, want)
120+
t.Errorf("Repositories.ListByUser returned %+v, want %+v", repos, want)
121121
}
122122
}
123123

124-
func TestRepositoriesService_List_invalidUser(t *testing.T) {
124+
func TestRepositoriesService_ListByUser_invalidUser(t *testing.T) {
125125
client, _, _, teardown := setup()
126126
defer teardown()
127127

128128
ctx := context.Background()
129-
_, _, err := client.Repositories.List(ctx, "%", nil)
129+
_, _, err := client.Repositories.ListByUser(ctx, "%", nil)
130130
testURLParseError(t, err)
131131
}
132132

test/integration/repos_test.go

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -157,29 +157,31 @@ func TestRepositories_EditBranches(t *testing.T) {
157157
}
158158
}
159159

160-
func TestRepositories_List(t *testing.T) {
161-
if !checkAuth("TestRepositories_List") {
160+
func TestRepositories_ListByAuthenticatedUser(t *testing.T) {
161+
if !checkAuth("TestRepositories_ListByAuthenticatedUser") {
162162
return
163163
}
164164

165-
_, _, err := client.Repositories.List(context.Background(), "", nil)
165+
_, _, err := client.Repositories.ListByAuthenticatedUser(context.Background(), nil)
166166
if err != nil {
167-
t.Fatalf("Repositories.List('') returned error: %v", err)
167+
t.Fatalf("Repositories.ListByAuthenticatedUser() returned error: %v", err)
168168
}
169+
}
169170

170-
_, _, err = client.Repositories.List(context.Background(), "google", nil)
171+
func TestRepositories_ListByUser(t *testing.T) {
172+
_, _, err := client.Repositories.ListByUser(context.Background(), "google", nil)
171173
if err != nil {
172-
t.Fatalf("Repositories.List('google') returned error: %v", err)
174+
t.Fatalf("Repositories.ListByUser('google') returned error: %v", err)
173175
}
174176

175-
opt := github.RepositoryListOptions{Sort: "created"}
176-
repos, _, err := client.Repositories.List(context.Background(), "google", &opt)
177+
opt := github.RepositoryListByUserOptions{Sort: "created"}
178+
repos, _, err := client.Repositories.ListByUser(context.Background(), "google", &opt)
177179
if err != nil {
178180
t.Fatalf("Repositories.List('google') with Sort opt returned error: %v", err)
179181
}
180182
for i, repo := range repos {
181183
if i > 0 && (*repos[i-1].CreatedAt).Time.Before((*repo.CreatedAt).Time) {
182-
t.Fatalf("Repositories.List('google') with default descending Sort returned incorrect order")
184+
t.Fatalf("Repositories.ListByUser('google') with default descending Sort returned incorrect order")
183185
}
184186
}
185187
}

0 commit comments

Comments
 (0)