2020-01-24 16:30:16 +00:00
|
|
|
// 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 (
|
2024-05-24 05:59:15 +00:00
|
|
|
"context"
|
2020-01-24 16:30:16 +00:00
|
|
|
"fmt"
|
|
|
|
"time"
|
|
|
|
|
|
|
|
"code.gitea.io/sdk/gitea"
|
|
|
|
)
|
|
|
|
|
|
|
|
// Gitea defines a Gitea service
|
|
|
|
type Gitea struct {
|
|
|
|
Milestone string
|
2022-03-13 02:33:03 +00:00
|
|
|
GitTag string
|
2020-01-24 16:30:16 +00:00
|
|
|
Token string
|
|
|
|
BaseURL string
|
|
|
|
Owner string
|
|
|
|
Repo string
|
2020-08-04 13:30:19 +00:00
|
|
|
Issues bool
|
2020-01-24 16:30:16 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Generate returns a Gitea changelog
|
2024-05-24 05:59:15 +00:00
|
|
|
func (ge *Gitea) Generate(_ context.Context) (string, []Entry, error) {
|
2020-09-22 21:38:11 +00:00
|
|
|
client, err := gitea.NewClient(ge.BaseURL, gitea.SetToken(ge.Token))
|
|
|
|
if err != nil {
|
|
|
|
return "", nil, err
|
|
|
|
}
|
2020-01-24 16:30:16 +00:00
|
|
|
|
2020-08-04 13:30:19 +00:00
|
|
|
entries := make([]Entry, 0)
|
2020-01-24 16:30:16 +00:00
|
|
|
|
2020-09-22 21:38:11 +00:00
|
|
|
milestone, _, err := client.GetMilestoneByName(ge.Owner, ge.Repo, ge.Milestone)
|
2020-01-24 16:30:16 +00:00
|
|
|
if err != nil {
|
|
|
|
return "", nil, err
|
|
|
|
}
|
|
|
|
|
2020-08-04 13:30:19 +00:00
|
|
|
from := "pulls"
|
|
|
|
if ge.Issues {
|
|
|
|
from = "issues"
|
|
|
|
}
|
|
|
|
|
2022-03-13 02:33:03 +00:00
|
|
|
tagURL := getGiteaTagURL(client, ge.BaseURL, ge.Owner, ge.Repo, ge.Milestone, ge.GitTag, from, milestone.ID)
|
2020-01-24 16:30:16 +00:00
|
|
|
|
2020-09-22 21:38:11 +00:00
|
|
|
perPage := ge.perPage(client)
|
|
|
|
for p := 1; ; p++ {
|
2020-08-04 13:30:19 +00:00
|
|
|
options := gitea.ListIssueOption{
|
2020-03-29 01:56:21 +00:00
|
|
|
ListOptions: gitea.ListOptions{
|
|
|
|
Page: p,
|
|
|
|
PageSize: perPage,
|
|
|
|
},
|
2020-08-04 13:30:19 +00:00
|
|
|
Milestones: []string{ge.Milestone},
|
|
|
|
State: gitea.StateClosed,
|
|
|
|
Type: gitea.IssueTypePull,
|
|
|
|
}
|
|
|
|
if ge.Issues {
|
|
|
|
options.Type = gitea.IssueTypeIssue
|
|
|
|
}
|
|
|
|
|
2020-09-22 21:38:11 +00:00
|
|
|
issues, _, err := client.ListRepoIssues(ge.Owner, ge.Repo, options)
|
2020-01-24 16:30:16 +00:00
|
|
|
if err != nil {
|
|
|
|
return "", nil, err
|
|
|
|
}
|
|
|
|
|
2020-08-04 13:30:19 +00:00
|
|
|
for _, issue := range issues {
|
|
|
|
if issue != nil {
|
|
|
|
if options.Type == gitea.IssueTypePull && issue.PullRequest != nil && !(issue.PullRequest.HasMerged) {
|
|
|
|
continue
|
2020-01-24 16:30:16 +00:00
|
|
|
}
|
|
|
|
|
2020-08-04 13:30:19 +00:00
|
|
|
entry := convertToEntry(*issue)
|
|
|
|
entries = append(entries, entry)
|
2020-01-24 16:30:16 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-08-04 13:30:19 +00:00
|
|
|
if len(issues) != perPage {
|
2020-01-24 16:30:16 +00:00
|
|
|
break
|
|
|
|
}
|
2020-08-04 13:30:19 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return tagURL, entries, nil
|
|
|
|
}
|
|
|
|
|
2022-03-13 02:33:03 +00:00
|
|
|
func getGiteaTagURL(c *gitea.Client, baseURL, owner, repo, mileName, gitTag, from string, mileID int64) string {
|
2020-08-07 13:41:58 +00:00
|
|
|
if err := c.CheckServerVersionConstraint(">=1.12"); err != nil {
|
|
|
|
return fmt.Sprintf("## [%s](%s/%s/%s/%s?q=&type=all&state=closed&milestone=%d) - %s", mileName, baseURL, owner, repo, from, mileID, time.Now().Format("2006-01-02"))
|
|
|
|
}
|
2022-03-13 02:33:03 +00:00
|
|
|
return fmt.Sprintf("## [%s](%s/%s/%s/releases/tag/%s) - %s", mileName, baseURL, owner, repo, gitTag, time.Now().Format("2006-01-02"))
|
2020-08-07 13:41:58 +00:00
|
|
|
}
|
|
|
|
|
2020-08-04 13:30:19 +00:00
|
|
|
func convertToEntry(issue gitea.Issue) Entry {
|
|
|
|
entry := Entry{
|
|
|
|
Index: issue.Index,
|
2023-03-21 20:35:58 +00:00
|
|
|
Title: CleanTitle(issue.Title),
|
2020-01-24 16:30:16 +00:00
|
|
|
}
|
|
|
|
|
2020-08-04 13:30:19 +00:00
|
|
|
labels := make([]Label, len(issue.Labels))
|
|
|
|
for idx, lbl := range issue.Labels {
|
|
|
|
labels[idx] = Label{
|
|
|
|
Name: lbl.Name,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
entry.Labels = labels
|
|
|
|
|
|
|
|
return entry
|
2020-01-24 16:30:16 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Contributors returns a list of contributors from Gitea
|
|
|
|
func (ge *Gitea) Contributors() (ContributorList, error) {
|
2020-09-22 21:38:11 +00:00
|
|
|
client, err := gitea.NewClient(ge.BaseURL, gitea.SetToken(ge.Token))
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
2020-01-24 16:30:16 +00:00
|
|
|
|
|
|
|
contributorsMap := make(map[string]bool)
|
|
|
|
|
2020-09-22 21:38:11 +00:00
|
|
|
milestone, _, err := client.GetMilestoneByName(ge.Owner, ge.Repo, ge.Milestone)
|
2020-01-24 16:30:16 +00:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
2020-09-22 21:38:11 +00:00
|
|
|
perPage := ge.perPage(client)
|
|
|
|
for p := 1; ; p++ {
|
|
|
|
results, _, err := client.ListRepoPullRequests(ge.Owner, ge.Repo, gitea.ListPullRequestsOptions{
|
2020-03-29 01:56:21 +00:00
|
|
|
ListOptions: gitea.ListOptions{
|
|
|
|
Page: p,
|
|
|
|
PageSize: perPage,
|
|
|
|
},
|
2020-01-24 16:30:16 +00:00
|
|
|
State: "closed",
|
2020-09-22 21:38:11 +00:00
|
|
|
Milestone: milestone.ID,
|
2020-01-24 16:30:16 +00:00
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
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))
|
2020-01-26 03:43:05 +00:00
|
|
|
for contributor := range contributorsMap {
|
2020-01-24 16:30:16 +00:00
|
|
|
contributors = append(contributors, Contributor{
|
|
|
|
Name: contributor,
|
|
|
|
Profile: fmt.Sprintf("%s/%s", ge.BaseURL, contributor),
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
return contributors, nil
|
|
|
|
}
|
|
|
|
|
2020-09-22 21:38:11 +00:00
|
|
|
func (ge *Gitea) perPage(client *gitea.Client) int {
|
|
|
|
// set low value so it will work in most cases
|
|
|
|
perPage := 10
|
|
|
|
if client.CheckServerVersionConstraint(">=1.13.0") == nil {
|
|
|
|
conf, _, err := client.GetGlobalAPISettings()
|
|
|
|
if err != nil {
|
|
|
|
return perPage
|
2020-01-24 16:30:16 +00:00
|
|
|
}
|
2020-09-22 21:38:11 +00:00
|
|
|
return conf.MaxResponseItems
|
2020-01-24 16:30:16 +00:00
|
|
|
}
|
2020-09-22 21:38:11 +00:00
|
|
|
return perPage
|
2020-01-24 16:30:16 +00:00
|
|
|
}
|