Add interactive mode for tea milestone create
#310
@ -11,9 +11,9 @@ import (
|
|||||||
"code.gitea.io/tea/modules/context"
|
"code.gitea.io/tea/modules/context"
|
||||||
"code.gitea.io/tea/modules/interact"
|
"code.gitea.io/tea/modules/interact"
|
||||||
"code.gitea.io/tea/modules/task"
|
"code.gitea.io/tea/modules/task"
|
||||||
"code.gitea.io/tea/modules/utils"
|
|
||||||
|
|
||||||
"code.gitea.io/sdk/gitea"
|
"code.gitea.io/sdk/gitea"
|
||||||
|
"github.com/araddon/dateparse"
|
||||||
"github.com/urfave/cli/v2"
|
"github.com/urfave/cli/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -36,8 +36,9 @@ var CmdMilestonesCreate = cli.Command{
|
|||||||
Usage: "milestone description to create",
|
Usage: "milestone description to create",
|
||||||
},
|
},
|
||||||
&cli.StringFlag{
|
&cli.StringFlag{
|
||||||
Name: "deadline",
|
Name: "deadline",
|
||||||
Usage: "set milestone deadline (default is no due date)",
|
Aliases: []string{"expires", "x"},
|
||||||
|
Usage: "set milestone deadline (default is no due date)",
|
||||||
},
|
},
|
||||||
&cli.StringFlag{
|
&cli.StringFlag{
|
||||||
Name: "state",
|
Name: "state",
|
||||||
@ -53,11 +54,11 @@ func runMilestonesCreate(cmd *cli.Context) error {
|
|||||||
date := ctx.String("deadline")
|
date := ctx.String("deadline")
|
||||||
deadline := &time.Time{}
|
deadline := &time.Time{}
|
||||||
if date != "" {
|
if date != "" {
|
||||||
t, err := utils.GetIso8601Date(date)
|
t, err := dateparse.ParseAny(date)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
deadline = t
|
deadline = &t
|
||||||
}
|
}
|
||||||
|
|
||||||
state := gitea.StateOpen
|
state := gitea.StateOpen
|
||||||
@ -66,7 +67,7 @@ func runMilestonesCreate(cmd *cli.Context) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ctx.NumFlags() == 0 {
|
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(
|
return task.CreateMilestone(
|
||||||
|
@ -5,19 +5,21 @@
|
|||||||
package interact
|
package interact
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"code.gitea.io/tea/modules/config"
|
"code.gitea.io/tea/modules/config"
|
||||||
"code.gitea.io/tea/modules/task"
|
"code.gitea.io/tea/modules/task"
|
||||||
"code.gitea.io/tea/modules/utils"
|
|
||||||
|
|
||||||
"code.gitea.io/sdk/gitea"
|
"code.gitea.io/sdk/gitea"
|
||||||
"github.com/AlecAivazis/survey/v2"
|
"github.com/AlecAivazis/survey/v2"
|
||||||
|
"github.com/araddon/dateparse"
|
||||||
)
|
)
|
||||||
|
|
||||||
// CreateMilestone interactively creates a milestone
|
// 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 title, description, dueDate string
|
||||||
|
var deadline *time.Time
|
||||||
|
|
||||||
// owner, repo
|
// owner, repo
|
||||||
owner, repo, err := promptRepoSlug(owner, repo)
|
owner, repo, err := promptRepoSlug(owner, repo)
|
||||||
@ -40,17 +42,29 @@ func CreateMilestone(login *config.Login, owner, repo string, deadline *time.Tim
|
|||||||
|
|
||||||
// deadline
|
// deadline
|
||||||
promptI = &survey.Input{Message: "Milestone deadline [no due date]:"}
|
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
|
return err
|
||||||
}
|
}
|
||||||
if dueDate != "" {
|
|
||||||
deadline, err = utils.GetIso8601Date(dueDate)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
deadline = nil
|
|
||||||
}
|
|
||||||
|
|
||||||
return task.CreateMilestone(
|
return task.CreateMilestone(
|
||||||
login,
|
login,
|
||||||
@ -59,5 +73,5 @@ func CreateMilestone(login *config.Login, owner, repo string, deadline *time.Tim
|
|||||||
title,
|
title,
|
||||||
description,
|
description,
|
||||||
deadline,
|
deadline,
|
||||||
state)
|
gitea.StateOpen)
|
||||||
}
|
}
|
||||||
|
@ -8,7 +8,6 @@ import (
|
|||||||
"net/url"
|
"net/url"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// ArgToIndex take issue/pull index as string and return int64
|
// ArgToIndex take issue/pull index as string and return int64
|
||||||
@ -40,16 +39,3 @@ func GetOwnerAndRepo(repoPath, user string) (string, string) {
|
|||||||
}
|
}
|
||||||
return user, repoPath
|
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
|
|
||||||
}
|
|
||||||
|
Loading…
Reference in New Issue
Block a user