From 43e9943757fa8a94f0d4fabe49ca5c776dacf47c Mon Sep 17 00:00:00 2001 From: Martin Reboredo Date: Fri, 18 Dec 2020 02:50:07 +0800 Subject: [PATCH] Add interactive mode for `tea milestone create` (#310) Implement interactive milestone creation Return fmt.Errorf when title is empty Incorporate deadline functionality Use dateparse and cleanup CreateMilestone task Signed-off-by: Martin Reboredo Co-authored-by: Martin Reboredo Reviewed-on: https://gitea.com/gitea/tea/pulls/310 Reviewed-by: Norwin Reviewed-by: 6543 <6543@obermui.de> Co-Authored-By: Martin Reboredo Co-Committed-By: Martin Reboredo --- .gitignore | 2 + cmd/milestones/create.go | 44 ++++++++++------ modules/interact/issue_create.go | 2 +- modules/interact/milestone_create.go | 77 ++++++++++++++++++++++++++++ modules/task/issue_create.go | 2 +- modules/task/milestone_create.go | 37 +++++++++++++ 6 files changed, 146 insertions(+), 18 deletions(-) create mode 100644 modules/interact/milestone_create.go create mode 100644 modules/task/milestone_create.go diff --git a/.gitignore b/.gitignore index 81ca9b7..1c1cab1 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,5 @@ tea .idea/ .history/ dist/ + +.vscode/ diff --git a/cmd/milestones/create.go b/cmd/milestones/create.go index 7d8c89d..0a3001b 100644 --- a/cmd/milestones/create.go +++ b/cmd/milestones/create.go @@ -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}) - 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 { + 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, + ) } diff --git a/modules/interact/issue_create.go b/modules/interact/issue_create.go index 6eca95b..55b93d5 100644 --- a/modules/interact/issue_create.go +++ b/modules/interact/issue_create.go @@ -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 diff --git a/modules/interact/milestone_create.go b/modules/interact/milestone_create.go new file mode 100644 index 0000000..984fedb --- /dev/null +++ b/modules/interact/milestone_create.go @@ -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 +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) + 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 + } + + // 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 + }), + ) + + if err != nil { + return err + } + + return task.CreateMilestone( + login, + owner, + repo, + title, + description, + deadline, + gitea.StateOpen) +} diff --git a/modules/task/issue_create.go b/modules/task/issue_create.go index 5a260cf..792dd69 100644 --- a/modules/task/issue_create.go +++ b/modules/task/issue_create.go @@ -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 diff --git a/modules/task/milestone_create.go b/modules/task/milestone_create.go new file mode 100644 index 0000000..de807c9 --- /dev/null +++ b/modules/task/milestone_create.go @@ -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 { + 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 +}