Adds label command and subcommands
This commit is contained in:
parent
52606629fb
commit
15b4cb6641
4 changed files with 188 additions and 4 deletions
|
@ -154,3 +154,45 @@ func (a *App) GithubSync() error {
|
||||||
|
|
||||||
return a.Save()
|
return a.Save()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (a *App) ListLabels() ([]string, error) {
|
||||||
|
owner, repo := a.Campaign.RepoComponents()
|
||||||
|
opts := &github.ListOptions{Page: 0, PerPage: 100}
|
||||||
|
labels, _, err := a.GithubClient.Issues.ListLabels(context.Background(), owner, repo, opts)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
strLabels := make([]string, len(labels))
|
||||||
|
for i, label := range labels {
|
||||||
|
strLabels[i] = *label.Name
|
||||||
|
}
|
||||||
|
|
||||||
|
return strLabels, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *App) CheckLabels(labels []string) (bool, []string, error) {
|
||||||
|
ghLabels, err := a.ListLabels()
|
||||||
|
if err != nil {
|
||||||
|
return false, nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
badLabels := []string{}
|
||||||
|
for _, label := range labels {
|
||||||
|
exists := false
|
||||||
|
for _, ghLabel := range ghLabels {
|
||||||
|
if label == ghLabel {
|
||||||
|
exists = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if !exists {
|
||||||
|
badLabels = append(badLabels, label)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(badLabels) == 0 {
|
||||||
|
return true, nil, nil
|
||||||
|
}
|
||||||
|
return false, badLabels, nil
|
||||||
|
}
|
||||||
|
|
141
cmd/label.go
Normal file
141
cmd/label.go
Normal file
|
@ -0,0 +1,141 @@
|
||||||
|
package cmd
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"os"
|
||||||
|
"os/exec"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/fatih/color"
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
|
||||||
|
"git.ctrlz.es/mgdelacroix/campaigner/app"
|
||||||
|
)
|
||||||
|
|
||||||
|
const defaultEditor = "vim"
|
||||||
|
|
||||||
|
func ListLabelCmd() *cobra.Command {
|
||||||
|
return &cobra.Command{
|
||||||
|
Use: "list",
|
||||||
|
Short: "List the local campaign labels",
|
||||||
|
Args: cobra.NoArgs,
|
||||||
|
Run: withApp(listLabelCmdF),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func RemoteLabelCmd() *cobra.Command {
|
||||||
|
return &cobra.Command{
|
||||||
|
Use: "remote",
|
||||||
|
Short: "List all the GitHub repository labels",
|
||||||
|
Args: cobra.NoArgs,
|
||||||
|
Run: withApp(remoteLabelCmdF),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func UpdateLabelCmd() *cobra.Command {
|
||||||
|
cmd := &cobra.Command{
|
||||||
|
Use: "update",
|
||||||
|
Short: "Updates the campaign GitHub labels",
|
||||||
|
Args: cobra.NoArgs,
|
||||||
|
Run: withApp(updateLabelCmdF),
|
||||||
|
}
|
||||||
|
|
||||||
|
cmd.Flags().BoolP("skip-check", "s", false, "do not check if the labels exist in the remote repository")
|
||||||
|
|
||||||
|
return cmd
|
||||||
|
}
|
||||||
|
|
||||||
|
func LabelCmd() *cobra.Command {
|
||||||
|
cmd := &cobra.Command{
|
||||||
|
Use: "label",
|
||||||
|
Short: "Commands to manage GitHub labels",
|
||||||
|
}
|
||||||
|
|
||||||
|
cmd.AddCommand(
|
||||||
|
ListLabelCmd(),
|
||||||
|
RemoteLabelCmd(),
|
||||||
|
UpdateLabelCmd(),
|
||||||
|
)
|
||||||
|
|
||||||
|
return cmd
|
||||||
|
}
|
||||||
|
|
||||||
|
func listLabelCmdF(a *app.App, cmd *cobra.Command, _ []string) {
|
||||||
|
for _, label := range a.Campaign.Github.Labels {
|
||||||
|
fmt.Println(label)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func remoteLabelCmdF(a *app.App, cmd *cobra.Command, _ []string) {
|
||||||
|
labels, err := a.ListLabels()
|
||||||
|
if err != nil {
|
||||||
|
ErrorAndExit(cmd, fmt.Errorf("cannot retrieve labels list: %w", err))
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Printf("Labels for repository %s:\n\n", color.GreenString(a.Campaign.Github.Repo))
|
||||||
|
for _, label := range labels {
|
||||||
|
fmt.Println(label)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func updateLabelCmdF(a *app.App, cmd *cobra.Command, _ []string) {
|
||||||
|
skipCheck, _ := cmd.Flags().GetBool("skip-check")
|
||||||
|
|
||||||
|
file, err := ioutil.TempFile(os.TempDir(), "campaigner-")
|
||||||
|
if err != nil {
|
||||||
|
ErrorAndExit(cmd, fmt.Errorf("cannot create temp file: %w", err))
|
||||||
|
}
|
||||||
|
defer func() {
|
||||||
|
file.Close()
|
||||||
|
os.Remove(file.Name())
|
||||||
|
}()
|
||||||
|
labelBytes := []byte(strings.Join(a.Campaign.Github.Labels, "\n"))
|
||||||
|
if _, err := file.Write(labelBytes); err != nil {
|
||||||
|
ErrorAndExit(cmd, fmt.Errorf("cannot write labels to temp file: %w", err))
|
||||||
|
}
|
||||||
|
|
||||||
|
editor := os.Getenv("EDITOR")
|
||||||
|
if editor == "" {
|
||||||
|
editor = defaultEditor
|
||||||
|
}
|
||||||
|
|
||||||
|
editorCmd := exec.Command(editor, file.Name())
|
||||||
|
editorCmd.Stdout = cmd.OutOrStdout()
|
||||||
|
editorCmd.Stdin = cmd.InOrStdin()
|
||||||
|
editorCmd.Stderr = cmd.ErrOrStderr()
|
||||||
|
|
||||||
|
if err := editorCmd.Run(); err != nil {
|
||||||
|
ErrorAndExit(cmd, fmt.Errorf("cannot run editor command: %w", err))
|
||||||
|
}
|
||||||
|
|
||||||
|
newLabelBytes, err := ioutil.ReadFile(file.Name())
|
||||||
|
if err != nil {
|
||||||
|
ErrorAndExit(cmd, fmt.Errorf("cannot read file: %w", err))
|
||||||
|
}
|
||||||
|
|
||||||
|
newLabels := []string{}
|
||||||
|
for _, label := range strings.Split(string(newLabelBytes), "\n") {
|
||||||
|
if label != "" {
|
||||||
|
newLabels = append(newLabels, strings.TrimSpace(label))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if !skipCheck {
|
||||||
|
ok, badLabels, err := a.CheckLabels(newLabels)
|
||||||
|
if err != nil {
|
||||||
|
ErrorAndExit(cmd, fmt.Errorf("cannot check new labels list: %w", err))
|
||||||
|
}
|
||||||
|
|
||||||
|
if !ok {
|
||||||
|
ErrorAndExit(cmd, fmt.Errorf("these labels doesn't exist in the repository:\n\n%s", strings.Join(badLabels, "\n")))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
a.Campaign.Github.Labels = newLabels
|
||||||
|
if err := a.Save(); err != nil {
|
||||||
|
ErrorAndExit(cmd, fmt.Errorf("cannot save campaign: %w", err))
|
||||||
|
}
|
||||||
|
|
||||||
|
cmd.Println("Labels successfully updated")
|
||||||
|
}
|
|
@ -47,6 +47,7 @@ func RootCmd() *cobra.Command {
|
||||||
AddCmd(),
|
AddCmd(),
|
||||||
// FilterCmd(),
|
// FilterCmd(),
|
||||||
InitCmd(),
|
InitCmd(),
|
||||||
|
LabelCmd(),
|
||||||
StatusCmd(),
|
StatusCmd(),
|
||||||
PublishCmd(),
|
PublishCmd(),
|
||||||
PullCmd(),
|
PullCmd(),
|
||||||
|
|
|
@ -80,10 +80,10 @@ func (c *Campaign) PrintStatus() {
|
||||||
|
|
||||||
w := tabwriter.NewWriter(os.Stdout, 0, 0, 3, ' ', tabwriter.AlignRight)
|
w := tabwriter.NewWriter(os.Stdout, 0, 0, 3, ' ', tabwriter.AlignRight)
|
||||||
fmt.Fprintf(w, " %d\t-\ttotal tickets\t\n", totalTickets)
|
fmt.Fprintf(w, " %d\t-\ttotal tickets\t\n", totalTickets)
|
||||||
fmt.Fprintf(w, " %d\t%d%%\tpublished in Jira\t\n", totalPublishedJira, totalPublishedJira * 100 / totalTickets)
|
fmt.Fprintf(w, " %d\t%d%%\tpublished in Jira\t\n", totalPublishedJira, totalPublishedJira*100/totalTickets)
|
||||||
fmt.Fprintf(w, " %d\t%d%%\tpublished in Github\t\n", totalPublishedGithub, totalPublishedGithub * 100 / totalTickets)
|
fmt.Fprintf(w, " %d\t%d%%\tpublished in Github\t\n", totalPublishedGithub, totalPublishedGithub*100/totalTickets)
|
||||||
fmt.Fprintf(w, " %d\t%d%%\tassigned\t\n", totalAssigned, totalAssigned * 100 / totalTickets)
|
fmt.Fprintf(w, " %d\t%d%%\tassigned\t\n", totalAssigned, totalAssigned*100/totalTickets)
|
||||||
fmt.Fprintf(w, " %d\t%d%%\tclosed\t\n\n", totalClosed, totalClosed * 100 / totalTickets)
|
fmt.Fprintf(w, " %d\t%d%%\tclosed\t\n\n", totalClosed, totalClosed*100/totalTickets)
|
||||||
w.Flush()
|
w.Flush()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue