From 110c9f6950a256b82b90de2e933ae40e419f123d Mon Sep 17 00:00:00 2001 From: jolheiser Date: Thu, 9 Jan 2020 12:45:29 -0600 Subject: [PATCH 01/21] Initial work Blocked until API is fixed or SDK is updated Signed-off-by: jolheiser --- changelog.example.go | 4 +- changelog.example.yml | 8 +- cmd/cmd.go | 11 ++ cmd/contributors.go | 44 ++++++ cmd/generate.go | 52 +++++++ config.go => config/config.go | 26 ++-- config_default.go => config/config_default.go | 8 +- contributors.go | 70 --------- generate.go | 103 ------------ go.mod | 1 + go.sum | 5 + main.go | 17 +- service/gitea.go | 147 ++++++++++++++++++ service/github.go | 136 ++++++++++++++++ service/service.go | 42 +++++ 15 files changed, 477 insertions(+), 197 deletions(-) create mode 100644 cmd/cmd.go create mode 100644 cmd/contributors.go create mode 100644 cmd/generate.go rename config.go => config/config.go (62%) rename config_default.go => config/config_default.go (85%) delete mode 100644 contributors.go delete mode 100644 generate.go create mode 100644 service/gitea.go create mode 100644 service/github.go create mode 100644 service/service.go diff --git a/changelog.example.go b/changelog.example.go index a896604..3cad330 100644 --- a/changelog.example.go +++ b/changelog.example.go @@ -10,8 +10,8 @@ import ( const ( exampleFile = "changelog.example.yml" - writeFile = "config_default.go" - tmpl = `package main + writeFile = "config/config_default.go" + tmpl = `package config func init() { defaultConfig = []byte(` + "`" + `%s` + "`" + `) diff --git a/changelog.example.yml b/changelog.example.yml index 48164d1..f2aab2f 100644 --- a/changelog.example.yml +++ b/changelog.example.yml @@ -1,5 +1,11 @@ # The full repository name -repo: go-gitea/gitea +repo: gitea/tea + +# Service type (gitea or github) +service: gitea + +# Base URL for Gitea instance if using gitea service type +base-url: https://gitea.com # Changelog groups and which labeled PRs to add to each group groups: diff --git a/cmd/cmd.go b/cmd/cmd.go new file mode 100644 index 0000000..777c1ca --- /dev/null +++ b/cmd/cmd.go @@ -0,0 +1,11 @@ +// 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 cmd + +var ( + // CLI Flags + Milestone string + ConfigPath string +) diff --git a/cmd/contributors.go b/cmd/contributors.go new file mode 100644 index 0000000..dd4ad9d --- /dev/null +++ b/cmd/contributors.go @@ -0,0 +1,44 @@ +// Copyright 2018 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 cmd + +import ( + "fmt" + + "code.gitea.io/changelog/config" + "code.gitea.io/changelog/service" + + "github.com/urfave/cli/v2" +) + +var Contributors = &cli.Command{ + Name: "contributors", + Usage: "generate contributors list", + Description: "generate contributors list", + Action: runContributors, +} + +func runContributors(cmd *cli.Context) error { + cfg, err := config.Load(ConfigPath) + if err != nil { + return err + } + + s, err := service.Parse(cfg.Service) + if err != nil { + return err + } + + contributors, err := s.Contributors(cfg, Milestone) + if err != nil { + return err + } + + for _, contributor := range contributors { + fmt.Printf("* [@%s](https://github.com/%s)\n", contributor, contributor) + } + + return nil +} diff --git a/cmd/generate.go b/cmd/generate.go new file mode 100644 index 0000000..b3b4dde --- /dev/null +++ b/cmd/generate.go @@ -0,0 +1,52 @@ +// 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 cmd + +import ( + "fmt" + + "code.gitea.io/changelog/config" + "code.gitea.io/changelog/service" + + "github.com/urfave/cli/v2" +) + +var Generate = &cli.Command{ + Name: "generate", + Usage: "generate changelog", + Description: "generate changelog", + Action: runGenerate, +} + +func runGenerate(cmd *cli.Context) error { + cfg, err := config.Load(ConfigPath) + if err != nil { + return err + } + + s, err := service.Parse(cfg.Service) + if err != nil { + return err + } + + changelog, err := s.Changelog(cfg, Milestone) + if err != nil { + return err + } + + fmt.Printf(changelog.TagURL) + for _, g := range cfg.Groups { + if len(changelog.Entries[g.Name]) == 0 { + continue + } + + fmt.Println("* " + g.Name) + for _, entry := range changelog.Entries[g.Name] { + fmt.Printf(" * %s (#%d)\n", entry.Title, entry.Index) + } + } + + return nil +} diff --git a/config.go b/config/config.go similarity index 62% rename from config.go rename to config/config.go index ea56b54..bba0e61 100644 --- a/config.go +++ b/config/config.go @@ -2,10 +2,7 @@ // Use of this source code is governed by a MIT-style // license that can be found in the LICENSE file. -package main - -//go:generate go run changelog.example.go -//go:generate go fmt ./... +package config import ( "io/ioutil" @@ -16,18 +13,25 @@ import ( var defaultConfig []byte +// Group is a grouping of PRs +type Group struct { + Name string `yaml:"name"` + Labels []string `yaml:"labels"` + Default bool `yaml:"default"` +} + +// Config is the changelog settings type Config struct { - Repo string `yaml:"repo"` - Groups []struct { - Name string `yaml:"name"` - Labels []string `yaml:"labels"` - Default bool `yaml:"default"` - } `yaml:"groups"` + Repo string `yaml:"repo"` + Service string `yaml:"service"` + BaseURL string `yaml:"base-url"` + Groups []Group `yaml:"groups"` SkipLabels string `yaml:"skip-labels"` SkipRegex *regexp.Regexp `yaml:"-"` } -func LoadConfig() (*Config, error) { +// Load a config from a path, defaulting to changelog.example.yml +func Load(configPath string) (*Config, error) { var err error var configContent []byte if len(configPath) == 0 { diff --git a/config_default.go b/config/config_default.go similarity index 85% rename from config_default.go rename to config/config_default.go index 20a19be..9e9c854 100644 --- a/config_default.go +++ b/config/config_default.go @@ -1,9 +1,15 @@ -package main +package config func init() { defaultConfig = []byte(`# The full repository name repo: go-gitea/gitea +# Service type (gitea or github) +service: github + +# Base URL for Gitea instance if using gitea service type +base-url: https://gitea.com + # Changelog groups and which labeled PRs to add to each group groups: - diff --git a/contributors.go b/contributors.go deleted file mode 100644 index 65aeace..0000000 --- a/contributors.go +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright 2018 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 main - -import ( - "context" - "fmt" - "log" - "sort" - - "github.com/google/go-github/github" - "github.com/urfave/cli/v2" -) - -var cmdContributors = &cli.Command{ - Name: "contributors", - Usage: "generate contributors list", - Description: "generate contributors list", - Action: runContributors, -} - -func runContributors(cmd *cli.Context) error { - config, err := LoadConfig() - if err != nil { - return err - } - - client := github.NewClient(nil) - ctx := context.Background() - - contributorsMap := make(map[string]bool) - query := fmt.Sprintf(`repo:%s is:merged milestone:"%s"`, config.Repo, milestone) - p := 1 - perPage := 100 - for { - result, _, err := client.Search.Issues(ctx, query, &github.SearchOptions{ - ListOptions: github.ListOptions{ - Page: p, - PerPage: perPage, - }, - }) - p++ - if err != nil { - log.Fatal(err.Error()) - } - - for _, pr := range result.Issues { - contributorsMap[*pr.User.Login] = true - } - - if len(result.Issues) != perPage { - break - } - } - - contributors := make([]string, 0, len(contributorsMap)) - for contributor, _ := range contributorsMap { - contributors = append(contributors, contributor) - } - - sort.Strings(contributors) - - for _, contributor := range contributors { - fmt.Printf("* [@%s](https://github.com/%s)\n", contributor, contributor) - } - - return nil -} diff --git a/generate.go b/generate.go deleted file mode 100644 index 74a97df..0000000 --- a/generate.go +++ /dev/null @@ -1,103 +0,0 @@ -// 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 main - -import ( - "context" - "fmt" - "log" - "time" - - "github.com/google/go-github/github" - "github.com/urfave/cli/v2" -) - -var cmdGenerate = &cli.Command{ - Name: "generate", - Usage: "generate changelog", - Description: "generate changelog", - Action: runGenerate, -} - -func runGenerate(cmd *cli.Context) error { - config, err := LoadConfig() - if err != nil { - return err - } - - client := github.NewClient(nil) - ctx := context.Background() - - labels := make(map[string]string) - changelogs := make(map[string][]github.Issue) - var defaultGroup string - for _, g := range config.Groups { - changelogs[g.Name] = []github.Issue{} - for _, l := range g.Labels { - labels[l] = g.Name - } - if g.Default { - defaultGroup = g.Name - } - } - - if defaultGroup == "" { - defaultGroup = config.Groups[len(config.Groups)-1].Name - } - - query := fmt.Sprintf(`repo:%s is:merged milestone:"%s"`, config.Repo, milestone) - p := 1 - perPage := 100 - for { - result, _, err := client.Search.Issues(ctx, query, &github.SearchOptions{ - ListOptions: github.ListOptions{ - Page: p, - PerPage: perPage, - }, - }) - p++ - if err != nil { - log.Fatal(err.Error()) - } - - PRLoop: // labels in Go, let's get old school - for _, pr := range result.Issues { - var label string - for _, lb := range pr.Labels { - if config.SkipRegex != nil && config.SkipRegex.MatchString(lb.GetName()) { - continue PRLoop - } - - if g, ok := labels[lb.GetName()]; ok && len(label) == 0 { - label = g - } - } - - if len(label) > 0 { - changelogs[label] = append(changelogs[label], pr) - } else { - changelogs[defaultGroup] = append(changelogs[defaultGroup], pr) - } - } - - if len(result.Issues) != perPage { - break - } - } - - fmt.Printf("## [%s](https://github.com/%s/releases/tag/v%s) - %s\n", milestone, config.Repo, milestone, time.Now().Format("2006-01-02")) - for _, g := range config.Groups { - if len(changelogs[g.Name]) == 0 { - continue - } - - fmt.Println("* " + g.Name) - for _, pr := range changelogs[g.Name] { - fmt.Printf(" * %s (#%d)\n", *pr.Title, *pr.Number) - } - } - - return nil -} diff --git a/go.mod b/go.mod index a967178..bf3be47 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module code.gitea.io/changelog go 1.13 require ( + code.gitea.io/sdk/gitea v0.0.0-20200107034216-f0ac57ba0b2b github.com/cpuguy83/go-md2man/v2 v2.0.0 // indirect github.com/google/go-github v17.0.0+incompatible github.com/google/go-querystring v1.0.0 // indirect diff --git a/go.sum b/go.sum index 9832c0a..33cf34a 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,8 @@ +code.gitea.io/sdk v0.0.0-20200107034216-f0ac57ba0b2b h1:ujbGMqEbr4d/gSfsOkJapGwx9h0g+cRgTuHlRovgLFI= +code.gitea.io/sdk/gitea v0.0.0-20200107034216-f0ac57ba0b2b h1:z5T6DxY2fqJz02qhXGnQQ2lXfPW5bTDM/0lqzFGNcyk= +code.gitea.io/sdk/gitea v0.0.0-20200107034216-f0ac57ba0b2b/go.mod h1:8IxkM1gyiwEjfO0m47bcmr3u3foR15+LoVub43hCHd0= +gitea.com/gitea/go-sdk v0.0.0-20200107034216-f0ac57ba0b2b h1:qAIFQDSrZFRzUHHWSXuotBA0BpB5m7Y978gl1Jp4Vro= +gitea.com/gitea/go-sdk v0.0.0-20200107034216-f0ac57ba0b2b/go.mod h1:r9S7LXuEumOEDhkZ9qHLhHSnTO6XNnKiBEbunPJJY+8= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM= diff --git a/main.go b/main.go index dd476bc..3104f7a 100644 --- a/main.go +++ b/main.go @@ -4,7 +4,11 @@ package main +//go:generate go run changelog.example.go +//go:generate go fmt ./... + import ( + "code.gitea.io/changelog/cmd" "fmt" "os" @@ -16,11 +20,6 @@ const ( Version = "0.2" ) -var ( - milestone string - configPath string -) - func main() { app := &cli.App{ Name: "changelog", @@ -32,18 +31,18 @@ func main() { Aliases: []string{"m"}, Usage: "Targeted milestone", Required: true, - Destination: &milestone, + Destination: &cmd.Milestone, }, &cli.StringFlag{ Name: "config", Aliases: []string{"c"}, Usage: "Specify a config file", - Destination: &configPath, + Destination: &cmd.ConfigPath, }, }, Commands: []*cli.Command{ - cmdGenerate, - cmdContributors, + cmd.Generate, + cmd.Contributors, }, } diff --git a/service/gitea.go b/service/gitea.go new file mode 100644 index 0000000..e60ea2a --- /dev/null +++ b/service/gitea.go @@ -0,0 +1,147 @@ +// 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" + "sort" + "strings" + "time" + + "code.gitea.io/changelog/config" + "code.gitea.io/sdk/gitea" +) + +// Gitea defines a Gitea service +type Gitea struct{} + +// Changelog returns a Gitea changelog +func (ge Gitea) Changelog(cfg *config.Config, milestone string) (Changelog, error) { + changelog := Changelog{ + TagURL: fmt.Sprintf("## [%s](%s/%s/src/tag/v%s) - %s\n", cfg.BaseURL, milestone, cfg.Repo, milestone, time.Now().Format("2006-01-02")), + } + + client := gitea.NewClient(cfg.BaseURL, "") + + labels := make(map[string]string) + entries := make(map[string][]Entry) + var defaultGroup string + for _, g := range cfg.Groups { + entries[g.Name] = []Entry{} + for _, l := range g.Labels { + labels[l] = g.Name + } + if g.Default { + defaultGroup = g.Name + } + } + + if defaultGroup == "" { + defaultGroup = cfg.Groups[len(cfg.Groups)-1].Name + } + + repoOwner := strings.Split(cfg.Repo, "/") + repo := repoOwner[0] + owner := repoOwner[1] + p := 1 + perPage := 100 + for { + // FIXME Once SDK is updated, search only by milestone + results, err := client.ListRepoPullRequests(repo, owner, gitea.ListPullRequestsOptions{ + Page: p, + State: "closed", + }) + p++ + if err != nil { + return changelog, err + } + + PRLoop: // labels in Go, let's get old school + for _, pr := range results { + if pr == nil || !pr.HasMerged || pr.Milestone == nil || pr.Milestone.Title != milestone { + continue + } + + var label string + for _, lb := range pr.Labels { + if cfg.SkipRegex != nil && cfg.SkipRegex.MatchString(lb.Name) { + continue PRLoop + } + + if g, ok := labels[lb.Name]; ok && len(label) == 0 { + label = g + } + } + + if len(label) > 0 { + entries[label] = append(entries[label], Entry{ + Title: pr.Title, + Index: pr.Index, + }) + } else { + entries[defaultGroup] = append(entries[defaultGroup], Entry{ + Title: pr.Title, + Index: pr.Index, + }) + } + } + + if len(results) != perPage { + break + } + } + + changelog.Entries = entries + + return changelog, nil +} + +// Contributors returns a list of contributors from Gitea +func (ge Gitea) Contributors(cfg *config.Config, milestone string) ([]string, error) { + client := gitea.NewClient(cfg.BaseURL, "") + + contributorsMap := make(map[string]bool) + repoOwner := strings.Split(cfg.Repo, "/") + repo := repoOwner[0] + owner := repoOwner[1] + p := 1 + perPage := 100 + for { + // FIXME Once SDK is updated, search only by milestone + results, err := client.ListRepoPullRequests(repo, owner, gitea.ListPullRequestsOptions{ + Page: p, + State: "closed", + }) + p++ + if err != nil { + return nil, err + } + + for _, pr := range results { + if !pr.HasMerged || pr.Milestone == nil { + continue + } + + if pr.Milestone.Title != milestone { + continue + } + + contributorsMap[pr.Poster.UserName] = true + } + + if len(results) != perPage { + break + } + } + + contributors := make([]string, 0, len(contributorsMap)) + for contributor, _ := range contributorsMap { + contributors = append(contributors, contributor) + } + + sort.Strings(contributors) + + return contributors, nil +} diff --git a/service/github.go b/service/github.go new file mode 100644 index 0000000..b7bd5e3 --- /dev/null +++ b/service/github.go @@ -0,0 +1,136 @@ +// 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 ( + "context" + "fmt" + "sort" + "time" + + "code.gitea.io/changelog/config" + + "github.com/google/go-github/github" +) + +// GitHub defines a GitHub service +type GitHub struct{} + +// Changelog returns a GitHub changelog +func (gh GitHub) Changelog(cfg *config.Config, milestone string) (Changelog, error) { + changelog := Changelog{ + TagURL: fmt.Sprintf("## [%s](https://github.com/%s/releases/tag/v%s) - %s\n", milestone, cfg.Repo, milestone, time.Now().Format("2006-01-02")), + } + + client := github.NewClient(nil) + ctx := context.Background() + + labels := make(map[string]string) + entries := make(map[string][]Entry) + var defaultGroup string + for _, g := range cfg.Groups { + entries[g.Name] = []Entry{} + for _, l := range g.Labels { + labels[l] = g.Name + } + if g.Default { + defaultGroup = g.Name + } + } + + if defaultGroup == "" { + defaultGroup = cfg.Groups[len(cfg.Groups)-1].Name + } + + query := fmt.Sprintf(`repo:%s is:merged milestone:"%s"`, cfg.Repo, milestone) + p := 1 + perPage := 100 + for { + result, _, err := client.Search.Issues(ctx, query, &github.SearchOptions{ + ListOptions: github.ListOptions{ + Page: p, + PerPage: perPage, + }, + }) + p++ + if err != nil { + return changelog, err + } + + PRLoop: // labels in Go, let's get old school + for _, pr := range result.Issues { + var label string + for _, lb := range pr.Labels { + if cfg.SkipRegex != nil && cfg.SkipRegex.MatchString(lb.GetName()) { + continue PRLoop + } + + if g, ok := labels[lb.GetName()]; ok && len(label) == 0 { + label = g + } + } + + if len(label) > 0 { + entries[label] = append(entries[label], Entry{ + Title: *pr.Title, + Index: int64(*pr.Number), + }) + } else { + entries[defaultGroup] = append(entries[defaultGroup], Entry{ + Title: *pr.Title, + Index: int64(*pr.Number), + }) + } + } + + if len(result.Issues) != perPage { + break + } + } + + changelog.Entries = entries + + return changelog, nil +} + +// Contributors returns a list of contributors from GitHub +func (gh GitHub) Contributors(cfg *config.Config, milestone string) ([]string, error) { + client := github.NewClient(nil) + ctx := context.Background() + + contributorsMap := make(map[string]bool) + query := fmt.Sprintf(`repo:%s is:merged milestone:"%s"`, cfg.Repo, milestone) + p := 1 + perPage := 100 + for { + result, _, err := client.Search.Issues(ctx, query, &github.SearchOptions{ + ListOptions: github.ListOptions{ + Page: p, + PerPage: perPage, + }, + }) + p++ + if err != nil { + return nil, err + } + + for _, pr := range result.Issues { + contributorsMap[*pr.User.Login] = true + } + + if len(result.Issues) != perPage { + break + } + } + + contributors := make([]string, 0, len(contributorsMap)) + for contributor, _ := range contributorsMap { + contributors = append(contributors, contributor) + } + + sort.Strings(contributors) + + return contributors, nil +} diff --git a/service/service.go b/service/service.go new file mode 100644 index 0000000..4a73728 --- /dev/null +++ b/service/service.go @@ -0,0 +1,42 @@ +// 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 ( + "errors" + "strings" + + "code.gitea.io/changelog/config" +) + +// Parse returns a service from a string +func Parse(s string) (Service, error) { + switch strings.ToLower(s) { + case "github": + return GitHub{}, nil + case "gitea": + return Gitea{}, nil + default: + return nil, errors.New("unknown service type") + } +} + +// Service defines how a struct can be a Changelog Service +type Service interface { + Changelog(*config.Config, string) (Changelog, error) + Contributors(*config.Config, string) ([]string, error) +} + +// Entry defines a changelog entry (PR title and index) +type Entry struct { + Title string + Index int64 +} + +// Changelog defines a full changelog +type Changelog struct { + TagURL string + Entries map[string][]Entry +} -- 2.40.1 From 4609c89bba20e011dedac8d95f52232af396a7fb Mon Sep 17 00:00:00 2001 From: jolheiser Date: Thu, 9 Jan 2020 17:05:52 -0600 Subject: [PATCH 02/21] Finish functionality using generated swagger client Signed-off-by: jolheiser --- changelog.example.yml | 4 +- cmd/contributors.go | 15 ++++--- cmd/generate.go | 15 ++++--- config/config.go | 22 +++++----- go.mod | 3 +- go.sum | 22 +++++++--- service/gitea.go | 95 ++++++++++++++++++++++++++++++------------- service/github.go | 20 +++++---- service/service.go | 9 ++-- 9 files changed, 131 insertions(+), 74 deletions(-) diff --git a/changelog.example.yml b/changelog.example.yml index f2aab2f..86af420 100644 --- a/changelog.example.yml +++ b/changelog.example.yml @@ -1,8 +1,8 @@ # The full repository name -repo: gitea/tea +repo: go-gitea/gitea # Service type (gitea or github) -service: gitea +service: github # Base URL for Gitea instance if using gitea service type base-url: https://gitea.com diff --git a/cmd/contributors.go b/cmd/contributors.go index dd4ad9d..844b774 100644 --- a/cmd/contributors.go +++ b/cmd/contributors.go @@ -21,23 +21,22 @@ var Contributors = &cli.Command{ } func runContributors(cmd *cli.Context) error { - cfg, err := config.Load(ConfigPath) + if err := config.Load(ConfigPath); err != nil { + return err + } + + s, err := service.Load() if err != nil { return err } - s, err := service.Parse(cfg.Service) - if err != nil { - return err - } - - contributors, err := s.Contributors(cfg, Milestone) + contributors, err := s.Contributors(Milestone) if err != nil { return err } for _, contributor := range contributors { - fmt.Printf("* [@%s](https://github.com/%s)\n", contributor, contributor) + fmt.Printf("* [@%s](%s/%s)\n", contributor, s.BaseURL(), contributor) } return nil diff --git a/cmd/generate.go b/cmd/generate.go index b3b4dde..e51e5fc 100644 --- a/cmd/generate.go +++ b/cmd/generate.go @@ -21,23 +21,22 @@ var Generate = &cli.Command{ } func runGenerate(cmd *cli.Context) error { - cfg, err := config.Load(ConfigPath) + if err := config.Load(ConfigPath); err != nil { + return err + } + + s, err := service.Load() if err != nil { return err } - s, err := service.Parse(cfg.Service) - if err != nil { - return err - } - - changelog, err := s.Changelog(cfg, Milestone) + changelog, err := s.Changelog(Milestone) if err != nil { return err } fmt.Printf(changelog.TagURL) - for _, g := range cfg.Groups { + for _, g := range config.Cfg.Groups { if len(changelog.Entries[g.Name]) == 0 { continue } diff --git a/config/config.go b/config/config.go index bba0e61..55a1508 100644 --- a/config/config.go +++ b/config/config.go @@ -11,7 +11,10 @@ import ( "gopkg.in/yaml.v2" ) -var defaultConfig []byte +var ( + defaultConfig []byte + Cfg *Config +) // Group is a grouping of PRs type Group struct { @@ -31,7 +34,7 @@ type Config struct { } // Load a config from a path, defaulting to changelog.example.yml -func Load(configPath string) (*Config, error) { +func Load(configPath string) error { var err error var configContent []byte if len(configPath) == 0 { @@ -39,20 +42,19 @@ func Load(configPath string) (*Config, error) { } else { configContent, err = ioutil.ReadFile(configPath) if err != nil { - return nil, err + return err } } - var config *Config - if err = yaml.Unmarshal(configContent, &config); err != nil { - return nil, err + if err = yaml.Unmarshal(configContent, &Cfg); err != nil { + return err } - if len(config.SkipLabels) > 0 { - if config.SkipRegex, err = regexp.Compile(config.SkipLabels); err != nil { - return nil, err + if len(Cfg.SkipLabels) > 0 { + if Cfg.SkipRegex, err = regexp.Compile(Cfg.SkipLabels); err != nil { + return err } } - return config, nil + return nil } diff --git a/go.mod b/go.mod index bf3be47..ae6e83b 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,8 @@ module code.gitea.io/changelog go 1.13 require ( - code.gitea.io/sdk/gitea v0.0.0-20200107034216-f0ac57ba0b2b + gitea.com/jolheiser/gitea-sdk v0.0.0-20200109220820-7c157d02c55f + github.com/antihax/optional v1.0.0 github.com/cpuguy83/go-md2man/v2 v2.0.0 // indirect github.com/google/go-github v17.0.0+incompatible github.com/google/go-querystring v1.0.0 // indirect diff --git a/go.sum b/go.sum index 33cf34a..bfbaa36 100644 --- a/go.sum +++ b/go.sum @@ -1,12 +1,14 @@ -code.gitea.io/sdk v0.0.0-20200107034216-f0ac57ba0b2b h1:ujbGMqEbr4d/gSfsOkJapGwx9h0g+cRgTuHlRovgLFI= -code.gitea.io/sdk/gitea v0.0.0-20200107034216-f0ac57ba0b2b h1:z5T6DxY2fqJz02qhXGnQQ2lXfPW5bTDM/0lqzFGNcyk= -code.gitea.io/sdk/gitea v0.0.0-20200107034216-f0ac57ba0b2b/go.mod h1:8IxkM1gyiwEjfO0m47bcmr3u3foR15+LoVub43hCHd0= -gitea.com/gitea/go-sdk v0.0.0-20200107034216-f0ac57ba0b2b h1:qAIFQDSrZFRzUHHWSXuotBA0BpB5m7Y978gl1Jp4Vro= -gitea.com/gitea/go-sdk v0.0.0-20200107034216-f0ac57ba0b2b/go.mod h1:r9S7LXuEumOEDhkZ9qHLhHSnTO6XNnKiBEbunPJJY+8= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +gitea.com/jolheiser/gitea-sdk v0.0.0-20200109220820-7c157d02c55f h1:1EIcRd8J1+7hLF7hCI+H+Dn5PGilrmitiQdXi+qEnY8= +gitea.com/jolheiser/gitea-sdk v0.0.0-20200109220820-7c157d02c55f/go.mod h1:8IIUqhmftS5zEzOXKIuYhRzD22qDvGAdzJ+N2+b0k+4= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/antihax/optional v1.0.0 h1:xK2lYat7ZLaVVcIuj82J8kIro4V6kDe0AUDFboUCwcg= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/google/go-github v17.0.0+incompatible h1:N0LgJ1j65A7kfXrZnUDaYCs/Sf4rEjNlfyDHW9dolSY= github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= @@ -19,6 +21,16 @@ github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5I github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/urfave/cli/v2 v2.1.1 h1:Qt8FeAtxE/vfdrLmR3rxR6JRE0RoVmbXu8+6kZtYU4k= github.com/urfave/cli/v2 v2.1.1/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e h1:bRhVy7zSSasaqNksaRZiA5EEI+Ei4I1nO5Jh72wfHlg= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4 h1:YUO/7uOKsKeq9UokNS62b8FYywz3ker1l1vDZRCRefw= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/service/gitea.go b/service/gitea.go index e60ea2a..e9a8a04 100644 --- a/service/gitea.go +++ b/service/gitea.go @@ -5,30 +5,37 @@ package service import ( + "context" "fmt" + "github.com/antihax/optional" "sort" "strings" "time" "code.gitea.io/changelog/config" - "code.gitea.io/sdk/gitea" + "gitea.com/jolheiser/gitea-sdk" ) // Gitea defines a Gitea service type Gitea struct{} // Changelog returns a Gitea changelog -func (ge Gitea) Changelog(cfg *config.Config, milestone string) (Changelog, error) { +func (ge Gitea) Changelog(milestone string) (Changelog, error) { changelog := Changelog{ - TagURL: fmt.Sprintf("## [%s](%s/%s/src/tag/v%s) - %s\n", cfg.BaseURL, milestone, cfg.Repo, milestone, time.Now().Format("2006-01-02")), + // FIXME Update tag location if Gitea ever has a page specifically for tags like GitHub does + TagURL: fmt.Sprintf("## [%s](%s/%s/src/tag/v%s) - %s\n", milestone, config.Cfg.BaseURL, config.Cfg.Repo, milestone, time.Now().Format("2006-01-02")), } - client := gitea.NewClient(cfg.BaseURL, "") + client := gitea.NewAPIClient(&gitea.Configuration{ + BasePath: config.Cfg.BaseURL + "/api/v1", + DefaultHeader: make(map[string]string), + UserAgent: "Gitea-Changelog/1.0.0/go", + }) labels := make(map[string]string) entries := make(map[string][]Entry) var defaultGroup string - for _, g := range cfg.Groups { + for _, g := range config.Cfg.Groups { entries[g.Name] = []Entry{} for _, l := range g.Labels { labels[l] = g.Name @@ -39,19 +46,33 @@ func (ge Gitea) Changelog(cfg *config.Config, milestone string) (Changelog, erro } if defaultGroup == "" { - defaultGroup = cfg.Groups[len(cfg.Groups)-1].Name + defaultGroup = config.Cfg.Groups[len(config.Cfg.Groups)-1].Name } - repoOwner := strings.Split(cfg.Repo, "/") + repoOwner := strings.Split(config.Cfg.Repo, "/") repo := repoOwner[0] owner := repoOwner[1] + + milestones, _, err := client.IssueApi.IssueGetMilestonesList(context.Background(), repo, owner, nil) + if err != nil { + return changelog, err + } + + var milestoneID int64 + for _, ms := range milestones { + if ms.Title == milestone { + milestoneID = ms.Id + break + } + } + p := 1 perPage := 100 for { - // FIXME Once SDK is updated, search only by milestone - results, err := client.ListRepoPullRequests(repo, owner, gitea.ListPullRequestsOptions{ - Page: p, - State: "closed", + results, _, err := client.RepositoryApi.RepoListPullRequests(context.Background(), repo, owner, &gitea.RepoListPullRequestsOpts{ + Page: optional.NewInt32(int32(p)), + State: optional.NewString("closed"), + Milestone: optional.NewInt64(milestoneID), }) p++ if err != nil { @@ -60,13 +81,13 @@ func (ge Gitea) Changelog(cfg *config.Config, milestone string) (Changelog, erro PRLoop: // labels in Go, let's get old school for _, pr := range results { - if pr == nil || !pr.HasMerged || pr.Milestone == nil || pr.Milestone.Title != milestone { + if !pr.Merged { continue } var label string for _, lb := range pr.Labels { - if cfg.SkipRegex != nil && cfg.SkipRegex.MatchString(lb.Name) { + if config.Cfg.SkipRegex != nil && config.Cfg.SkipRegex.MatchString(lb.Name) { continue PRLoop } @@ -78,12 +99,12 @@ func (ge Gitea) Changelog(cfg *config.Config, milestone string) (Changelog, erro if len(label) > 0 { entries[label] = append(entries[label], Entry{ Title: pr.Title, - Index: pr.Index, + Index: pr.Number, }) } else { entries[defaultGroup] = append(entries[defaultGroup], Entry{ Title: pr.Title, - Index: pr.Index, + Index: pr.Number, }) } } @@ -99,20 +120,38 @@ func (ge Gitea) Changelog(cfg *config.Config, milestone string) (Changelog, erro } // Contributors returns a list of contributors from Gitea -func (ge Gitea) Contributors(cfg *config.Config, milestone string) ([]string, error) { - client := gitea.NewClient(cfg.BaseURL, "") +func (ge Gitea) Contributors(milestone string) ([]string, error) { + client := gitea.NewAPIClient(&gitea.Configuration{ + BasePath: config.Cfg.BaseURL + "/api/v1", + DefaultHeader: make(map[string]string), + UserAgent: "Gitea-Changelog/1.0.0/go", + }) contributorsMap := make(map[string]bool) - repoOwner := strings.Split(cfg.Repo, "/") + repoOwner := strings.Split(config.Cfg.Repo, "/") repo := repoOwner[0] owner := repoOwner[1] + + milestones, _, err := client.IssueApi.IssueGetMilestonesList(context.Background(), repo, owner, nil) + if err != nil { + return nil, err + } + + var milestoneID int64 + for _, ms := range milestones { + if ms.Title == milestone { + milestoneID = ms.Id + break + } + } + p := 1 perPage := 100 for { - // FIXME Once SDK is updated, search only by milestone - results, err := client.ListRepoPullRequests(repo, owner, gitea.ListPullRequestsOptions{ - Page: p, - State: "closed", + results, _, err := client.RepositoryApi.RepoListPullRequests(context.Background(), repo, owner, &gitea.RepoListPullRequestsOpts{ + Page: optional.NewInt32(int32(p)), + State: optional.NewString("closed"), + Milestone: optional.NewInt64(milestoneID), }) p++ if err != nil { @@ -120,15 +159,11 @@ func (ge Gitea) Contributors(cfg *config.Config, milestone string) ([]string, er } for _, pr := range results { - if !pr.HasMerged || pr.Milestone == nil { + if !pr.Merged { continue } - if pr.Milestone.Title != milestone { - continue - } - - contributorsMap[pr.Poster.UserName] = true + contributorsMap[pr.User.Login] = true } if len(results) != perPage { @@ -145,3 +180,7 @@ func (ge Gitea) Contributors(cfg *config.Config, milestone string) ([]string, er return contributors, nil } + +func (ge Gitea) BaseURL() string { + return config.Cfg.BaseURL +} diff --git a/service/github.go b/service/github.go index b7bd5e3..c3f5801 100644 --- a/service/github.go +++ b/service/github.go @@ -19,9 +19,9 @@ import ( type GitHub struct{} // Changelog returns a GitHub changelog -func (gh GitHub) Changelog(cfg *config.Config, milestone string) (Changelog, error) { +func (gh GitHub) Changelog(milestone string) (Changelog, error) { changelog := Changelog{ - TagURL: fmt.Sprintf("## [%s](https://github.com/%s/releases/tag/v%s) - %s\n", milestone, cfg.Repo, milestone, time.Now().Format("2006-01-02")), + TagURL: fmt.Sprintf("## [%s](https://github.com/%s/releases/tag/v%s) - %s\n", milestone, config.Cfg.Repo, milestone, time.Now().Format("2006-01-02")), } client := github.NewClient(nil) @@ -30,7 +30,7 @@ func (gh GitHub) Changelog(cfg *config.Config, milestone string) (Changelog, err labels := make(map[string]string) entries := make(map[string][]Entry) var defaultGroup string - for _, g := range cfg.Groups { + for _, g := range config.Cfg.Groups { entries[g.Name] = []Entry{} for _, l := range g.Labels { labels[l] = g.Name @@ -41,10 +41,10 @@ func (gh GitHub) Changelog(cfg *config.Config, milestone string) (Changelog, err } if defaultGroup == "" { - defaultGroup = cfg.Groups[len(cfg.Groups)-1].Name + defaultGroup = config.Cfg.Groups[len(config.Cfg.Groups)-1].Name } - query := fmt.Sprintf(`repo:%s is:merged milestone:"%s"`, cfg.Repo, milestone) + query := fmt.Sprintf(`repo:%s is:merged milestone:"%s"`, config.Cfg.Repo, milestone) p := 1 perPage := 100 for { @@ -63,7 +63,7 @@ func (gh GitHub) Changelog(cfg *config.Config, milestone string) (Changelog, err for _, pr := range result.Issues { var label string for _, lb := range pr.Labels { - if cfg.SkipRegex != nil && cfg.SkipRegex.MatchString(lb.GetName()) { + if config.Cfg.SkipRegex != nil && config.Cfg.SkipRegex.MatchString(lb.GetName()) { continue PRLoop } @@ -96,12 +96,12 @@ func (gh GitHub) Changelog(cfg *config.Config, milestone string) (Changelog, err } // Contributors returns a list of contributors from GitHub -func (gh GitHub) Contributors(cfg *config.Config, milestone string) ([]string, error) { +func (gh GitHub) Contributors(milestone string) ([]string, error) { client := github.NewClient(nil) ctx := context.Background() contributorsMap := make(map[string]bool) - query := fmt.Sprintf(`repo:%s is:merged milestone:"%s"`, cfg.Repo, milestone) + query := fmt.Sprintf(`repo:%s is:merged milestone:"%s"`, config.Cfg.Repo, milestone) p := 1 perPage := 100 for { @@ -134,3 +134,7 @@ func (gh GitHub) Contributors(cfg *config.Config, milestone string) ([]string, e return contributors, nil } + +func (gh GitHub) BaseURL() string { + return "https://github.com" +} diff --git a/service/service.go b/service/service.go index 4a73728..76fb568 100644 --- a/service/service.go +++ b/service/service.go @@ -12,8 +12,8 @@ import ( ) // Parse returns a service from a string -func Parse(s string) (Service, error) { - switch strings.ToLower(s) { +func Load() (Service, error) { + switch strings.ToLower(config.Cfg.Service) { case "github": return GitHub{}, nil case "gitea": @@ -25,8 +25,9 @@ func Parse(s string) (Service, error) { // Service defines how a struct can be a Changelog Service type Service interface { - Changelog(*config.Config, string) (Changelog, error) - Contributors(*config.Config, string) ([]string, error) + Changelog(string) (Changelog, error) + Contributors(string) ([]string, error) + BaseURL() string } // Entry defines a changelog entry (PR title and index) -- 2.40.1 From 799035f644e33460e7852ac9413a9ddb7206ba81 Mon Sep 17 00:00:00 2001 From: jolheiser Date: Thu, 9 Jan 2020 17:09:34 -0600 Subject: [PATCH 03/21] Formatting Signed-off-by: jolheiser --- service/gitea.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/service/gitea.go b/service/gitea.go index e9a8a04..33ad621 100644 --- a/service/gitea.go +++ b/service/gitea.go @@ -7,12 +7,14 @@ package service import ( "context" "fmt" - "github.com/antihax/optional" "sort" "strings" "time" "code.gitea.io/changelog/config" + + "github.com/antihax/optional" + "gitea.com/jolheiser/gitea-sdk" ) -- 2.40.1 From 6ca92f25b965a13a93c1017d6dad0b951cff2477 Mon Sep 17 00:00:00 2001 From: jolheiser Date: Fri, 10 Jan 2020 20:53:02 -0600 Subject: [PATCH 04/21] Update go mod Signed-off-by: jolheiser --- go.mod | 5 ++++- go.sum | 16 ++++++++++++++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index ae6e83b..e0edfbc 100644 --- a/go.mod +++ b/go.mod @@ -3,11 +3,14 @@ module code.gitea.io/changelog go 1.13 require ( - gitea.com/jolheiser/gitea-sdk v0.0.0-20200109220820-7c157d02c55f + gitea.com/jolheiser/gitea-sdk v0.0.1 github.com/antihax/optional v1.0.0 github.com/cpuguy83/go-md2man/v2 v2.0.0 // indirect + github.com/golang/protobuf v1.3.2 // indirect github.com/google/go-github v17.0.0+incompatible github.com/google/go-querystring v1.0.0 // indirect github.com/urfave/cli/v2 v2.1.1 + golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553 // indirect + google.golang.org/appengine v1.6.5 // indirect gopkg.in/yaml.v2 v2.2.7 ) diff --git a/go.sum b/go.sum index bfbaa36..82f50b8 100644 --- a/go.sum +++ b/go.sum @@ -1,6 +1,6 @@ cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -gitea.com/jolheiser/gitea-sdk v0.0.0-20200109220820-7c157d02c55f h1:1EIcRd8J1+7hLF7hCI+H+Dn5PGilrmitiQdXi+qEnY8= -gitea.com/jolheiser/gitea-sdk v0.0.0-20200109220820-7c157d02c55f/go.mod h1:8IIUqhmftS5zEzOXKIuYhRzD22qDvGAdzJ+N2+b0k+4= +gitea.com/jolheiser/gitea-sdk v0.0.1 h1:pOUXKgvM4HIoVp6YbZ/jgF4094h70AoLBT6oaSiTRKk= +gitea.com/jolheiser/gitea-sdk v0.0.1/go.mod h1:c+DLe4/JxFQw5j1/7g0r2P5ehFwcALONUA/gXy/kBU0= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/antihax/optional v1.0.0 h1:xK2lYat7ZLaVVcIuj82J8kIro4V6kDe0AUDFboUCwcg= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= @@ -9,6 +9,9 @@ github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/google/go-github v17.0.0+incompatible h1:N0LgJ1j65A7kfXrZnUDaYCs/Sf4rEjNlfyDHW9dolSY= github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= @@ -21,16 +24,25 @@ github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5I github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/urfave/cli/v2 v2.1.1 h1:Qt8FeAtxE/vfdrLmR3rxR6JRE0RoVmbXu8+6kZtYU4k= github.com/urfave/cli/v2 v2.1.1/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e h1:bRhVy7zSSasaqNksaRZiA5EEI+Ei4I1nO5Jh72wfHlg= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553 h1:efeOvDhwQ29Dj3SdAV/MJf8oukgn+8D8WgaCaRMchF8= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4 h1:YUO/7uOKsKeq9UokNS62b8FYywz3ker1l1vDZRCRefw= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.5 h1:tycE03LOZYQNhDpS27tcQdAzLCVMaj7QT2SXxebnpCM= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -- 2.40.1 From 039e0fac27050aea2fec55431ec9ffe5f3239748 Mon Sep 17 00:00:00 2001 From: jolheiser Date: Mon, 13 Jan 2020 14:57:30 -0600 Subject: [PATCH 05/21] Clean up and add token flag Signed-off-by: jolheiser --- cmd/cmd.go | 11 ---- cmd/contributors.go | 4 +- cmd/generate.go | 47 +++++++++++++-- config/config.go | 7 ++- main.go | 12 +++- service/gitea.go | 140 ++++++++++++++++++++------------------------ service/github.go | 70 +++++++--------------- service/service.go | 29 +++++---- 8 files changed, 159 insertions(+), 161 deletions(-) delete mode 100644 cmd/cmd.go diff --git a/cmd/cmd.go b/cmd/cmd.go deleted file mode 100644 index 777c1ca..0000000 --- a/cmd/cmd.go +++ /dev/null @@ -1,11 +0,0 @@ -// 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 cmd - -var ( - // CLI Flags - Milestone string - ConfigPath string -) diff --git a/cmd/contributors.go b/cmd/contributors.go index 844b774..fce8952 100644 --- a/cmd/contributors.go +++ b/cmd/contributors.go @@ -21,7 +21,7 @@ var Contributors = &cli.Command{ } func runContributors(cmd *cli.Context) error { - if err := config.Load(ConfigPath); err != nil { + if err := config.Load(); err != nil { return err } @@ -30,7 +30,7 @@ func runContributors(cmd *cli.Context) error { return err } - contributors, err := s.Contributors(Milestone) + contributors, err := s.Contributors() if err != nil { return err } diff --git a/cmd/generate.go b/cmd/generate.go index e51e5fc..0219f74 100644 --- a/cmd/generate.go +++ b/cmd/generate.go @@ -21,28 +21,65 @@ var Generate = &cli.Command{ } func runGenerate(cmd *cli.Context) error { - if err := config.Load(ConfigPath); err != nil { + if err := config.Load(); err != nil { return err } + labels := make(map[string]string) + entries := make(map[string][]service.PullRequest) + var defaultGroup string + for _, g := range config.Cfg.Groups { + entries[g.Name] = []service.PullRequest{} + for _, l := range g.Labels { + labels[l] = g.Name + } + if g.Default { + defaultGroup = g.Name + } + } + + if defaultGroup == "" { + defaultGroup = config.Cfg.Groups[len(config.Cfg.Groups)-1].Name + } + s, err := service.Load() if err != nil { return err } - changelog, err := s.Changelog(Milestone) + title, prs, err := s.Changelog() if err != nil { return err } - fmt.Printf(changelog.TagURL) +PRLoop: // labels in Go, let's get old school + for _, pr := range prs { + var label string + for _, lb := range pr.Labels { + if config.Cfg.SkipRegex != nil && config.Cfg.SkipRegex.MatchString(lb.Name) { + continue PRLoop + } + + if g, ok := labels[lb.Name]; ok && len(label) == 0 { + label = g + } + } + + if len(label) > 0 { + entries[label] = append(entries[label], pr) + } else { + entries[defaultGroup] = append(entries[defaultGroup], pr) + } + } + + fmt.Printf(title) for _, g := range config.Cfg.Groups { - if len(changelog.Entries[g.Name]) == 0 { + if len(entries[g.Name]) == 0 { continue } fmt.Println("* " + g.Name) - for _, entry := range changelog.Entries[g.Name] { + for _, entry := range entries[g.Name] { fmt.Printf(" * %s (#%d)\n", entry.Title, entry.Index) } } diff --git a/config/config.go b/config/config.go index 55a1508..03040d7 100644 --- a/config/config.go +++ b/config/config.go @@ -13,6 +13,7 @@ import ( var ( defaultConfig []byte + ConfigPath string Cfg *Config ) @@ -34,13 +35,13 @@ type Config struct { } // Load a config from a path, defaulting to changelog.example.yml -func Load(configPath string) error { +func Load() error { var err error var configContent []byte - if len(configPath) == 0 { + if len(ConfigPath) == 0 { configContent = defaultConfig } else { - configContent, err = ioutil.ReadFile(configPath) + configContent, err = ioutil.ReadFile(ConfigPath) if err != nil { return err } diff --git a/main.go b/main.go index 3104f7a..1c57b48 100644 --- a/main.go +++ b/main.go @@ -9,6 +9,8 @@ package main import ( "code.gitea.io/changelog/cmd" + "code.gitea.io/changelog/config" + "code.gitea.io/changelog/service" "fmt" "os" @@ -31,13 +33,19 @@ func main() { Aliases: []string{"m"}, Usage: "Targeted milestone", Required: true, - Destination: &cmd.Milestone, + Destination: &service.Milestone, }, &cli.StringFlag{ Name: "config", Aliases: []string{"c"}, Usage: "Specify a config file", - Destination: &cmd.ConfigPath, + Destination: &config.ConfigPath, + }, + &cli.StringFlag{ + Name: "token", + Aliases: []string{"t"}, + Usage: "Access token for private repositories/instances", + Destination: &service.Token, }, }, Commands: []*cli.Command{ diff --git a/service/gitea.go b/service/gitea.go index 33ad621..c4f7d56 100644 --- a/service/gitea.go +++ b/service/gitea.go @@ -22,11 +22,8 @@ import ( type Gitea struct{} // Changelog returns a Gitea changelog -func (ge Gitea) Changelog(milestone string) (Changelog, error) { - changelog := Changelog{ - // FIXME Update tag location if Gitea ever has a page specifically for tags like GitHub does - TagURL: fmt.Sprintf("## [%s](%s/%s/src/tag/v%s) - %s\n", milestone, config.Cfg.BaseURL, config.Cfg.Repo, milestone, time.Now().Format("2006-01-02")), - } +func (ge Gitea) Changelog() (string, []PullRequest, error) { + tagURL := fmt.Sprintf("## [%s](%s/%s/src/tag/v%s) - %s\n", Milestone, config.Cfg.BaseURL, config.Cfg.Repo, Milestone, time.Now().Format("2006-01-02")) client := gitea.NewAPIClient(&gitea.Configuration{ BasePath: config.Cfg.BaseURL + "/api/v1", @@ -34,80 +31,53 @@ func (ge Gitea) Changelog(milestone string) (Changelog, error) { UserAgent: "Gitea-Changelog/1.0.0/go", }) - labels := make(map[string]string) - entries := make(map[string][]Entry) - var defaultGroup string - for _, g := range config.Cfg.Groups { - entries[g.Name] = []Entry{} - for _, l := range g.Labels { - labels[l] = g.Name - } - if g.Default { - defaultGroup = g.Name - } + var ctx context.Context + if len(Token) > 0 { + ctx = context.WithValue(context.Background(), gitea.ContextAccessToken, Token) + } else { + ctx = context.Background() } - if defaultGroup == "" { - defaultGroup = config.Cfg.Groups[len(config.Cfg.Groups)-1].Name - } + prs := make([]PullRequest, 0) repoOwner := strings.Split(config.Cfg.Repo, "/") - repo := repoOwner[0] - owner := repoOwner[1] + owner := repoOwner[0] + repo := repoOwner[1] - milestones, _, err := client.IssueApi.IssueGetMilestonesList(context.Background(), repo, owner, nil) + milestoneID, err := getMilestoneID(client, ctx, owner, repo) if err != nil { - return changelog, err - } - - var milestoneID int64 - for _, ms := range milestones { - if ms.Title == milestone { - milestoneID = ms.Id - break - } + return "", nil, err } p := 1 perPage := 100 for { - results, _, err := client.RepositoryApi.RepoListPullRequests(context.Background(), repo, owner, &gitea.RepoListPullRequestsOpts{ + results, _, err := client.RepositoryApi.RepoListPullRequests(ctx, owner, repo, &gitea.RepoListPullRequestsOpts{ Page: optional.NewInt32(int32(p)), State: optional.NewString("closed"), Milestone: optional.NewInt64(milestoneID), }) - p++ if err != nil { - return changelog, err + return "", nil, err } + p++ - PRLoop: // labels in Go, let's get old school for _, pr := range results { - if !pr.Merged { - continue - } - - var label string - for _, lb := range pr.Labels { - if config.Cfg.SkipRegex != nil && config.Cfg.SkipRegex.MatchString(lb.Name) { - continue PRLoop - } - - if g, ok := labels[lb.Name]; ok && len(label) == 0 { - label = g - } - } - - if len(label) > 0 { - entries[label] = append(entries[label], Entry{ + if pr.Merged { + p := PullRequest{ Title: pr.Title, Index: pr.Number, - }) - } else { - entries[defaultGroup] = append(entries[defaultGroup], Entry{ - Title: pr.Title, - Index: pr.Number, - }) + } + + 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) } } @@ -116,49 +86,46 @@ func (ge Gitea) Changelog(milestone string) (Changelog, error) { } } - changelog.Entries = entries - - return changelog, nil + return tagURL, prs, nil } // Contributors returns a list of contributors from Gitea -func (ge Gitea) Contributors(milestone string) ([]string, error) { +func (ge Gitea) Contributors() ([]string, error) { client := gitea.NewAPIClient(&gitea.Configuration{ BasePath: config.Cfg.BaseURL + "/api/v1", DefaultHeader: make(map[string]string), UserAgent: "Gitea-Changelog/1.0.0/go", }) - contributorsMap := make(map[string]bool) - repoOwner := strings.Split(config.Cfg.Repo, "/") - repo := repoOwner[0] - owner := repoOwner[1] - - milestones, _, err := client.IssueApi.IssueGetMilestonesList(context.Background(), repo, owner, nil) - if err != nil { - return nil, err + var ctx context.Context + if len(Token) > 0 { + ctx = context.WithValue(context.Background(), gitea.ContextAccessToken, Token) + } else { + ctx = context.Background() } - var milestoneID int64 - for _, ms := range milestones { - if ms.Title == milestone { - milestoneID = ms.Id - break - } + contributorsMap := make(map[string]bool) + repoOwner := strings.Split(config.Cfg.Repo, "/") + owner := repoOwner[0] + repo := repoOwner[1] + + milestoneID, err := getMilestoneID(client, ctx, owner, repo) + if err != nil { + return nil, err } p := 1 perPage := 100 for { - results, _, err := client.RepositoryApi.RepoListPullRequests(context.Background(), repo, owner, &gitea.RepoListPullRequestsOpts{ + results, _, err := client.RepositoryApi.RepoListPullRequests(ctx, owner, repo, &gitea.RepoListPullRequestsOpts{ Page: optional.NewInt32(int32(p)), State: optional.NewString("closed"), Milestone: optional.NewInt64(milestoneID), }) - p++ if err != nil { return nil, err } + p++ for _, pr := range results { if !pr.Merged { @@ -186,3 +153,20 @@ func (ge Gitea) Contributors(milestone string) ([]string, error) { func (ge Gitea) BaseURL() string { return config.Cfg.BaseURL } + +func getMilestoneID(client *gitea.APIClient, ctx context.Context, owner, repo string) (int64, error) { + milestones, _, err := client.IssueApi.IssueGetMilestonesList(ctx, owner, repo, &gitea.IssueGetMilestonesListOpts{ + State: optional.NewString("all"), + }) + if err != nil { + return 0, err + } + + for _, ms := range milestones { + if ms.Title == Milestone { + return ms.Id, nil + } + } + + return 0, fmt.Errorf("no milestone found for %s", Milestone) +} diff --git a/service/github.go b/service/github.go index c3f5801..aaff7af 100644 --- a/service/github.go +++ b/service/github.go @@ -19,32 +19,15 @@ import ( type GitHub struct{} // Changelog returns a GitHub changelog -func (gh GitHub) Changelog(milestone string) (Changelog, error) { - changelog := Changelog{ - TagURL: fmt.Sprintf("## [%s](https://github.com/%s/releases/tag/v%s) - %s\n", milestone, config.Cfg.Repo, milestone, time.Now().Format("2006-01-02")), - } +func (gh GitHub) Changelog() (string, []PullRequest, error) { + tagURL := fmt.Sprintf("## [%s](https://github.com/%s/releases/tag/v%s) - %s\n", Milestone, config.Cfg.Repo, Milestone, time.Now().Format("2006-01-02")) client := github.NewClient(nil) ctx := context.Background() - labels := make(map[string]string) - entries := make(map[string][]Entry) - var defaultGroup string - for _, g := range config.Cfg.Groups { - entries[g.Name] = []Entry{} - for _, l := range g.Labels { - labels[l] = g.Name - } - if g.Default { - defaultGroup = g.Name - } - } + prs := make([]PullRequest, 0) - if defaultGroup == "" { - defaultGroup = config.Cfg.Groups[len(config.Cfg.Groups)-1].Name - } - - query := fmt.Sprintf(`repo:%s is:merged milestone:"%s"`, config.Cfg.Repo, milestone) + query := fmt.Sprintf(`repo:%s is:merged milestone:"%s"`, config.Cfg.Repo, Milestone) p := 1 perPage := 100 for { @@ -54,34 +37,27 @@ func (gh GitHub) Changelog(milestone string) (Changelog, error) { PerPage: perPage, }, }) - p++ if err != nil { - return changelog, err + return "", nil, err } + p++ - PRLoop: // labels in Go, let's get old school for _, pr := range result.Issues { - var label string - for _, lb := range pr.Labels { - if config.Cfg.SkipRegex != nil && config.Cfg.SkipRegex.MatchString(lb.GetName()) { - continue PRLoop + if pr.IsPullRequest() { + p := PullRequest{ + Title: pr.GetTitle(), + Index: int64(pr.GetNumber()), } - if g, ok := labels[lb.GetName()]; ok && len(label) == 0 { - label = g + labels := make([]Label, len(pr.Labels)) + for idx, lbl := range pr.Labels { + labels[idx] = Label{ + Name: lbl.GetName(), + } } - } + p.Labels = labels - if len(label) > 0 { - entries[label] = append(entries[label], Entry{ - Title: *pr.Title, - Index: int64(*pr.Number), - }) - } else { - entries[defaultGroup] = append(entries[defaultGroup], Entry{ - Title: *pr.Title, - Index: int64(*pr.Number), - }) + prs = append(prs, p) } } @@ -90,18 +66,16 @@ func (gh GitHub) Changelog(milestone string) (Changelog, error) { } } - changelog.Entries = entries - - return changelog, nil + return tagURL, prs, nil } // Contributors returns a list of contributors from GitHub -func (gh GitHub) Contributors(milestone string) ([]string, error) { +func (gh GitHub) Contributors() ([]string, error) { client := github.NewClient(nil) ctx := context.Background() contributorsMap := make(map[string]bool) - query := fmt.Sprintf(`repo:%s is:merged milestone:"%s"`, config.Cfg.Repo, milestone) + query := fmt.Sprintf(`repo:%s is:merged milestone:"%s"`, config.Cfg.Repo, Milestone) p := 1 perPage := 100 for { @@ -111,13 +85,13 @@ func (gh GitHub) Contributors(milestone string) ([]string, error) { PerPage: perPage, }, }) - p++ if err != nil { return nil, err } + p++ for _, pr := range result.Issues { - contributorsMap[*pr.User.Login] = true + contributorsMap[pr.GetUser().GetLogin()] = true } if len(result.Issues) != perPage { diff --git a/service/service.go b/service/service.go index 76fb568..c837ecc 100644 --- a/service/service.go +++ b/service/service.go @@ -5,12 +5,17 @@ package service import ( - "errors" + "fmt" "strings" "code.gitea.io/changelog/config" ) +var ( + Milestone string + Token string +) + // Parse returns a service from a string func Load() (Service, error) { switch strings.ToLower(config.Cfg.Service) { @@ -19,25 +24,25 @@ func Load() (Service, error) { case "gitea": return Gitea{}, nil default: - return nil, errors.New("unknown service type") + return nil, fmt.Errorf("unknown service type %s", config.Cfg.Service) } } // Service defines how a struct can be a Changelog Service type Service interface { - Changelog(string) (Changelog, error) - Contributors(string) ([]string, error) + Changelog() (string, []PullRequest, error) + Contributors() ([]string, error) BaseURL() string } -// Entry defines a changelog entry (PR title and index) -type Entry struct { - Title string - Index int64 +// Label is the minimum information needed for a PR label +type Label struct { + Name string } -// Changelog defines a full changelog -type Changelog struct { - TagURL string - Entries map[string][]Entry +// PullRequest is the minimum information needed to make a changelog entry +type PullRequest struct { + Title string + Index int64 + Labels []Label } -- 2.40.1 From e07903245a9cf0e00c4e92184535cb3c5f7af090 Mon Sep 17 00:00:00 2001 From: jolheiser Date: Mon, 13 Jan 2020 15:05:43 -0600 Subject: [PATCH 06/21] Add details feature Signed-off-by: jolheiser --- cmd/generate.go | 17 ++++++++++++++--- config/config.go | 6 +++--- main.go | 8 +++++++- 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/cmd/generate.go b/cmd/generate.go index 0219f74..425fdb3 100644 --- a/cmd/generate.go +++ b/cmd/generate.go @@ -13,6 +13,8 @@ import ( "github.com/urfave/cli/v2" ) +var Details bool + var Generate = &cli.Command{ Name: "generate", Usage: "generate changelog", @@ -78,9 +80,18 @@ PRLoop: // labels in Go, let's get old school continue } - fmt.Println("* " + g.Name) - for _, entry := range entries[g.Name] { - fmt.Printf(" * %s (#%d)\n", entry.Title, entry.Index) + if Details { + fmt.Println("
" + g.Name + "") + fmt.Println() + for _, entry := range entries[g.Name] { + fmt.Printf("* %s (#%d)\n", entry.Title, entry.Index) + } + fmt.Println("
") + } else { + fmt.Println("* " + g.Name) + for _, entry := range entries[g.Name] { + fmt.Printf(" * %s (#%d)\n", entry.Title, entry.Index) + } } } diff --git a/config/config.go b/config/config.go index 03040d7..f6aef7d 100644 --- a/config/config.go +++ b/config/config.go @@ -13,7 +13,7 @@ import ( var ( defaultConfig []byte - ConfigPath string + Path string Cfg *Config ) @@ -38,10 +38,10 @@ type Config struct { func Load() error { var err error var configContent []byte - if len(ConfigPath) == 0 { + if len(Path) == 0 { configContent = defaultConfig } else { - configContent, err = ioutil.ReadFile(ConfigPath) + configContent, err = ioutil.ReadFile(Path) if err != nil { return err } diff --git a/main.go b/main.go index 1c57b48..08a9a3d 100644 --- a/main.go +++ b/main.go @@ -39,7 +39,7 @@ func main() { Name: "config", Aliases: []string{"c"}, Usage: "Specify a config file", - Destination: &config.ConfigPath, + Destination: &config.Path, }, &cli.StringFlag{ Name: "token", @@ -47,6 +47,12 @@ func main() { Usage: "Access token for private repositories/instances", Destination: &service.Token, }, + &cli.BoolFlag{ + Name: "details", + Aliases: []string{"d"}, + Usage: "Generate detail lists instead of long lists", + Destination: &cmd.Details, + }, }, Commands: []*cli.Command{ cmd.Generate, -- 2.40.1 From 343b49704a4b12298539d53c11daa642f80538bc Mon Sep 17 00:00:00 2001 From: jolheiser Date: Mon, 13 Jan 2020 15:10:59 -0600 Subject: [PATCH 07/21] Do not rely on newline Signed-off-by: jolheiser --- cmd/generate.go | 2 +- service/gitea.go | 2 +- service/github.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cmd/generate.go b/cmd/generate.go index 425fdb3..4a6c164 100644 --- a/cmd/generate.go +++ b/cmd/generate.go @@ -74,7 +74,7 @@ PRLoop: // labels in Go, let's get old school } } - fmt.Printf(title) + fmt.Println(title) for _, g := range config.Cfg.Groups { if len(entries[g.Name]) == 0 { continue diff --git a/service/gitea.go b/service/gitea.go index c4f7d56..b37d55d 100644 --- a/service/gitea.go +++ b/service/gitea.go @@ -23,7 +23,7 @@ type Gitea struct{} // Changelog returns a Gitea changelog func (ge Gitea) Changelog() (string, []PullRequest, error) { - tagURL := fmt.Sprintf("## [%s](%s/%s/src/tag/v%s) - %s\n", Milestone, config.Cfg.BaseURL, config.Cfg.Repo, Milestone, time.Now().Format("2006-01-02")) + tagURL := fmt.Sprintf("## [%s](%s/%s/src/tag/v%s) - %s", Milestone, config.Cfg.BaseURL, config.Cfg.Repo, Milestone, time.Now().Format("2006-01-02")) client := gitea.NewAPIClient(&gitea.Configuration{ BasePath: config.Cfg.BaseURL + "/api/v1", diff --git a/service/github.go b/service/github.go index aaff7af..fa7ad26 100644 --- a/service/github.go +++ b/service/github.go @@ -20,7 +20,7 @@ type GitHub struct{} // Changelog returns a GitHub changelog func (gh GitHub) Changelog() (string, []PullRequest, error) { - tagURL := fmt.Sprintf("## [%s](https://github.com/%s/releases/tag/v%s) - %s\n", Milestone, config.Cfg.Repo, Milestone, time.Now().Format("2006-01-02")) + tagURL := fmt.Sprintf("## [%s](https://github.com/%s/releases/tag/v%s) - %s", Milestone, config.Cfg.Repo, Milestone, time.Now().Format("2006-01-02")) client := github.NewClient(nil) ctx := context.Background() -- 2.40.1 From dd7c89c0de5c138f77b22c9ba4c44bdcb8ad4412 Mon Sep 17 00:00:00 2001 From: jolheiser Date: Mon, 13 Jan 2020 15:17:53 -0600 Subject: [PATCH 08/21] Import order Signed-off-by: jolheiser --- main.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/main.go b/main.go index 08a9a3d..eaf5411 100644 --- a/main.go +++ b/main.go @@ -8,11 +8,12 @@ package main //go:generate go fmt ./... import ( + "fmt" + "os" + "code.gitea.io/changelog/cmd" "code.gitea.io/changelog/config" "code.gitea.io/changelog/service" - "fmt" - "os" "github.com/urfave/cli/v2" ) -- 2.40.1 From d2c439a6500eacca3cfdf67657b9d3dbbf42c7aa Mon Sep 17 00:00:00 2001 From: jolheiser Date: Mon, 13 Jan 2020 15:19:35 -0600 Subject: [PATCH 09/21] Fix comment Signed-off-by: jolheiser --- service/service.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/service/service.go b/service/service.go index c837ecc..36e9c43 100644 --- a/service/service.go +++ b/service/service.go @@ -16,7 +16,7 @@ var ( Token string ) -// Parse returns a service from a string +// Load returns a service from a string func Load() (Service, error) { switch strings.ToLower(config.Cfg.Service) { case "github": -- 2.40.1 From d6f89b99eab4d30f8cf4b407a9863d8b000ed081 Mon Sep 17 00:00:00 2001 From: jolheiser Date: Mon, 13 Jan 2020 15:28:55 -0600 Subject: [PATCH 10/21] Rename interface func to Generate to match command name Signed-off-by: jolheiser --- cmd/generate.go | 2 +- service/gitea.go | 4 ++-- service/github.go | 4 ++-- service/service.go | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cmd/generate.go b/cmd/generate.go index 4a6c164..fe90fbb 100644 --- a/cmd/generate.go +++ b/cmd/generate.go @@ -49,7 +49,7 @@ func runGenerate(cmd *cli.Context) error { return err } - title, prs, err := s.Changelog() + title, prs, err := s.Generate() if err != nil { return err } diff --git a/service/gitea.go b/service/gitea.go index b37d55d..c81ef0b 100644 --- a/service/gitea.go +++ b/service/gitea.go @@ -21,8 +21,8 @@ import ( // Gitea defines a Gitea service type Gitea struct{} -// Changelog returns a Gitea changelog -func (ge Gitea) Changelog() (string, []PullRequest, error) { +// Generate returns a Gitea changelog +func (ge Gitea) Generate() (string, []PullRequest, error) { tagURL := fmt.Sprintf("## [%s](%s/%s/src/tag/v%s) - %s", Milestone, config.Cfg.BaseURL, config.Cfg.Repo, Milestone, time.Now().Format("2006-01-02")) client := gitea.NewAPIClient(&gitea.Configuration{ diff --git a/service/github.go b/service/github.go index fa7ad26..873feba 100644 --- a/service/github.go +++ b/service/github.go @@ -18,8 +18,8 @@ import ( // GitHub defines a GitHub service type GitHub struct{} -// Changelog returns a GitHub changelog -func (gh GitHub) Changelog() (string, []PullRequest, error) { +// Generate returns a GitHub changelog +func (gh GitHub) Generate() (string, []PullRequest, error) { tagURL := fmt.Sprintf("## [%s](https://github.com/%s/releases/tag/v%s) - %s", Milestone, config.Cfg.Repo, Milestone, time.Now().Format("2006-01-02")) client := github.NewClient(nil) diff --git a/service/service.go b/service/service.go index 36e9c43..335cca5 100644 --- a/service/service.go +++ b/service/service.go @@ -30,7 +30,7 @@ func Load() (Service, error) { // Service defines how a struct can be a Changelog Service type Service interface { - Changelog() (string, []PullRequest, error) + Generate() (string, []PullRequest, error) Contributors() ([]string, error) BaseURL() string } -- 2.40.1 From 9797e1495de086b6de44256d7428d67032e9038b Mon Sep 17 00:00:00 2001 From: jolheiser Date: Fri, 17 Jan 2020 12:17:52 -0600 Subject: [PATCH 11/21] Convert back to go-sdk Signed-off-by: jolheiser --- go.mod | 6 +---- go.sum | 36 +++++-------------------- service/gitea.go | 70 ++++++++++++++---------------------------------- 3 files changed, 28 insertions(+), 84 deletions(-) diff --git a/go.mod b/go.mod index e0edfbc..40114aa 100644 --- a/go.mod +++ b/go.mod @@ -3,14 +3,10 @@ module code.gitea.io/changelog go 1.13 require ( - gitea.com/jolheiser/gitea-sdk v0.0.1 - github.com/antihax/optional v1.0.0 + code.gitea.io/sdk/gitea v0.0.0-20200116035226-b24cfd841cda github.com/cpuguy83/go-md2man/v2 v2.0.0 // indirect - github.com/golang/protobuf v1.3.2 // indirect github.com/google/go-github v17.0.0+incompatible github.com/google/go-querystring v1.0.0 // indirect github.com/urfave/cli/v2 v2.1.1 - golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553 // indirect - google.golang.org/appengine v1.6.5 // indirect gopkg.in/yaml.v2 v2.2.7 ) diff --git a/go.sum b/go.sum index 82f50b8..6c67ad7 100644 --- a/go.sum +++ b/go.sum @@ -1,17 +1,11 @@ -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -gitea.com/jolheiser/gitea-sdk v0.0.1 h1:pOUXKgvM4HIoVp6YbZ/jgF4094h70AoLBT6oaSiTRKk= -gitea.com/jolheiser/gitea-sdk v0.0.1/go.mod h1:c+DLe4/JxFQw5j1/7g0r2P5ehFwcALONUA/gXy/kBU0= +code.gitea.io/sdk/gitea v0.0.0-20200116035226-b24cfd841cda h1:J+qDCjmjcewNcPNfHIex5z726cgv/URXK0MnXHTIo1U= +code.gitea.io/sdk/gitea v0.0.0-20200116035226-b24cfd841cda/go.mod h1:SXOCD/+QP5txLJQ2bPkgHGSQs1YQ4s1ep1ZpI6ItO4A= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/antihax/optional v1.0.0 h1:xK2lYat7ZLaVVcIuj82J8kIro4V6kDe0AUDFboUCwcg= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/google/go-github v17.0.0+incompatible h1:N0LgJ1j65A7kfXrZnUDaYCs/Sf4rEjNlfyDHW9dolSY= github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= @@ -22,27 +16,11 @@ github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0 github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/urfave/cli/v2 v2.1.1 h1:Qt8FeAtxE/vfdrLmR3rxR6JRE0RoVmbXu8+6kZtYU4k= github.com/urfave/cli/v2 v2.1.1/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e h1:bRhVy7zSSasaqNksaRZiA5EEI+Ei4I1nO5Jh72wfHlg= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553 h1:efeOvDhwQ29Dj3SdAV/MJf8oukgn+8D8WgaCaRMchF8= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4 h1:YUO/7uOKsKeq9UokNS62b8FYywz3ker1l1vDZRCRefw= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.5 h1:tycE03LOZYQNhDpS27tcQdAzLCVMaj7QT2SXxebnpCM= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/service/gitea.go b/service/gitea.go index c81ef0b..1e6c460 100644 --- a/service/gitea.go +++ b/service/gitea.go @@ -5,17 +5,13 @@ package service import ( - "context" "fmt" "sort" "strings" "time" "code.gitea.io/changelog/config" - - "github.com/antihax/optional" - - "gitea.com/jolheiser/gitea-sdk" + "code.gitea.io/sdk/gitea" ) // Gitea defines a Gitea service @@ -25,18 +21,7 @@ type Gitea struct{} func (ge Gitea) Generate() (string, []PullRequest, error) { tagURL := fmt.Sprintf("## [%s](%s/%s/src/tag/v%s) - %s", Milestone, config.Cfg.BaseURL, config.Cfg.Repo, Milestone, time.Now().Format("2006-01-02")) - client := gitea.NewAPIClient(&gitea.Configuration{ - BasePath: config.Cfg.BaseURL + "/api/v1", - DefaultHeader: make(map[string]string), - UserAgent: "Gitea-Changelog/1.0.0/go", - }) - - var ctx context.Context - if len(Token) > 0 { - ctx = context.WithValue(context.Background(), gitea.ContextAccessToken, Token) - } else { - ctx = context.Background() - } + client := gitea.NewClient(config.Cfg.BaseURL, Token) prs := make([]PullRequest, 0) @@ -44,7 +29,7 @@ func (ge Gitea) Generate() (string, []PullRequest, error) { owner := repoOwner[0] repo := repoOwner[1] - milestoneID, err := getMilestoneID(client, ctx, owner, repo) + milestoneID, err := getMilestoneID(client, owner, repo) if err != nil { return "", nil, err } @@ -52,10 +37,10 @@ func (ge Gitea) Generate() (string, []PullRequest, error) { p := 1 perPage := 100 for { - results, _, err := client.RepositoryApi.RepoListPullRequests(ctx, owner, repo, &gitea.RepoListPullRequestsOpts{ - Page: optional.NewInt32(int32(p)), - State: optional.NewString("closed"), - Milestone: optional.NewInt64(milestoneID), + results, err := client.ListRepoPullRequests(owner, repo, gitea.ListPullRequestsOptions{ + Page: p, + State: "closed", + Milestone: milestoneID, }) if err != nil { return "", nil, err @@ -63,10 +48,10 @@ func (ge Gitea) Generate() (string, []PullRequest, error) { p++ for _, pr := range results { - if pr.Merged { + if pr != nil && pr.HasMerged { p := PullRequest{ Title: pr.Title, - Index: pr.Number, + Index: pr.Index, } labels := make([]Label, len(pr.Labels)) @@ -91,25 +76,14 @@ func (ge Gitea) Generate() (string, []PullRequest, error) { // Contributors returns a list of contributors from Gitea func (ge Gitea) Contributors() ([]string, error) { - client := gitea.NewAPIClient(&gitea.Configuration{ - BasePath: config.Cfg.BaseURL + "/api/v1", - DefaultHeader: make(map[string]string), - UserAgent: "Gitea-Changelog/1.0.0/go", - }) - - var ctx context.Context - if len(Token) > 0 { - ctx = context.WithValue(context.Background(), gitea.ContextAccessToken, Token) - } else { - ctx = context.Background() - } + client := gitea.NewClient(config.Cfg.BaseURL, Token) contributorsMap := make(map[string]bool) repoOwner := strings.Split(config.Cfg.Repo, "/") owner := repoOwner[0] repo := repoOwner[1] - milestoneID, err := getMilestoneID(client, ctx, owner, repo) + milestoneID, err := getMilestoneID(client, owner, repo) if err != nil { return nil, err } @@ -117,10 +91,10 @@ func (ge Gitea) Contributors() ([]string, error) { p := 1 perPage := 100 for { - results, _, err := client.RepositoryApi.RepoListPullRequests(ctx, owner, repo, &gitea.RepoListPullRequestsOpts{ - Page: optional.NewInt32(int32(p)), - State: optional.NewString("closed"), - Milestone: optional.NewInt64(milestoneID), + results, err := client.ListRepoPullRequests(owner, repo, gitea.ListPullRequestsOptions{ + Page: p, + State: "closed", + Milestone: milestoneID, }) if err != nil { return nil, err @@ -128,11 +102,9 @@ func (ge Gitea) Contributors() ([]string, error) { p++ for _, pr := range results { - if !pr.Merged { - continue + if pr != nil && pr.HasMerged { + contributorsMap[pr.Poster.UserName] = true } - - contributorsMap[pr.User.Login] = true } if len(results) != perPage { @@ -154,17 +126,15 @@ func (ge Gitea) BaseURL() string { return config.Cfg.BaseURL } -func getMilestoneID(client *gitea.APIClient, ctx context.Context, owner, repo string) (int64, error) { - milestones, _, err := client.IssueApi.IssueGetMilestonesList(ctx, owner, repo, &gitea.IssueGetMilestonesListOpts{ - State: optional.NewString("all"), - }) +func getMilestoneID(client *gitea.Client, owner, repo string) (int64, error) { + milestones, err := client.ListRepoMilestones(owner, repo) if err != nil { return 0, err } for _, ms := range milestones { if ms.Title == Milestone { - return ms.Id, nil + return ms.ID, nil } } -- 2.40.1 From 6ffd430b310c96ef52dcc4a5b7dbd256baa1d8fc Mon Sep 17 00:00:00 2001 From: jolheiser Date: Wed, 22 Jan 2020 12:04:12 -0600 Subject: [PATCH 12/21] After feature Signed-off-by: jolheiser --- cmd/generate.go | 9 ++++++++- main.go | 6 ++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/cmd/generate.go b/cmd/generate.go index fe90fbb..b7c7713 100644 --- a/cmd/generate.go +++ b/cmd/generate.go @@ -13,7 +13,10 @@ import ( "github.com/urfave/cli/v2" ) -var Details bool +var ( + Details bool + After int64 +) var Generate = &cli.Command{ Name: "generate", @@ -56,6 +59,10 @@ func runGenerate(cmd *cli.Context) error { PRLoop: // labels in Go, let's get old school for _, pr := range prs { + if pr.Index < After { + continue + } + var label string for _, lb := range pr.Labels { if config.Cfg.SkipRegex != nil && config.Cfg.SkipRegex.MatchString(lb.Name) { diff --git a/main.go b/main.go index eaf5411..6fda389 100644 --- a/main.go +++ b/main.go @@ -54,6 +54,12 @@ func main() { Usage: "Generate detail lists instead of long lists", Destination: &cmd.Details, }, + &cli.Int64Flag{ + Name: "after", + Aliases: []string{"a"}, + Usage: "Only select PRs after a given index (continuing a previous changelog)", + Destination: &cmd.After, + }, }, Commands: []*cli.Command{ cmd.Generate, -- 2.40.1 From 20c1e38143578d84259dd12c1359ed75ea6fa0ee Mon Sep 17 00:00:00 2001 From: jolheiser Date: Wed, 22 Jan 2020 13:34:12 -0600 Subject: [PATCH 13/21] Make code less magical Signed-off-by: jolheiser --- cmd/cmd.go | 9 +++++++ cmd/contributors.go | 10 +++++--- cmd/generate.go | 22 +++++++--------- config/config.go | 27 +++++++++---------- main.go | 13 ++++------ service/gitea.go | 57 ++++++++++++++++++----------------------- service/github.go | 32 +++++++++++------------ service/github_test.go | 34 ++++++++++++++++++++++++ service/service.go | 55 +++++++++++++++++++++++++++++---------- service/service_test.go | 10 ++++++++ 10 files changed, 167 insertions(+), 102 deletions(-) create mode 100644 cmd/cmd.go create mode 100644 service/github_test.go create mode 100644 service/service_test.go diff --git a/cmd/cmd.go b/cmd/cmd.go new file mode 100644 index 0000000..72bca43 --- /dev/null +++ b/cmd/cmd.go @@ -0,0 +1,9 @@ +package cmd + +var ( + MilestoneFlag string + ConfigPathFlag string + TokenFlag string + DetailsFlag bool + AfterFlag int64 +) diff --git a/cmd/contributors.go b/cmd/contributors.go index fce8952..0c8e149 100644 --- a/cmd/contributors.go +++ b/cmd/contributors.go @@ -6,6 +6,7 @@ package cmd import ( "fmt" + "sort" "code.gitea.io/changelog/config" "code.gitea.io/changelog/service" @@ -21,11 +22,12 @@ var Contributors = &cli.Command{ } func runContributors(cmd *cli.Context) error { - if err := config.Load(); err != nil { + cfg, err := config.New(ConfigPathFlag) + if err != nil { return err } - s, err := service.Load() + s, err := service.New(MilestoneFlag, TokenFlag, cfg.Service, cfg.Repo, cfg.BaseURL) if err != nil { return err } @@ -35,8 +37,10 @@ func runContributors(cmd *cli.Context) error { return err } + sort.Sort(contributors) + for _, contributor := range contributors { - fmt.Printf("* [@%s](%s/%s)\n", contributor, s.BaseURL(), contributor) + fmt.Printf("* [@%s](%s)\n", contributor.Name, contributor.Profile) } return nil diff --git a/cmd/generate.go b/cmd/generate.go index b7c7713..7cd1128 100644 --- a/cmd/generate.go +++ b/cmd/generate.go @@ -13,11 +13,6 @@ import ( "github.com/urfave/cli/v2" ) -var ( - Details bool - After int64 -) - var Generate = &cli.Command{ Name: "generate", Usage: "generate changelog", @@ -26,14 +21,15 @@ var Generate = &cli.Command{ } func runGenerate(cmd *cli.Context) error { - if err := config.Load(); err != nil { + cfg, err := config.New(ConfigPathFlag) + if err != nil { return err } labels := make(map[string]string) entries := make(map[string][]service.PullRequest) var defaultGroup string - for _, g := range config.Cfg.Groups { + for _, g := range cfg.Groups { entries[g.Name] = []service.PullRequest{} for _, l := range g.Labels { labels[l] = g.Name @@ -44,10 +40,10 @@ func runGenerate(cmd *cli.Context) error { } if defaultGroup == "" { - defaultGroup = config.Cfg.Groups[len(config.Cfg.Groups)-1].Name + defaultGroup = cfg.Groups[len(cfg.Groups)-1].Name } - s, err := service.Load() + s, err := service.New(MilestoneFlag, TokenFlag, cfg.Service, cfg.Repo, cfg.BaseURL) if err != nil { return err } @@ -59,13 +55,13 @@ func runGenerate(cmd *cli.Context) error { PRLoop: // labels in Go, let's get old school for _, pr := range prs { - if pr.Index < After { + if pr.Index < AfterFlag { continue } var label string for _, lb := range pr.Labels { - if config.Cfg.SkipRegex != nil && config.Cfg.SkipRegex.MatchString(lb.Name) { + if cfg.SkipRegex != nil && cfg.SkipRegex.MatchString(lb.Name) { continue PRLoop } @@ -82,12 +78,12 @@ PRLoop: // labels in Go, let's get old school } fmt.Println(title) - for _, g := range config.Cfg.Groups { + for _, g := range cfg.Groups { if len(entries[g.Name]) == 0 { continue } - if Details { + if DetailsFlag { fmt.Println("
" + g.Name + "") fmt.Println() for _, entry := range entries[g.Name] { diff --git a/config/config.go b/config/config.go index f6aef7d..e265b03 100644 --- a/config/config.go +++ b/config/config.go @@ -11,11 +11,7 @@ import ( "gopkg.in/yaml.v2" ) -var ( - defaultConfig []byte - Path string - Cfg *Config -) +var defaultConfig []byte // Group is a grouping of PRs type Group struct { @@ -35,27 +31,28 @@ type Config struct { } // Load a config from a path, defaulting to changelog.example.yml -func Load() error { +func New(configPath string) (*Config, error) { var err error var configContent []byte - if len(Path) == 0 { + if len(configPath) == 0 { configContent = defaultConfig } else { - configContent, err = ioutil.ReadFile(Path) + configContent, err = ioutil.ReadFile(configPath) if err != nil { - return err + return nil, err } } - if err = yaml.Unmarshal(configContent, &Cfg); err != nil { - return err + var cfg *Config + if err = yaml.Unmarshal(configContent, &cfg); err != nil { + return nil, err } - if len(Cfg.SkipLabels) > 0 { - if Cfg.SkipRegex, err = regexp.Compile(Cfg.SkipLabels); err != nil { - return err + if len(cfg.SkipLabels) > 0 { + if cfg.SkipRegex, err = regexp.Compile(cfg.SkipLabels); err != nil { + return nil, err } } - return nil + return cfg, nil } diff --git a/main.go b/main.go index 6fda389..f23b659 100644 --- a/main.go +++ b/main.go @@ -12,9 +12,6 @@ import ( "os" "code.gitea.io/changelog/cmd" - "code.gitea.io/changelog/config" - "code.gitea.io/changelog/service" - "github.com/urfave/cli/v2" ) @@ -34,31 +31,31 @@ func main() { Aliases: []string{"m"}, Usage: "Targeted milestone", Required: true, - Destination: &service.Milestone, + Destination: &cmd.MilestoneFlag, }, &cli.StringFlag{ Name: "config", Aliases: []string{"c"}, Usage: "Specify a config file", - Destination: &config.Path, + Destination: &cmd.ConfigPathFlag, }, &cli.StringFlag{ Name: "token", Aliases: []string{"t"}, Usage: "Access token for private repositories/instances", - Destination: &service.Token, + Destination: &cmd.TokenFlag, }, &cli.BoolFlag{ Name: "details", Aliases: []string{"d"}, Usage: "Generate detail lists instead of long lists", - Destination: &cmd.Details, + Destination: &cmd.DetailsFlag, }, &cli.Int64Flag{ Name: "after", Aliases: []string{"a"}, Usage: "Only select PRs after a given index (continuing a previous changelog)", - Destination: &cmd.After, + Destination: &cmd.AfterFlag, }, }, Commands: []*cli.Command{ diff --git a/service/gitea.go b/service/gitea.go index 1e6c460..27d800f 100644 --- a/service/gitea.go +++ b/service/gitea.go @@ -6,30 +6,29 @@ package service import ( "fmt" - "sort" - "strings" "time" - "code.gitea.io/changelog/config" "code.gitea.io/sdk/gitea" ) // Gitea defines a Gitea service -type Gitea struct{} +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) { - tagURL := fmt.Sprintf("## [%s](%s/%s/src/tag/v%s) - %s", Milestone, config.Cfg.BaseURL, config.Cfg.Repo, Milestone, time.Now().Format("2006-01-02")) +func (ge *Gitea) Generate() (string, []PullRequest, error) { + tagURL := fmt.Sprintf("## [%s](%s/%s/%s/src/tag/v%s) - %s", ge.Milestone, ge.BaseURL, ge.Owner, ge.Repo, ge.Milestone, time.Now().Format("2006-01-02")) - client := gitea.NewClient(config.Cfg.BaseURL, Token) + client := gitea.NewClient(ge.BaseURL, ge.Token) prs := make([]PullRequest, 0) - repoOwner := strings.Split(config.Cfg.Repo, "/") - owner := repoOwner[0] - repo := repoOwner[1] - - milestoneID, err := getMilestoneID(client, owner, repo) + milestoneID, err := ge.milestoneID(client) if err != nil { return "", nil, err } @@ -37,7 +36,7 @@ func (ge Gitea) Generate() (string, []PullRequest, error) { p := 1 perPage := 100 for { - results, err := client.ListRepoPullRequests(owner, repo, gitea.ListPullRequestsOptions{ + results, err := client.ListRepoPullRequests(ge.Owner, ge.Repo, gitea.ListPullRequestsOptions{ Page: p, State: "closed", Milestone: milestoneID, @@ -75,15 +74,12 @@ func (ge Gitea) Generate() (string, []PullRequest, error) { } // Contributors returns a list of contributors from Gitea -func (ge Gitea) Contributors() ([]string, error) { - client := gitea.NewClient(config.Cfg.BaseURL, Token) +func (ge *Gitea) Contributors() (ContributorList, error) { + client := gitea.NewClient(ge.BaseURL, ge.Token) contributorsMap := make(map[string]bool) - repoOwner := strings.Split(config.Cfg.Repo, "/") - owner := repoOwner[0] - repo := repoOwner[1] - milestoneID, err := getMilestoneID(client, owner, repo) + milestoneID, err := ge.milestoneID(client) if err != nil { return nil, err } @@ -91,7 +87,7 @@ func (ge Gitea) Contributors() ([]string, error) { p := 1 perPage := 100 for { - results, err := client.ListRepoPullRequests(owner, repo, gitea.ListPullRequestsOptions{ + results, err := client.ListRepoPullRequests(ge.Owner, ge.Repo, gitea.ListPullRequestsOptions{ Page: p, State: "closed", Milestone: milestoneID, @@ -112,31 +108,28 @@ func (ge Gitea) Contributors() ([]string, error) { } } - contributors := make([]string, 0, len(contributorsMap)) + contributors := make(ContributorList, 0, len(contributorsMap)) for contributor, _ := range contributorsMap { - contributors = append(contributors, contributor) + contributors = append(contributors, Contributor{ + Name: contributor, + Profile: fmt.Sprintf("%s/%s", ge.BaseURL, contributor), + }) } - sort.Strings(contributors) - return contributors, nil } -func (ge Gitea) BaseURL() string { - return config.Cfg.BaseURL -} - -func getMilestoneID(client *gitea.Client, owner, repo string) (int64, error) { - milestones, err := client.ListRepoMilestones(owner, repo) +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 == Milestone { + if ms.Title == ge.Milestone { return ms.ID, nil } } - return 0, fmt.Errorf("no milestone found for %s", Milestone) + return 0, fmt.Errorf("no milestone found for %s", ge.Milestone) } diff --git a/service/github.go b/service/github.go index 873feba..bea8f09 100644 --- a/service/github.go +++ b/service/github.go @@ -7,27 +7,28 @@ package service import ( "context" "fmt" - "sort" "time" - "code.gitea.io/changelog/config" - "github.com/google/go-github/github" ) // GitHub defines a GitHub service -type GitHub struct{} +type GitHub struct { + Milestone string + Token string + Repo string +} // Generate returns a GitHub changelog -func (gh GitHub) Generate() (string, []PullRequest, error) { - tagURL := fmt.Sprintf("## [%s](https://github.com/%s/releases/tag/v%s) - %s", Milestone, config.Cfg.Repo, Milestone, time.Now().Format("2006-01-02")) +func (gh *GitHub) Generate() (string, []PullRequest, error) { + tagURL := fmt.Sprintf("## [%s](https://github.com/%s/releases/tag/v%s) - %s", gh.Milestone, gh.Repo, gh.Milestone, time.Now().Format("2006-01-02")) client := github.NewClient(nil) ctx := context.Background() prs := make([]PullRequest, 0) - query := fmt.Sprintf(`repo:%s is:merged milestone:"%s"`, config.Cfg.Repo, Milestone) + query := fmt.Sprintf(`repo:%s is:merged milestone:"%s"`, gh.Repo, gh.Milestone) p := 1 perPage := 100 for { @@ -70,12 +71,12 @@ func (gh GitHub) Generate() (string, []PullRequest, error) { } // Contributors returns a list of contributors from GitHub -func (gh GitHub) Contributors() ([]string, error) { +func (gh *GitHub) Contributors() (ContributorList, error) { client := github.NewClient(nil) ctx := context.Background() contributorsMap := make(map[string]bool) - query := fmt.Sprintf(`repo:%s is:merged milestone:"%s"`, config.Cfg.Repo, Milestone) + query := fmt.Sprintf(`repo:%s is:merged milestone:"%s"`, gh.Repo, gh.Milestone) p := 1 perPage := 100 for { @@ -99,16 +100,13 @@ func (gh GitHub) Contributors() ([]string, error) { } } - contributors := make([]string, 0, len(contributorsMap)) + contributors := make(ContributorList, 0, len(contributorsMap)) for contributor, _ := range contributorsMap { - contributors = append(contributors, contributor) + contributors = append(contributors, Contributor{ + Name: contributor, + Profile: fmt.Sprintf("https://github.com/%s", contributor), + }) } - sort.Strings(contributors) - return contributors, nil } - -func (gh GitHub) BaseURL() string { - return "https://github.com" -} diff --git a/service/github_test.go b/service/github_test.go new file mode 100644 index 0000000..82f174b --- /dev/null +++ b/service/github_test.go @@ -0,0 +1,34 @@ +package service + +import "testing" + +var gh = &GitHub{ + Milestone: "1.1.0", // https://github.com/go-gitea/test_repo/milestone/2?closed=1 + Repo: "go-gitea/test_repo", +} + +func TestGitHubGenerate(t *testing.T) { + _, entries, err := gh.Generate() + if err != nil { + t.Log(err) + t.FailNow() + } + + if len(entries) != 1 { + t.Logf("Expected 1 changelog entry, but got %d", len(entries)) + t.Fail() + } +} + +func TestGitHubContributors(t *testing.T) { + contributors, err := gh.Contributors() + if err != nil { + t.Log(err) + t.FailNow() + } + + if len(contributors) != 1 { + t.Logf("Expected 1 contributor, but got %d", len(contributors)) + t.Fail() + } +} diff --git a/service/service.go b/service/service.go index 335cca5..7f40487 100644 --- a/service/service.go +++ b/service/service.go @@ -7,32 +7,35 @@ package service import ( "fmt" "strings" - - "code.gitea.io/changelog/config" -) - -var ( - Milestone string - Token string ) // Load returns a service from a string -func Load() (Service, error) { - switch strings.ToLower(config.Cfg.Service) { +func New(milestone, token, serviceType, repo, baseURL string) (Service, error) { + switch strings.ToLower(serviceType) { case "github": - return GitHub{}, nil + return &GitHub{ + Milestone: milestone, + Token: token, + Repo: repo, + }, nil case "gitea": - return Gitea{}, nil + ownerRepo := strings.Split(repo, "/") + return &Gitea{ + Milestone: milestone, + Token: token, + BaseURL: baseURL, + Owner: ownerRepo[0], + Repo: ownerRepo[1], + }, nil default: - return nil, fmt.Errorf("unknown service type %s", config.Cfg.Service) + return nil, fmt.Errorf("unknown service type %s", serviceType) } } // Service defines how a struct can be a Changelog Service type Service interface { Generate() (string, []PullRequest, error) - Contributors() ([]string, error) - BaseURL() string + Contributors() (ContributorList, error) } // Label is the minimum information needed for a PR label @@ -46,3 +49,27 @@ type PullRequest struct { Index int64 Labels []Label } + +// Contributor is a project contributor +type Contributor struct { + Name string + Profile string +} + +// ContributorList is a slice of Contributors that can be sorted +type ContributorList []Contributor + +// Len is the length of the ContributorList +func (cl ContributorList) Len() int { + return len(cl) +} + +// Less determines whether a Contributor comes before another Contributor +func (cl ContributorList) Less(i, j int) bool { + return cl[i].Name < cl[j].Name +} + +// Swap swaps Contributors in a ContributorList +func (cl ContributorList) Swap(i, j int) { + cl[i], cl[j] = cl[j], cl[i] +} diff --git a/service/service_test.go b/service/service_test.go new file mode 100644 index 0000000..612c235 --- /dev/null +++ b/service/service_test.go @@ -0,0 +1,10 @@ +package service + +import ( + "os" + "testing" +) + +func TestMain(m *testing.M) { + os.Exit(m.Run()) +} -- 2.40.1 From adcaa041b6bd30f8d501cc9ff029f3815cb25b52 Mon Sep 17 00:00:00 2001 From: jolheiser Date: Wed, 22 Jan 2020 13:38:27 -0600 Subject: [PATCH 14/21] Add copyright Signed-off-by: jolheiser --- cmd/cmd.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cmd/cmd.go b/cmd/cmd.go index 72bca43..12642da 100644 --- a/cmd/cmd.go +++ b/cmd/cmd.go @@ -1,3 +1,7 @@ +// 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 cmd var ( -- 2.40.1 From 5b756d7a7ab7a5fd7356646d3bdf4c258a3dd16f Mon Sep 17 00:00:00 2001 From: jolheiser Date: Wed, 22 Jan 2020 13:41:41 -0600 Subject: [PATCH 15/21] Re-order service New Signed-off-by: jolheiser --- cmd/contributors.go | 2 +- cmd/generate.go | 2 +- service/service.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cmd/contributors.go b/cmd/contributors.go index 0c8e149..5a119d0 100644 --- a/cmd/contributors.go +++ b/cmd/contributors.go @@ -27,7 +27,7 @@ func runContributors(cmd *cli.Context) error { return err } - s, err := service.New(MilestoneFlag, TokenFlag, cfg.Service, cfg.Repo, cfg.BaseURL) + s, err := service.New(cfg.Service, cfg.Repo, cfg.BaseURL, MilestoneFlag, TokenFlag) if err != nil { return err } diff --git a/cmd/generate.go b/cmd/generate.go index 7cd1128..bafca3f 100644 --- a/cmd/generate.go +++ b/cmd/generate.go @@ -43,7 +43,7 @@ func runGenerate(cmd *cli.Context) error { defaultGroup = cfg.Groups[len(cfg.Groups)-1].Name } - s, err := service.New(MilestoneFlag, TokenFlag, cfg.Service, cfg.Repo, cfg.BaseURL) + s, err := service.New(cfg.Service, cfg.Repo, cfg.BaseURL, MilestoneFlag, TokenFlag) if err != nil { return err } diff --git a/service/service.go b/service/service.go index 7f40487..92a7584 100644 --- a/service/service.go +++ b/service/service.go @@ -10,7 +10,7 @@ import ( ) // Load returns a service from a string -func New(milestone, token, serviceType, repo, baseURL string) (Service, error) { +func New(serviceType, repo, baseURL, milestone, token string) (Service, error) { switch strings.ToLower(serviceType) { case "github": return &GitHub{ -- 2.40.1 From d6824fdeb0200f6be1da78c9c5856fef63d4cb0c Mon Sep 17 00:00:00 2001 From: jolheiser Date: Wed, 22 Jan 2020 13:51:52 -0600 Subject: [PATCH 16/21] Gitea point to closed milestone PRs for title Signed-off-by: jolheiser --- service/gitea.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/service/gitea.go b/service/gitea.go index 27d800f..70f358b 100644 --- a/service/gitea.go +++ b/service/gitea.go @@ -22,8 +22,6 @@ type Gitea struct { // Generate returns a Gitea changelog func (ge *Gitea) Generate() (string, []PullRequest, error) { - tagURL := fmt.Sprintf("## [%s](%s/%s/%s/src/tag/v%s) - %s", ge.Milestone, ge.BaseURL, ge.Owner, ge.Repo, ge.Milestone, time.Now().Format("2006-01-02")) - client := gitea.NewClient(ge.BaseURL, ge.Token) prs := make([]PullRequest, 0) @@ -33,6 +31,9 @@ func (ge *Gitea) Generate() (string, []PullRequest, error) { 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 perPage := 100 for { -- 2.40.1 From 087416c6980442c78cd0a23e8b2edd7f45dd7427 Mon Sep 17 00:00:00 2001 From: jolheiser Date: Wed, 22 Jan 2020 14:09:13 -0600 Subject: [PATCH 17/21] Change per-page in Gitea Signed-off-by: jolheiser --- service/gitea.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/service/gitea.go b/service/gitea.go index 70f358b..059b1aa 100644 --- a/service/gitea.go +++ b/service/gitea.go @@ -35,7 +35,9 @@ func (ge *Gitea) Generate() (string, []PullRequest, error) { 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 - perPage := 100 + // 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 + perPage := 40 for { results, err := client.ListRepoPullRequests(ge.Owner, ge.Repo, gitea.ListPullRequestsOptions{ Page: p, -- 2.40.1 From e786336910b4edb88ccd1e0f0818a165c2ae331d Mon Sep 17 00:00:00 2001 From: jolheiser Date: Wed, 22 Jan 2020 19:53:45 -0600 Subject: [PATCH 18/21] FIXME Signed-off-by: jolheiser --- service/gitea.go | 1 + 1 file changed, 1 insertion(+) diff --git a/service/gitea.go b/service/gitea.go index 059b1aa..6b1b1f4 100644 --- a/service/gitea.go +++ b/service/gitea.go @@ -37,6 +37,7 @@ func (ge *Gitea) Generate() (string, []PullRequest, error) { 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{ -- 2.40.1 From 1c9433dda1248ffe6fe775f4799f6b2a392b8adc Mon Sep 17 00:00:00 2001 From: jolheiser Date: Wed, 22 Jan 2020 22:08:35 -0600 Subject: [PATCH 19/21] Copyright and wording Signed-off-by: jolheiser --- changelog.example.go | 10 +++++++++- cmd/contributors.go | 7 +++---- cmd/generate.go | 7 +++---- service/gitea.go | 1 - service/github_test.go | 4 ++++ service/service_test.go | 4 ++++ 6 files changed, 23 insertions(+), 10 deletions(-) diff --git a/changelog.example.go b/changelog.example.go index 3cad330..2db8d32 100644 --- a/changelog.example.go +++ b/changelog.example.go @@ -1,3 +1,7 @@ +// 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. + // +build ignore package main @@ -11,7 +15,11 @@ import ( const ( exampleFile = "changelog.example.yml" writeFile = "config/config_default.go" - tmpl = `package config + tmpl = `// 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 config func init() { defaultConfig = []byte(` + "`" + `%s` + "`" + `) diff --git a/cmd/contributors.go b/cmd/contributors.go index 5a119d0..0787bb5 100644 --- a/cmd/contributors.go +++ b/cmd/contributors.go @@ -15,10 +15,9 @@ import ( ) var Contributors = &cli.Command{ - Name: "contributors", - Usage: "generate contributors list", - Description: "generate contributors list", - Action: runContributors, + Name: "contributors", + Usage: "Generates a contributors list", + Action: runContributors, } func runContributors(cmd *cli.Context) error { diff --git a/cmd/generate.go b/cmd/generate.go index bafca3f..bd89e42 100644 --- a/cmd/generate.go +++ b/cmd/generate.go @@ -14,10 +14,9 @@ import ( ) var Generate = &cli.Command{ - Name: "generate", - Usage: "generate changelog", - Description: "generate changelog", - Action: runGenerate, + Name: "generate", + Usage: "Generates a changelog", + Action: runGenerate, } func runGenerate(cmd *cli.Context) error { diff --git a/service/gitea.go b/service/gitea.go index 6b1b1f4..cfcb642 100644 --- a/service/gitea.go +++ b/service/gitea.go @@ -31,7 +31,6 @@ func (ge *Gitea) Generate() (string, []PullRequest, error) { 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 diff --git a/service/github_test.go b/service/github_test.go index 82f174b..562216d 100644 --- a/service/github_test.go +++ b/service/github_test.go @@ -1,3 +1,7 @@ +// 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 "testing" diff --git a/service/service_test.go b/service/service_test.go index 612c235..045e70f 100644 --- a/service/service_test.go +++ b/service/service_test.go @@ -1,3 +1,7 @@ +// 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 ( -- 2.40.1 From 7b8b4146bb7f985d453b3aae8fd8dc67c64b03e9 Mon Sep 17 00:00:00 2001 From: jolheiser Date: Wed, 22 Jan 2020 22:10:21 -0600 Subject: [PATCH 20/21] Copyright Signed-off-by: jolheiser --- config/config_default.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/config/config_default.go b/config/config_default.go index 9e9c854..92905fd 100644 --- a/config/config_default.go +++ b/config/config_default.go @@ -1,3 +1,7 @@ +// 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 config func init() { -- 2.40.1 From c596f5ffe192dd26426e3ea670941b5c1573a8b5 Mon Sep 17 00:00:00 2001 From: jolheiser Date: Thu, 23 Jan 2020 11:11:44 -0600 Subject: [PATCH 21/21] Default gitea service Signed-off-by: jolheiser --- changelog.example.yml | 5 +++-- config/config_default.go | 5 +++-- service/service.go | 5 +++++ 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/changelog.example.yml b/changelog.example.yml index 86af420..d092155 100644 --- a/changelog.example.yml +++ b/changelog.example.yml @@ -4,8 +4,9 @@ repo: go-gitea/gitea # Service type (gitea or github) service: github -# Base URL for Gitea instance if using gitea service type -base-url: https://gitea.com +# Base URL for Gitea instance if using gitea service type (optional) +# Default: https://gitea.com +base-url: # Changelog groups and which labeled PRs to add to each group groups: diff --git a/config/config_default.go b/config/config_default.go index 92905fd..7113f98 100644 --- a/config/config_default.go +++ b/config/config_default.go @@ -11,8 +11,9 @@ repo: go-gitea/gitea # Service type (gitea or github) service: github -# Base URL for Gitea instance if using gitea service type -base-url: https://gitea.com +# Base URL for Gitea instance if using gitea service type (optional) +# Default: https://gitea.com +base-url: # Changelog groups and which labeled PRs to add to each group groups: diff --git a/service/service.go b/service/service.go index 92a7584..9fa7822 100644 --- a/service/service.go +++ b/service/service.go @@ -9,6 +9,8 @@ import ( "strings" ) +const defaultGitea = "https://gitea.com" + // Load returns a service from a string func New(serviceType, repo, baseURL, milestone, token string) (Service, error) { switch strings.ToLower(serviceType) { @@ -20,6 +22,9 @@ func New(serviceType, repo, baseURL, milestone, token string) (Service, error) { }, nil case "gitea": ownerRepo := strings.Split(repo, "/") + if strings.TrimSpace(baseURL) == "" { + baseURL = defaultGitea + } return &Gitea{ Milestone: milestone, Token: token, -- 2.40.1