Compare commits

..

3 Commits

2 changed files with 13 additions and 25 deletions

View File

@ -39,7 +39,7 @@ func updateOrCreateDraftRelease(a *Action, cfg *config.RepoConfig) (*gitea.Relea
return nil, err return nil, err
} }
changelog, err := GenerateChangelog(a.client, a.config.RepoOwner, a.config.RepoName, last, cfg.Categories) changelog, err := GenerateChangelog(a.client, a.config.RepoOwner, a.config.RepoName, last)
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@ -2,23 +2,14 @@ package src
import ( import (
"code.gitea.io/sdk/gitea" "code.gitea.io/sdk/gitea"
"git.beisel.it/florian/gitea-release-drafter/src/config"
"github.com/sethvargo/go-githubactions" "github.com/sethvargo/go-githubactions"
) )
type Changelog map[string][]*gitea.PullRequest type Changelog map[string][]*gitea.PullRequest
// GenerateChangelog fetches all the pull requests merged into the default branch since the last release and groups them by label. // GenerateChangelog fetches all the pull requests merged into the default branch since the last release and groups them by label. note that duplicates might occur if a pull request has multiple labels.
func GenerateChangelog(c *gitea.Client, owner string, repo string, lastRelease *gitea.Release, categories []config.Category) (*Changelog, error) { func GenerateChangelog(c *gitea.Client, owner string, repo string, lastRelease *gitea.Release) (*Changelog, error) {
changelogByLabels := make(Changelog) changelogByLabels := make(Changelog)
validLabels := make(map[string]string)
// Construct a set of valid labels from the categories
for _, category := range categories {
for _, label := range category.Labels {
validLabels[label] = category.Title
}
}
// FIXME: use pagination // FIXME: use pagination
prs, _, err := c.ListRepoPullRequests(owner, repo, gitea.ListPullRequestsOptions{ prs, _, err := c.ListRepoPullRequests(owner, repo, gitea.ListPullRequestsOptions{
@ -29,24 +20,21 @@ func GenerateChangelog(c *gitea.Client, owner string, repo string, lastRelease *
} }
for _, pr := range prs { for _, pr := range prs {
// only consider merged pull requests. note that we can't filter by that in the API
if pr.HasMerged { if pr.HasMerged {
githubactions.Warningf("Analyzing PR: '%s'", pr.Title) // if there was a release, only take into account pull requests that have been merged after that
if lastRelease == nil || (lastRelease != nil && pr.Merged.After(lastRelease.CreatedAt)) { if lastRelease == nil || lastRelease != nil && pr.Merged.After(lastRelease.CreatedAt) {
githubactions.Warningf("PR is in the valid timeframe since last release: '%s'", pr.Title) for _, l := range pr.Labels {
addedToChangelog := false _, ok := changelogByLabels[l.Name]
for _, prLabel := range pr.Labels {
githubactions.Warningf("Analyzing Label of PR (%d): '%s'", pr.ID, prLabel.Name)
categoryTitle, ok := validLabels[prLabel.Name]
if ok { if ok {
changelogByLabels[categoryTitle] = append(changelogByLabels[categoryTitle], pr) changelogByLabels[l.Name] = append(changelogByLabels[l.Name], pr)
addedToChangelog = true } else {
break changelogByLabels[l.Name] = []*gitea.PullRequest{pr}
} }
} }
if !addedToChangelog && len(pr.Labels) > 0 { if len(pr.Labels) == 0 {
githubactions.Warningf("PR #%d has labels but none match configured categories", pr.ID)
} else if len(pr.Labels) == 0 {
githubactions.Warningf("PR #%d doesn't have any labels", pr.ID) githubactions.Warningf("PR #%d doesn't have any labels", pr.ID)
} }
} }