campaigner/cmd/init.go

112 lines
3.7 KiB
Go

package cmd
import (
"bufio"
"fmt"
"os"
"strings"
"git.ctrlz.es/mgdelacroix/campaigner/app"
"git.ctrlz.es/mgdelacroix/campaigner/model"
"github.com/spf13/cobra"
)
func InitCmd() *cobra.Command {
cmd := &cobra.Command{
Use: "init",
Short: "Creates a campaign",
Long: "Creates a new campaign in the current directory",
Example: ` campaigner init \
--jira-username johndoe \
--jira-token secret \
--github-token TOKEN \
--url http://my-jira-instance.com \
--epic ASD-27 \
--issue-type Story \
--repository johndoe/awesomeproject \
-l 'Area/API' -l 'Tech/Go' \
--summary 'Refactor {{.function}} to inject the configuration service' \
--issue-template ./refactor-config.tmpl \
--footer-template ./github-footer.tmpl
`,
Args: cobra.NoArgs,
Run: initCmdF,
}
cmd.Flags().String("jira-username", "", "the jira username")
cmd.Flags().String("jira-token", "", "the jira token or password")
cmd.Flags().String("github-token", "", "the github token")
cmd.Flags().StringP("url", "u", "", "the jira server URL")
cmd.Flags().StringP("epic", "e", "", "the epic id to associate this campaign with")
cmd.Flags().StringP("repository", "r", "", "the github repository")
cmd.Flags().StringSliceP("label", "l", []string{}, "the labels to add to the Github issues")
cmd.Flags().StringP("summary", "s", "", "the summary of the tickets")
cmd.Flags().StringP("issue-template", "t", "", "the template path for the description of the tickets")
cmd.Flags().StringP("footer-template", "f", "", "the template path to append to the github issues as a footer")
cmd.Flags().StringP("issue-type", "i", "Story", "the issue type to create the tickets as")
return cmd
}
func initCmdF(cmd *cobra.Command, _ []string) {
campaignPath, _ := cmd.Flags().GetString("campaign")
_, err := os.Stat(campaignPath)
if err == nil {
ErrorAndExit(cmd, fmt.Errorf("cannot use %s as campaign file: file already exists", campaignPath))
} else if !os.IsNotExist(err) {
ErrorAndExit(cmd, fmt.Errorf("cannot use %s as campaign file: %w", campaignPath, err))
}
getStringFlagOrAskIfEmpty := func(name string, question string) string {
val, _ := cmd.Flags().GetString(name)
if val == "" {
reader := bufio.NewReader(os.Stdin)
fmt.Printf("%s ", question)
answer, err := reader.ReadString('\n')
if err != nil {
ErrorAndExit(cmd, err)
}
val = strings.TrimSpace(answer)
}
return val
}
jiraUsername := getStringFlagOrAskIfEmpty("jira-username", "JIRA username:")
jiraToken := getStringFlagOrAskIfEmpty("jira-token", "JIRA password or token:")
githubToken := getStringFlagOrAskIfEmpty("github-token", "GitHub token:")
url := getStringFlagOrAskIfEmpty("url", "JIRA server URL:")
epic := getStringFlagOrAskIfEmpty("epic", "JIRA epic:")
repo := getStringFlagOrAskIfEmpty("repository", "GitHub repository:")
summary := getStringFlagOrAskIfEmpty("summary", "Ticket summary template:")
issueTemplate := getStringFlagOrAskIfEmpty("issue-template", "Ticket description template path:")
footerTemplate := getStringFlagOrAskIfEmpty("footer-template", "Github issue footer template path:")
issueType, _ := cmd.Flags().GetString("issue-type")
labels, _ := cmd.Flags().GetStringSlice("label")
project := strings.Split(epic, "-")[0]
campaign := &model.Campaign{
Jira: model.ConfigJira{
Url: url,
Username: jiraUsername,
Token: jiraToken,
Project: project,
Epic: epic,
IssueType: issueType,
},
Github: model.ConfigGithub{
Token: githubToken,
Repo: repo,
Labels: labels,
},
Summary: summary,
IssueTemplate: issueTemplate,
FooterTemplate: footerTemplate,
}
if err := app.SaveCampaign(campaign, campaignPath); err != nil {
ErrorAndExit(cmd, err)
}
}