Add interactive mode for tea milestone create
#310
|
@ -4,3 +4,5 @@ tea
|
|||
.idea/
|
||||
.history/
|
||||
dist/
|
||||
|
||||
.vscode/
|
||||
|
|
|
@ -5,13 +5,15 @@
|
|||
package milestones
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"code.gitea.io/tea/cmd/flags"
|
||||
"code.gitea.io/tea/modules/context"
|
||||
"code.gitea.io/tea/modules/print"
|
||||
"code.gitea.io/tea/modules/interact"
|
||||
"code.gitea.io/tea/modules/task"
|
||||
|
||||
"code.gitea.io/sdk/gitea"
|
||||
"github.com/araddon/dateparse"
|
||||
"github.com/urfave/cli/v2"
|
||||
)
|
||||
|
||||
|
@ -33,6 +35,11 @@ var CmdMilestonesCreate = cli.Command{
|
|||
Aliases: []string{"d"},
|
||||
Usage: "milestone description to create",
|
||||
},
|
||||
&cli.StringFlag{
|
||||
Name: "deadline",
|
||||
Aliases: []string{"expires", "x"},
|
||||
Usage: "set milestone deadline (default is no due date)",
|
||||
},
|
||||
&cli.StringFlag{
|
||||
Name: "state",
|
||||
Usage: "set milestone state (default is open)",
|
||||
|
@ -43,12 +50,15 @@ var CmdMilestonesCreate = cli.Command{
|
|||
|
||||
func runMilestonesCreate(cmd *cli.Context) error {
|
||||
ctx := context.InitCommand(cmd)
|
||||
ctx.Ensure(context.CtxRequirement{RemoteRepo: true})
|
||||
YakoYakoYokuYoku marked this conversation as resolved
Outdated
|
||||
|
||||
title := ctx.String("title")
|
||||
if len(title) == 0 {
|
||||
fmt.Printf("Title is required\n")
|
||||
return nil
|
||||
date := ctx.String("deadline")
|
||||
deadline := &time.Time{}
|
||||
if date != "" {
|
||||
t, err := dateparse.ParseAny(date)
|
||||
if err == nil {
|
||||
return err
|
||||
}
|
||||
deadline = &t
|
||||
}
|
||||
|
||||
state := gitea.StateOpen
|
||||
|
@ -56,15 +66,17 @@ func runMilestonesCreate(cmd *cli.Context) error {
|
|||
state = gitea.StateClosed
|
||||
}
|
||||
|
||||
mile, _, err := ctx.Login.Client().CreateMilestone(ctx.Owner, ctx.Repo, gitea.CreateMilestoneOption{
|
||||
Title: title,
|
||||
Description: ctx.String("description"),
|
||||
State: state,
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
if ctx.NumFlags() == 0 {
|
||||
YakoYakoYokuYoku marked this conversation as resolved
Outdated
6543
commented
```diff
- return interact.CreateMilestone(ctx.Login, ctx.Owner, ctx.Repo, deadline, state)
+ return interact.CreateMilestone(ctx.Login, ctx.Owner, ctx.Repo)
```
|
||||
return interact.CreateMilestone(ctx.Login, ctx.Owner, ctx.Repo)
|
||||
}
|
||||
|
||||
print.MilestoneDetails(mile)
|
||||
return nil
|
||||
return task.CreateMilestone(
|
||||
ctx.Login,
|
||||
ctx.Owner,
|
||||
ctx.Repo,
|
||||
ctx.String("title"),
|
||||
ctx.String("description"),
|
||||
deadline,
|
||||
state,
|
||||
)
|
||||
}
|
||||
|
|
|
@ -11,7 +11,7 @@ import (
|
|||
"github.com/AlecAivazis/survey/v2"
|
||||
)
|
||||
|
||||
// CreateIssue interactively creates a PR
|
||||
// CreateIssue interactively creates an issue
|
||||
func CreateIssue(login *config.Login, owner, repo string) error {
|
||||
var title, description string
|
||||
|
||||
|
|
|
@ -0,0 +1,77 @@
|
|||
// Copyright 2020 The Gitea Authors. All rights reserved.
|
||||
// Use of this source code is governed by a MIT-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package interact
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"code.gitea.io/tea/modules/config"
|
||||
"code.gitea.io/tea/modules/task"
|
||||
|
||||
"code.gitea.io/sdk/gitea"
|
||||
"github.com/AlecAivazis/survey/v2"
|
||||
"github.com/araddon/dateparse"
|
||||
)
|
||||
|
||||
// CreateMilestone interactively creates a milestone
|
||||
YakoYakoYokuYoku marked this conversation as resolved
Outdated
noerw
commented
No need for the deadline & state params: They will never be set anyway No need for the deadline & state params: They will never be set anyway
6543
commented
didn't he add a flag for this? didn't he add a flag for this?
noerw
commented
Yeah, but interactive mode won't be enabled if there is a flag set.. Yeah, but interactive mode won't be enabled if there is a flag set..
We could ofcourse change the condition to go into interactive mode, if not all mandatory flags are provided, but idk if that's better
6543
commented
no interactive should only if no flags are pressent - how would you integrate tea into scripts if it would ask you the whole time ... no interactive should only if no flags are pressent - how would you integrate tea into scripts if it would ask you the whole time ...
6543
commented
```diff
-func CreateMilestone(login *config.Login, owner, repo string, deadline *time.Time, state gitea.StateType) error {
+func CreateMilestone(login *config.Login, owner, repo string) error {
```
|
||||
func CreateMilestone(login *config.Login, owner, repo string) error {
|
||||
YakoYakoYokuYoku marked this conversation as resolved
Outdated
6543
commented
```diff
- var title, description, dueDate string
+ var title, description, dueDate string
+ var deadline *time.Time
```
|
||||
var title, description, dueDate string
|
||||
var deadline *time.Time
|
||||
|
||||
// owner, repo
|
||||
owner, repo, err := promptRepoSlug(owner, repo)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// title
|
||||
promptOpts := survey.WithValidator(survey.Required)
|
||||
promptI := &survey.Input{Message: "Milestone title:"}
|
||||
if err := survey.AskOne(promptI, &title, promptOpts); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// description
|
||||
promptM := &survey.Multiline{Message: "Milestone description:"}
|
||||
if err := survey.AskOne(promptM, &description); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
YakoYakoYokuYoku marked this conversation as resolved
Outdated
noerw
commented
I'd put the date parsing inside a I'd put the date parsing inside a `survey.Validator` similar to `promptRepoSlug()`. This lets users iterate on wrong inputs, instead of failing the entire command
YakoYakoYokuYoku
commented
Gotcha, thx for pointing that out ? Gotcha, thx for pointing that out ?
|
||||
// deadline
|
||||
promptI = &survey.Input{Message: "Milestone deadline [no due date]:"}
|
||||
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
|
||||
}),
|
||||
YakoYakoYokuYoku marked this conversation as resolved
Outdated
6543
commented
```diff
- state)
+ gitea.StateOpen)
```
|
||||
)
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return task.CreateMilestone(
|
||||
login,
|
||||
owner,
|
||||
repo,
|
||||
title,
|
||||
description,
|
||||
deadline,
|
||||
gitea.StateOpen)
|
||||
}
|
|
@ -12,7 +12,7 @@ import (
|
|||
"code.gitea.io/tea/modules/print"
|
||||
)
|
||||
|
||||
// CreateIssue creates a PR in the given repo and prints the result
|
||||
// CreateIssue creates an issue in the given repo and prints the result
|
||||
func CreateIssue(login *config.Login, repoOwner, repoName, title, description string) error {
|
||||
|
||||
// title is required
|
||||
|
|
|
@ -0,0 +1,37 @@
|
|||
// Copyright 2020 The Gitea Authors. All rights reserved.
|
||||
// Use of this source code is governed by a MIT-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package task
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"code.gitea.io/tea/modules/config"
|
||||
"code.gitea.io/tea/modules/print"
|
||||
|
||||
"code.gitea.io/sdk/gitea"
|
||||
)
|
||||
|
||||
// CreateMilestone creates a milestone in the given repo and prints the result
|
||||
func CreateMilestone(login *config.Login, repoOwner, repoName, title, description string, deadline *time.Time, state gitea.StateType) error {
|
||||
|
||||
// title is required
|
||||
if len(title) == 0 {
|
||||
YakoYakoYokuYoku marked this conversation as resolved
Outdated
noerw
commented
`return fmt.Errorf("Title is required")`
|
||||
return fmt.Errorf("Title is required")
|
||||
}
|
||||
|
||||
mile, _, err := login.Client().CreateMilestone(repoOwner, repoName, gitea.CreateMilestoneOption{
|
||||
Title: title,
|
||||
Description: description,
|
||||
Deadline: deadline,
|
||||
State: state,
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
print.MilestoneDetails(mile)
|
||||
return nil
|
||||
}
|
Loading…
Reference in New Issue
Block a user
isn't
ctx.Ensure(context.CtxRequirement{RemoteRepo: true})
still needed?cc @noerw
It is.