Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion bitbucket/bitbucket.go
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ func (s *bitbucketRepoService) doJSON(ctx context.Context, method, url string, b
if resp.StatusCode == http.StatusNoContent {
return nil
}
if resp.StatusCode >= 400 {
if resp.StatusCode >= http.StatusBadRequest {
respBody, _ := io.ReadAll(resp.Body)
return &forge.HTTPError{StatusCode: resp.StatusCode, URL: url, Body: string(respBody)}
}
Expand Down
17 changes: 11 additions & 6 deletions bitbucket/issues.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,11 @@ import (
"time"
)

const (
stateOpen = "open"
stateClosed = "closed"
)

type bitbucketIssueService struct {
token string
httpClient *http.Client
Expand Down Expand Up @@ -104,10 +109,10 @@ func convertBitbucketIssue(bb bbIssue) forge.Issue {

// Normalize Bitbucket states to open/closed
switch bb.State {
case "new", "open":
result.State = "open"
case "new", stateOpen:
result.State = stateOpen
default:
result.State = "closed"
result.State = stateClosed
}

if bb.Reporter != nil {
Expand Down Expand Up @@ -183,9 +188,9 @@ func (s *bitbucketIssueService) List(ctx context.Context, owner, repo string, op

// Bitbucket uses q= query parameter for filtering
switch opts.State {
case "open":
case stateOpen:
url += "&q=state+%3D+%22new%22+OR+state+%3D+%22open%22"
case "closed":
case stateClosed:
url += "&q=state+%3D+%22resolved%22+OR+state+%3D+%22closed%22"
}

Expand Down Expand Up @@ -263,7 +268,7 @@ func (s *bitbucketIssueService) Close(ctx context.Context, owner, repo string, n
}

func (s *bitbucketIssueService) Reopen(ctx context.Context, owner, repo string, number int) error {
body := map[string]any{"state": "open"}
body := map[string]any{"state": stateOpen}
url := fmt.Sprintf("%s/repositories/%s/%s/issues/%d", bitbucketAPI, owner, repo, number)
return s.doJSON(ctx, http.MethodPut, url, body, nil)
}
Expand Down
4 changes: 3 additions & 1 deletion bitbucket/prs.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ import (
forge "github.com/git-pkgs/forge"
)

const maxDiffSize = 10 << 20 // 10 MB

type bitbucketPRService struct {
token string
httpClient *http.Client
Expand Down Expand Up @@ -290,7 +292,7 @@ func (s *bitbucketPRService) Diff(ctx context.Context, owner, repo string, numbe
return "", forge.ErrNotFound
}

body, err := io.ReadAll(io.LimitReader(resp.Body, 10<<20)) // 10 MB max
body, err := io.ReadAll(io.LimitReader(resp.Body, maxDiffSize))
if err != nil {
return "", err
}
Expand Down
8 changes: 5 additions & 3 deletions forge.go
Original file line number Diff line number Diff line change
Expand Up @@ -241,8 +241,8 @@ func ParseRepoURL(rawURL string) (domain, owner, repo string, err error) {
}

// Handle git@ SSH URLs: git@github.com:owner/repo.git
if strings.HasPrefix(rawURL, "git@") {
rawURL = strings.TrimPrefix(rawURL, "git@")
if after, found := strings.CutPrefix(rawURL, "git@"); found {
rawURL = after
colonIdx := strings.Index(rawURL, ":")
if colonIdx < 0 {
return "", "", "", fmt.Errorf("invalid SSH URL: missing colon")
Expand All @@ -265,11 +265,13 @@ func ParseRepoURL(rawURL string) (domain, owner, repo string, err error) {
return splitOwnerRepo(domain, u.Path)
}

const minOwnerRepoParts = 2

func splitOwnerRepo(domain, path string) (string, string, string, error) {
path = strings.TrimSuffix(path, ".git")
path = strings.Trim(path, "/")
parts := strings.Split(path, "/")
if len(parts) < 2 {
if len(parts) < minOwnerRepoParts {
return "", "", "", fmt.Errorf("URL path must contain owner/repo, got %q", path)
}
return domain, parts[0], parts[1], nil
Expand Down
6 changes: 4 additions & 2 deletions gitea/commit_statuses.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ import (
"code.gitea.io/sdk/gitea"
)

const defaultPageSize = 50

type giteaCommitStatusService struct {
client *gitea.Client
}
Expand All @@ -21,7 +23,7 @@ func (s *giteaCommitStatusService) List(ctx context.Context, owner, repo, sha st
page := 1
for {
statuses, resp, err := s.client.ListStatuses(owner, repo, sha, gitea.ListStatusesOption{
ListOptions: gitea.ListOptions{Page: page, PageSize: 50},
ListOptions: gitea.ListOptions{Page: page, PageSize: defaultPageSize},
})
if err != nil {
if resp != nil && resp.StatusCode == http.StatusNotFound {
Expand All @@ -42,7 +44,7 @@ func (s *giteaCommitStatusService) List(ctx context.Context, owner, repo, sha st
}
all = append(all, cs)
}
if len(statuses) < 50 {
if len(statuses) < defaultPageSize {
break
}
page++
Expand Down
8 changes: 4 additions & 4 deletions gitea/gitea.go
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ func (s *giteaRepoService) Get(ctx context.Context, owner, repo string) (*forge.
func (s *giteaRepoService) List(ctx context.Context, owner string, opts forge.ListRepoOpts) ([]forge.Repository, error) {
perPage := opts.PerPage
if perPage <= 0 {
perPage = 50
perPage = defaultPageSize
}

// Try org endpoint first, fall back to user on 404.
Expand Down Expand Up @@ -296,7 +296,7 @@ func (s *giteaRepoService) Fork(ctx context.Context, owner, repo string, opts fo
func (s *giteaRepoService) ListForks(ctx context.Context, owner, repo string, opts forge.ListForksOpts) ([]forge.Repository, error) {
perPage := opts.PerPage
if perPage <= 0 {
perPage = 50
perPage = defaultPageSize
}
page := opts.Page
if page <= 0 {
Expand Down Expand Up @@ -335,7 +335,7 @@ func (s *giteaRepoService) ListTags(ctx context.Context, owner, repo string) ([]
page := 1
for {
tags, resp, err := s.client.ListRepoTags(owner, repo, gitea.ListRepoTagsOptions{
ListOptions: gitea.ListOptions{Page: page, PageSize: 50},
ListOptions: gitea.ListOptions{Page: page, PageSize: defaultPageSize},
})
if err != nil {
if resp != nil && resp.StatusCode == http.StatusNotFound {
Expand All @@ -350,7 +350,7 @@ func (s *giteaRepoService) ListTags(ctx context.Context, owner, repo string) ([]
}
allTags = append(allTags, tag)
}
if len(tags) < 50 {
if len(tags) < defaultPageSize {
break
}
page++
Expand Down
14 changes: 7 additions & 7 deletions gitea/issues.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,9 @@ func convertGiteaIssue(i *gitea.Issue) forge.Issue {

switch i.State {
case gitea.StateOpen:
result.State = "open"
result.State = stateOpen
case gitea.StateClosed:
result.State = "closed"
result.State = stateClosed
default:
result.State = string(i.State)
}
Expand Down Expand Up @@ -134,11 +134,11 @@ func (s *giteaIssueService) List(ctx context.Context, owner, repo string, opts f
}

switch opts.State {
case "open":
case stateOpen:
gOpts.State = gitea.StateOpen
case "closed":
case stateClosed:
gOpts.State = gitea.StateClosed
case "all":
case stateAll:
gOpts.State = gitea.StateAll
default:
gOpts.State = gitea.StateOpen
Expand Down Expand Up @@ -296,7 +296,7 @@ func (s *giteaIssueService) ListComments(ctx context.Context, owner, repo string
page := 1
for {
comments, resp, err := s.client.ListIssueComments(owner, repo, int64(number), gitea.ListIssueCommentOptions{
ListOptions: gitea.ListOptions{Page: page, PageSize: 50},
ListOptions: gitea.ListOptions{Page: page, PageSize: defaultPageSize},
})
if err != nil {
if resp != nil && resp.StatusCode == http.StatusNotFound {
Expand All @@ -307,7 +307,7 @@ func (s *giteaIssueService) ListComments(ctx context.Context, owner, repo string
for _, c := range comments {
all = append(all, convertGiteaComment(c))
}
if len(comments) < 50 {
if len(comments) < defaultPageSize {
break
}
page++
Expand Down
10 changes: 5 additions & 5 deletions gitea/labels.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ func convertGiteaLabel(l *gitea.Label) forge.Label {
func (s *giteaLabelService) List(ctx context.Context, owner, repo string, opts forge.ListLabelOpts) ([]forge.Label, error) {
perPage := opts.PerPage
if perPage <= 0 {
perPage = 50
perPage = defaultPageSize
}
page := opts.Page
if page <= 0 {
Expand Down Expand Up @@ -69,7 +69,7 @@ func (s *giteaLabelService) findLabelByName(owner, repo, name string) (*gitea.La
page := 1
for {
labels, resp, err := s.client.ListRepoLabels(owner, repo, gitea.ListLabelsOptions{
ListOptions: gitea.ListOptions{Page: page, PageSize: 50},
ListOptions: gitea.ListOptions{Page: page, PageSize: defaultPageSize},
})
if err != nil {
if resp != nil && resp.StatusCode == http.StatusNotFound {
Expand All @@ -82,7 +82,7 @@ func (s *giteaLabelService) findLabelByName(owner, repo, name string) (*gitea.La
return l, nil
}
}
if len(labels) < 50 {
if len(labels) < defaultPageSize {
break
}
page++
Expand All @@ -102,7 +102,7 @@ func resolveLabelIDs(client *gitea.Client, owner, repo string, names []string) (
page := 1
for {
labels, resp, err := client.ListRepoLabels(owner, repo, gitea.ListLabelsOptions{
ListOptions: gitea.ListOptions{Page: page, PageSize: 50},
ListOptions: gitea.ListOptions{Page: page, PageSize: defaultPageSize},
})
if err != nil {
if resp != nil && resp.StatusCode == http.StatusNotFound {
Expand All @@ -116,7 +116,7 @@ func resolveLabelIDs(client *gitea.Client, owner, repo string, names []string) (
delete(nameSet, l.Name)
}
}
if len(nameSet) == 0 || len(labels) < 50 {
if len(nameSet) == 0 || len(labels) < defaultPageSize {
break
}
page++
Expand Down
16 changes: 11 additions & 5 deletions gitea/milestones.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,12 @@ import (
"code.gitea.io/sdk/gitea"
)

const (
stateOpen = "open"
stateClosed = "closed"
stateAll = "all"
)

type giteaMilestoneService struct {
client *gitea.Client
}
Expand Down Expand Up @@ -45,11 +51,11 @@ func (s *giteaMilestoneService) List(ctx context.Context, owner, repo string, op
}

switch opts.State {
case "open":
case stateOpen:
gOpts.State = gitea.StateOpen
case "closed":
case stateClosed:
gOpts.State = gitea.StateClosed
case "all":
case stateAll:
gOpts.State = gitea.StateAll
default:
gOpts.State = gitea.StateOpen
Expand Down Expand Up @@ -126,10 +132,10 @@ func (s *giteaMilestoneService) Update(ctx context.Context, owner, repo string,
}
if opts.State != nil {
switch *opts.State {
case "open":
case stateOpen:
s := gitea.StateOpen
gOpts.State = &s
case "closed":
case stateClosed:
s := gitea.StateClosed
gOpts.State = &s
}
Expand Down
Loading