Add interactive mode for tea milestone create #310

Merged
6543 merged 4 commits from YakoYakoYokuYoku/tea:interactive-ms into master 2020-12-17 18:50:08 +00:00
3 changed files with 33 additions and 32 deletions
Showing only changes of commit 2be9a124f2 - Show all commits

View File

@ -11,9 +11,9 @@ import (
"code.gitea.io/tea/modules/context"
"code.gitea.io/tea/modules/interact"
"code.gitea.io/tea/modules/task"
"code.gitea.io/tea/modules/utils"
"code.gitea.io/sdk/gitea"
"github.com/araddon/dateparse"
"github.com/urfave/cli/v2"
)
@ -36,8 +36,9 @@ var CmdMilestonesCreate = cli.Command{
Usage: "milestone description to create",
},
&cli.StringFlag{
Name: "deadline",
Usage: "set milestone deadline (default is no due date)",
Name: "deadline",
Aliases: []string{"expires", "x"},
Usage: "set milestone deadline (default is no due date)",
},
&cli.StringFlag{
Name: "state",
@ -53,11 +54,11 @@ func runMilestonesCreate(cmd *cli.Context) error {
date := ctx.String("deadline")
deadline := &time.Time{}
if date != "" {
t, err := utils.GetIso8601Date(date)
t, err := dateparse.ParseAny(date)
if err == nil {
return err
}
deadline = t
deadline = &t
}
state := gitea.StateOpen
@ -66,7 +67,7 @@ func runMilestonesCreate(cmd *cli.Context) error {
}
if ctx.NumFlags() == 0 {
return interact.CreateMilestone(ctx.Login, ctx.Owner, ctx.Repo, deadline, state)
return interact.CreateMilestone(ctx.Login, ctx.Owner, ctx.Repo)
}
return task.CreateMilestone(

View File

@ -5,19 +5,21 @@
package interact
import (
"fmt"
"time"
"code.gitea.io/tea/modules/config"
"code.gitea.io/tea/modules/task"
"code.gitea.io/tea/modules/utils"
"code.gitea.io/sdk/gitea"
"github.com/AlecAivazis/survey/v2"
"github.com/araddon/dateparse"
)
// CreateMilestone interactively creates a milestone
func CreateMilestone(login *config.Login, owner, repo string, deadline *time.Time, state gitea.StateType) error {
func CreateMilestone(login *config.Login, owner, repo string) error {
var title, description, dueDate string
var deadline *time.Time
// owner, repo
owner, repo, err := promptRepoSlug(owner, repo)
@ -40,17 +42,29 @@ func CreateMilestone(login *config.Login, owner, repo string, deadline *time.Tim
// deadline
promptI = &survey.Input{Message: "Milestone deadline [no due date]:"}
if err := survey.AskOne(promptI, &dueDate, nil); err != nil {
err = survey.AskOne(
promptI,
&dueDate,
survey.WithValidator(func(input interface{}) error {
if str, ok := input.(string); ok {
if len(str) == 0 {
return nil
}
t, err := dateparse.ParseAny(str)
if err != nil {
return err
}
deadline = &t
} else {
return fmt.Errorf("invalid result type")
}
return nil
}),
)
if err != nil {
return err
}
if dueDate != "" {
deadline, err = utils.GetIso8601Date(dueDate)
if err != nil {
return err
}
} else {
deadline = nil
}
return task.CreateMilestone(
login,
@ -59,5 +73,5 @@ func CreateMilestone(login *config.Login, owner, repo string, deadline *time.Tim
title,
description,
deadline,
state)
gitea.StateOpen)
}

View File

@ -8,7 +8,6 @@ import (
"net/url"
"strconv"
"strings"
"time"
)
// ArgToIndex take issue/pull index as string and return int64
@ -40,16 +39,3 @@ func GetOwnerAndRepo(repoPath, user string) (string, string) {
}
return user, repoPath
}
// GetIso8601Date parses a date from a string
func GetIso8601Date(date string) (*time.Time, error) {
t, err := time.Parse("2006-01-02", date)
if err != nil {
t, err := time.Parse(time.RFC3339, date)
if err != nil {
return nil, err
}
return &t, nil
}
return &t, nil
}