forked from lunny/changelog
139 lines
3.0 KiB
Go
139 lines
3.0 KiB
Go
|
// Copyright 2020 The Gitea Authors. All rights reserved.
|
||
|
// Use of this source code is governed by a MIT-style
|
||
|
// license that can be found in the LICENSE file.
|
||
|
|
||
|
package service
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"time"
|
||
|
|
||
|
"code.gitea.io/sdk/gitea"
|
||
|
)
|
||
|
|
||
|
// Gitea defines a Gitea service
|
||
|
type Gitea struct {
|
||
|
Milestone string
|
||
|
Token string
|
||
|
BaseURL string
|
||
|
Owner string
|
||
|
Repo string
|
||
|
}
|
||
|
|
||
|
// Generate returns a Gitea changelog
|
||
|
func (ge *Gitea) Generate() (string, []PullRequest, error) {
|
||
|
client := gitea.NewClient(ge.BaseURL, ge.Token)
|
||
|
|
||
|
prs := make([]PullRequest, 0)
|
||
|
|
||
|
milestoneID, err := ge.milestoneID(client)
|
||
|
if err != nil {
|
||
|
return "", nil, err
|
||
|
}
|
||
|
|
||
|
tagURL := fmt.Sprintf("## [%s](%s/%s/%s/pulls?q=&type=all&state=closed&milestone=%d) - %s", ge.Milestone, ge.BaseURL, ge.Owner, ge.Repo, milestoneID, time.Now().Format("2006-01-02"))
|
||
|
|
||
|
p := 1
|
||
|
// https://github.com/go-gitea/gitea/blob/d92781bf941972761177ac9e07441f8893758fd3/models/repo.go#L63
|
||
|
// https://github.com/go-gitea/gitea/blob/e3c3b33ea7a5a223e22688c3f0eb2d3dab9f991c/models/pull_list.go#L104
|
||
|
// FIXME Gitea has this hard-coded at 40
|
||
|
perPage := 40
|
||
|
for {
|
||
|
results, err := client.ListRepoPullRequests(ge.Owner, ge.Repo, gitea.ListPullRequestsOptions{
|
||
|
Page: p,
|
||
|
State: "closed",
|
||
|
Milestone: milestoneID,
|
||
|
})
|
||
|
if err != nil {
|
||
|
return "", nil, err
|
||
|
}
|
||
|
p++
|
||
|
|
||
|
for _, pr := range results {
|
||
|
if pr != nil && pr.HasMerged {
|
||
|
p := PullRequest{
|
||
|
Title: pr.Title,
|
||
|
Index: pr.Index,
|
||
|
}
|
||
|
|
||
|
labels := make([]Label, len(pr.Labels))
|
||
|
for idx, lbl := range pr.Labels {
|
||
|
labels[idx] = Label{
|
||
|
Name: lbl.Name,
|
||
|
}
|
||
|
}
|
||
|
p.Labels = labels
|
||
|
|
||
|
prs = append(prs, p)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if len(results) != perPage {
|
||
|
break
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return tagURL, prs, nil
|
||
|
}
|
||
|
|
||
|
// Contributors returns a list of contributors from Gitea
|
||
|
func (ge *Gitea) Contributors() (ContributorList, error) {
|
||
|
client := gitea.NewClient(ge.BaseURL, ge.Token)
|
||
|
|
||
|
contributorsMap := make(map[string]bool)
|
||
|
|
||
|
milestoneID, err := ge.milestoneID(client)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
p := 1
|
||
|
perPage := 100
|
||
|
for {
|
||
|
results, err := client.ListRepoPullRequests(ge.Owner, ge.Repo, gitea.ListPullRequestsOptions{
|
||
|
Page: p,
|
||
|
State: "closed",
|
||
|
Milestone: milestoneID,
|
||
|
})
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
p++
|
||
|
|
||
|
for _, pr := range results {
|
||
|
if pr != nil && pr.HasMerged {
|
||
|
contributorsMap[pr.Poster.UserName] = true
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if len(results) != perPage {
|
||
|
break
|
||
|
}
|
||
|
}
|
||
|
|
||
|
contributors := make(ContributorList, 0, len(contributorsMap))
|
||
|
for contributor, _ := range contributorsMap {
|
||
|
contributors = append(contributors, Contributor{
|
||
|
Name: contributor,
|
||
|
Profile: fmt.Sprintf("%s/%s", ge.BaseURL, contributor),
|
||
|
})
|
||
|
}
|
||
|
|
||
|
return contributors, nil
|
||
|
}
|
||
|
|
||
|
func (ge *Gitea) milestoneID(client *gitea.Client) (int64, error) {
|
||
|
milestones, err := client.ListRepoMilestones(ge.Owner, ge.Repo)
|
||
|
if err != nil {
|
||
|
return 0, err
|
||
|
}
|
||
|
|
||
|
for _, ms := range milestones {
|
||
|
if ms.Title == ge.Milestone {
|
||
|
return ms.ID, nil
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return 0, fmt.Errorf("no milestone found for %s", ge.Milestone)
|
||
|
}
|