Compare commits

...

3 Commits

Author SHA1 Message Date
6543
72cc266cf7
rework more 2023-06-23 16:00:39 +02:00
6543
183ce4c5d4
... 2023-06-23 15:03:27 +02:00
6543
df18780b5a
github: use ListByRepo instead of global Issue Search 2023-06-23 15:00:48 +02:00

@ -9,6 +9,7 @@ import (
"fmt"
"net/http"
"os"
"strings"
"time"
"github.com/google/go-github/v50/github"
@ -22,64 +23,136 @@ type GitHub struct {
Token string
Repo string
Issues bool
client *github.Client
}
const (
stateClosed = "closed"
perPage = 100
)
// Generate returns a GitHub changelog
func (gh *GitHub) Generate() (string, []Entry, error) {
ctx := context.Background()
var entries []Entry
var err error
tagURL := fmt.Sprintf("## [%s](https://github.com/%s/releases/tag/%s) - %s", gh.Milestone, gh.Repo, gh.GitTag, time.Now().Format("2006-01-02"))
client := github.NewClient(httpClient())
ctx := context.Background()
gh.client = github.NewClient(httpClient())
prs := make([]Entry, 0)
state := "merged"
if gh.Issues {
state = "closed"
repoParts := strings.SplitN(gh.Repo, "/", 2)
if len(repoParts) != 2 {
return "", nil, fmt.Errorf("repo: '%s' can not be split into repoOwner and repoName", gh.Repo)
}
query := fmt.Sprintf(`repo:%s is:%s milestone:"%s"`, gh.Repo, state, gh.Milestone)
p := 1
perPage := 100
if gh.Issues {
entries, err = gh.generateByIssues(ctx, repoParts[0], repoParts[1])
} else {
entries, err = gh.generateByPulls(ctx, repoParts[0], repoParts[1])
}
return tagURL, entries, err
}
func (gh *GitHub) generateByIssues(ctx context.Context, repoOwner, repoName string) ([]Entry, error) {
page := 1
issues := make([]Entry, 0, 10)
for {
result, _, err := client.Search.Issues(ctx, query, &github.SearchOptions{
result, _, err := gh.client.Issues.ListByRepo(ctx, repoOwner, repoName, &github.IssueListByRepoOptions{
ListOptions: github.ListOptions{
Page: p,
Page: page,
PerPage: perPage,
},
State: stateClosed,
Milestone: gh.Milestone,
})
if err != nil {
return "", nil, err
return nil, err
}
p++
page++
isPull := !(gh.Issues)
for _, pr := range result.Issues {
if pr.IsPullRequest() == isPull {
p := Entry{
Title: CleanTitle(pr.GetTitle()),
Index: int64(pr.GetNumber()),
}
labels := make([]Label, len(pr.Labels))
for idx, lbl := range pr.Labels {
labels[idx] = Label{
Name: lbl.GetName(),
}
}
p.Labels = labels
prs = append(prs, p)
for _, item := range result {
if item.IsPullRequest() {
continue
}
e := Entry{
Title: CleanTitle(item.GetTitle()),
Index: int64(item.GetNumber()),
}
labels := make([]Label, len(item.Labels))
for idx, lbl := range item.Labels {
labels[idx] = Label{
Name: lbl.GetName(),
}
}
e.Labels = labels
issues = append(issues, e)
}
if len(result.Issues) != perPage {
if len(result) != perPage {
break
}
}
return tagURL, prs, nil
return issues, nil
}
func (gh *GitHub) generateByPulls(ctx context.Context, repoOwner, repoName string) ([]Entry, error) {
page := 1
pulls := make([]Entry, 0, 10)
for {
result, _, err := gh.client.PullRequests.List(ctx, repoOwner, repoName, &github.PullRequestListOptions{
ListOptions: github.ListOptions{
Page: page,
PerPage: perPage,
},
State: stateClosed,
})
if err != nil {
return nil, err
}
page++
for _, item := range result {
// only merged pulls
if item.Merged == nil || !*item.Merged {
continue
}
// only with right milestone
if item.GetMilestone() == nil ||
item.GetMilestone().GetTitle() != gh.Milestone {
continue
}
p := Entry{
Title: CleanTitle(item.GetTitle()),
Index: int64(item.GetNumber()),
}
labels := make([]Label, len(item.Labels))
for idx, lbl := range item.Labels {
labels[idx] = Label{
Name: lbl.GetName(),
}
}
p.Labels = labels
pulls = append(pulls, p)
}
if len(result) != perPage {
break
}
}
return pulls, nil
}
// Contributors returns a list of contributors from GitHub