Initial approach to github issue creation
This commit is contained in:
parent
fdaf72aac4
commit
dcee28eca8
5 changed files with 101 additions and 19 deletions
|
@ -2,12 +2,11 @@ package cmd
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"context"
|
|
||||||
|
|
||||||
"git.ctrlz.es/mgdelacroix/campaigner/campaign"
|
"git.ctrlz.es/mgdelacroix/campaigner/campaign"
|
||||||
"git.ctrlz.es/mgdelacroix/campaigner/config"
|
"git.ctrlz.es/mgdelacroix/campaigner/config"
|
||||||
"git.ctrlz.es/mgdelacroix/campaigner/jira"
|
|
||||||
"git.ctrlz.es/mgdelacroix/campaigner/github"
|
"git.ctrlz.es/mgdelacroix/campaigner/github"
|
||||||
|
"git.ctrlz.es/mgdelacroix/campaigner/jira"
|
||||||
|
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
)
|
)
|
||||||
|
@ -32,7 +31,7 @@ func GithubPublishCmd() *cobra.Command {
|
||||||
Use: "github",
|
Use: "github",
|
||||||
Short: "Publishes the campaign tickets in github",
|
Short: "Publishes the campaign tickets in github",
|
||||||
Args: cobra.NoArgs,
|
Args: cobra.NoArgs,
|
||||||
Run: githubPublishCmdF,
|
RunE: githubPublishCmdF,
|
||||||
}
|
}
|
||||||
|
|
||||||
cmd.Flags().BoolP("all", "a", false, "Publish all the tickets of the campaign")
|
cmd.Flags().BoolP("all", "a", false, "Publish all the tickets of the campaign")
|
||||||
|
@ -96,25 +95,39 @@ func jiraPublishCmdF(cmd *cobra.Command, _ []string) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func githubPublishCmdF(cmd *cobra.Command, _ []string) {
|
func githubPublishCmdF(cmd *cobra.Command, _ []string) error {
|
||||||
|
all, _ := cmd.Flags().GetBool("all")
|
||||||
|
batch, _ := cmd.Flags().GetInt("batch")
|
||||||
|
dryRun, _ := cmd.Flags().GetBool("dry-run")
|
||||||
|
|
||||||
|
if !all && batch == 0 {
|
||||||
|
return fmt.Errorf("One of --all or --batch flags is required")
|
||||||
|
}
|
||||||
|
|
||||||
cfg, err := config.ReadConfig()
|
cfg, err := config.ReadConfig()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ErrorAndExit(cmd, err)
|
ErrorAndExit(cmd, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// cmp, err := campaign.Read()
|
cmp, err := campaign.Read()
|
||||||
// if err != nil {
|
|
||||||
// ErrorAndExit(cmd, err)
|
|
||||||
// }
|
|
||||||
|
|
||||||
githubClient := github.NewClient("my/repo", cfg.GithubToken)
|
|
||||||
|
|
||||||
repos, _, err := githubClient.Repositories.List(context.Background(), "", nil)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ErrorAndExit(cmd, err)
|
ErrorAndExit(cmd, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, repo := range repos {
|
githubClient := github.NewClient("my/repo", cfg.GithubToken)
|
||||||
cmd.Println(*repo.Name)
|
|
||||||
|
if all {
|
||||||
|
count, err := githubClient.PublishAll(cmp, dryRun)
|
||||||
|
if err != nil {
|
||||||
|
ErrorAndExit(cmd, err)
|
||||||
}
|
}
|
||||||
|
cmd.Printf("All %d tickets successfully published in github\n", count)
|
||||||
|
} else {
|
||||||
|
if err := githubClient.PublishBatch(cmp, batch, dryRun); err != nil {
|
||||||
|
ErrorAndExit(cmd, err)
|
||||||
|
}
|
||||||
|
cmd.Printf("Batch of %d tickets successfully published in github\n", batch)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,8 +3,11 @@ package github
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
"golang.org/x/oauth2"
|
"git.ctrlz.es/mgdelacroix/campaigner/campaign"
|
||||||
|
"git.ctrlz.es/mgdelacroix/campaigner/model"
|
||||||
|
|
||||||
"github.com/google/go-github/v29/github"
|
"github.com/google/go-github/v29/github"
|
||||||
|
"golang.org/x/oauth2"
|
||||||
)
|
)
|
||||||
|
|
||||||
type GithubClient struct {
|
type GithubClient struct {
|
||||||
|
@ -23,3 +26,60 @@ func NewClient(repo, token string) *GithubClient {
|
||||||
Repo: repo,
|
Repo: repo,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *GithubClient) PublishTicket(ticket *model.Ticket, cmp *model.Campaign, dryRun bool) (*github.Issue, error) {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *GithubClient) PublishNextTicket(cmp *model.Campaign, dryRun bool) (bool, error) {
|
||||||
|
ticket := cmp.NextGithubUnpublishedTicket()
|
||||||
|
if ticket == nil {
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
issue, err := c.PublishTicket(ticket, cmp, dryRun)
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if dryRun {
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
ticket.GithubLink = *issue.ID
|
||||||
|
// move this to a publish service that can do both github and
|
||||||
|
// jira, as we need to update a jira issue field with the github
|
||||||
|
// link
|
||||||
|
if err := campaign.Save(cmp); err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *GithubClient) PublishAll(cmp *model.Campaign, dryRun bool) (int, error) {
|
||||||
|
count := 0
|
||||||
|
for {
|
||||||
|
next, err := c.PublishNextTicket(cmp, dryRun)
|
||||||
|
if err != nil {
|
||||||
|
return count, err
|
||||||
|
}
|
||||||
|
if !next {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
count++
|
||||||
|
}
|
||||||
|
return count, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *GithubClient) PublishBatch(cmp *model.Campaign, batch int, dryRun bool) error {
|
||||||
|
for i := 0; i <= batch; i++ {
|
||||||
|
next, err := c.PublishNextTicket(cmp, dryRun)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if !next {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
|
@ -113,7 +113,7 @@ func (c *JiraClient) GetIssue(issueNo string) (*jira.Issue, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *JiraClient) PublishNextTicket(cmp *model.Campaign, dryRun bool) (bool, error) {
|
func (c *JiraClient) PublishNextTicket(cmp *model.Campaign, dryRun bool) (bool, error) {
|
||||||
ticket := cmp.NextUnpublishedTicket()
|
ticket := cmp.NextJiraUnpublishedTicket()
|
||||||
if ticket == nil {
|
if ticket == nil {
|
||||||
return false, nil
|
return false, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,7 +16,7 @@ type Campaign struct {
|
||||||
Tickets []*Ticket `json:"tickets,omitempty"`
|
Tickets []*Ticket `json:"tickets,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Campaign) NextUnpublishedTicket() *Ticket {
|
func (c *Campaign) NextJiraUnpublishedTicket() *Ticket {
|
||||||
for _, ticket := range c.Tickets {
|
for _, ticket := range c.Tickets {
|
||||||
if ticket.JiraLink == "" {
|
if ticket.JiraLink == "" {
|
||||||
return ticket
|
return ticket
|
||||||
|
@ -25,6 +25,15 @@ func (c *Campaign) NextUnpublishedTicket() *Ticket {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *Campaign) NextGithubUnpublishedTicket() *Ticket {
|
||||||
|
for _, ticket := range c.Tickets {
|
||||||
|
if ticket.JiraLink != "" && ticket.GithubLink != 0 {
|
||||||
|
return ticket
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (c *Campaign) PrintStatus(w io.Writer) {
|
func (c *Campaign) PrintStatus(w io.Writer) {
|
||||||
fmt.Fprintf(w, "Url: %s\n", c.Url)
|
fmt.Fprintf(w, "Url: %s\n", c.Url)
|
||||||
fmt.Fprintf(w, "Project: %s\n", c.Project)
|
fmt.Fprintf(w, "Project: %s\n", c.Project)
|
||||||
|
|
|
@ -6,7 +6,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
type Ticket struct {
|
type Ticket struct {
|
||||||
GithubLink string `json:"githubLink,omitempty"`
|
GithubLink int64 `json:"githubLink,omitempty"`
|
||||||
JiraLink string `json:"jiraLink,omitempty"`
|
JiraLink string `json:"jiraLink,omitempty"`
|
||||||
Summary string `json:"summary,omitempty"`
|
Summary string `json:"summary,omitempty"`
|
||||||
Data map[string]interface{} `json:"data,omitempty"`
|
Data map[string]interface{} `json:"data,omitempty"`
|
||||||
|
|
Loading…
Reference in a new issue