diff --git a/server/forge/bitbucket/bitbucket.go b/server/forge/bitbucket/bitbucket.go index 6cd4713e8b..15d6fed13f 100644 --- a/server/forge/bitbucket/bitbucket.go +++ b/server/forge/bitbucket/bitbucket.go @@ -181,6 +181,12 @@ func (c *config) Repo(ctx context.Context, u *model.User, remoteID model.ForgeRe // Repos returns a list of all repositories for Bitbucket account, including // organization repositories. func (c *config) Repos(ctx context.Context, u *model.User, p *model.ListOptions) ([]*model.Repo, error) { + // we paginate internally (https://github.com/woodpecker-ci/woodpecker/issues/5667) + // we merge data from different sources + if p.Page != 1 { + return nil, nil + } + setListOptions(p) client := c.newClient(ctx, u) diff --git a/server/forge/bitbucket/parse.go b/server/forge/bitbucket/parse.go index f21699692c..445f9082d9 100644 --- a/server/forge/bitbucket/parse.go +++ b/server/forge/bitbucket/parse.go @@ -31,7 +31,6 @@ const ( hookPullUpdated = "pullrequest:updated" hookPullMerged = "pullrequest:fulfilled" hookPullDeclined = "pullrequest:rejected" - stateOpen = "OPEN" stateClosed = "MERGED" stateDeclined = "DECLINED" ) diff --git a/server/forge/github/github.go b/server/forge/github/github.go index 01e6d21a48..ad24f737e2 100644 --- a/server/forge/github/github.go +++ b/server/forge/github/github.go @@ -226,22 +226,30 @@ func (c *client) Repo(ctx context.Context, u *model.User, id model.ForgeRemoteID // Repos returns a list of all repositories for GitHub account, including // organization repositories. func (c *client) Repos(ctx context.Context, u *model.User, p *model.ListOptions) ([]*model.Repo, error) { - client := c.newClientToken(ctx, u.AccessToken) - list, _, err := client.Repositories.ListByAuthenticatedUser(ctx, &github.RepositoryListByAuthenticatedUserOptions{ - ListOptions: github.ListOptions{ - Page: p.Page, - PerPage: perPage(p.PerPage), - }, - }) - if err != nil { - return nil, err + // we paginate internally (https://github.com/woodpecker-ci/woodpecker/issues/5667) + if p.Page != 1 { + return nil, nil } - repos := make([]*model.Repo, 0, len(list)) - for _, repo := range list { - if repo.GetArchived() { - continue + + client := c.newClientToken(ctx, u.AccessToken) + + opts := new(github.RepositoryListByAuthenticatedUserOptions) + opts.PerPage = 100 + opts.Page = 1 + + var repos []*model.Repo + for opts.Page > 0 { + list, resp, err := client.Repositories.ListByAuthenticatedUser(ctx, opts) + if err != nil { + return nil, err } - repos = append(repos, convertRepo(repo)) + for _, repo := range list { + if repo.GetArchived() { + continue + } + repos = append(repos, convertRepo(repo)) + } + opts.Page = resp.NextPage } return repos, nil } @@ -301,7 +309,7 @@ func (c *client) Dir(ctx context.Context, u *model.User, r *model.Repo, b *model var files []*forge_types.FileMeta - for i := 0; i < len(data); i++ { + for range data { select { case err := <-errChan: return nil, err diff --git a/server/forge/gitlab/gitlab.go b/server/forge/gitlab/gitlab.go index a4683bb4be..5299207c4e 100644 --- a/server/forge/gitlab/gitlab.go +++ b/server/forge/gitlab/gitlab.go @@ -199,10 +199,7 @@ func (g *GitLab) Teams(ctx context.Context, user *model.User, p *model.ListOptio return nil, err } - perPage := p.PerPage - if perPage > defaultPerPage { - perPage = defaultPerPage - } + perPage := min(p.PerPage, defaultPerPage) groups, _, err := client.Groups.ListGroups(&gitlab.ListGroupsOptions{ ListOptions: gitlab.ListOptions{ @@ -294,10 +291,7 @@ func (g *GitLab) Repos(ctx context.Context, user *model.User, p *model.ListOptio return nil, err } - perPage := p.PerPage - if perPage > defaultPerPage { - perPage = defaultPerPage - } + perPage := min(p.PerPage, defaultPerPage) opts := &gitlab.ListProjectsOptions{ ListOptions: gitlab.ListOptions{