forked from lunny/changelog
Compare commits
3 Commits
main
...
6543/githu
Author | SHA1 | Date | |
---|---|---|---|
|
72cc266cf7 | ||
|
183ce4c5d4 | ||
|
df18780b5a |
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user