add more issue / pr creation params #331

Merged
6543 merged 18 commits from noerw/tea:issue-create-opts into master 2021-03-08 11:48:04 +00:00
Showing only changes of commit c91bd04eb9 - Show all commits

View File

@ -12,17 +12,20 @@ import (
"code.gitea.io/sdk/gitea"
"code.gitea.io/tea/modules/config"
"code.gitea.io/tea/modules/task"
"code.gitea.io/tea/modules/utils"
"github.com/AlecAivazis/survey/v2"
"github.com/araddon/dateparse"
)
const nilVal = "[none]"
const customVal = "[other]"
// CreateIssue interactively creates an issue
func CreateIssue(login *config.Login, owner, repo string) error {
var title, description, dueDate, assignees, milestone, labels string
var title, description, dueDate, milestone string
var assignees, labels []string
var deadline *time.Time
var msID int64
var labelIDs []int64
// owner, repo
owner, repo, err := promptRepoSlug(owner, repo)
@ -30,6 +33,9 @@ func CreateIssue(login *config.Login, owner, repo string) error {
return err
}
selectableChan := make(chan (issueSelectables), 1)
go fetchIssueSelectables(login, owner, repo, selectableChan)
// title
promptOpts := survey.WithValidator(survey.Required)
promptI := &survey.Input{Message: "Issue title:"}
@ -43,23 +49,43 @@ func CreateIssue(login *config.Login, owner, repo string) error {
return err
}
// assignees // TODO: add suggestions
promptA := &survey.Input{Message: "Assignees:"}
// wait until selectables are fetched
selectables := <-selectableChan
if selectables.Err != nil {
return selectables.Err
}
// assignees
promptA := &survey.MultiSelect{Message: "Assignees:", Options: selectables.Collaborators, VimMode: true}
if err := survey.AskOne(promptA, &assignees); err != nil {
return err
}
// check for custom value & prompt again with text input
// HACK until https://github.com/AlecAivazis/survey/issues/339 is implemented
if utils.Contains(assignees, customVal) {
var customAssignees string
promptA := &survey.Input{Message: "Assignees:", Help: "comma separated usernames"}
if err := survey.AskOne(promptA, &customAssignees); err != nil {
return err
}
assignees = append(assignees, strings.Split(customAssignees, ",")...)
}
// milestone // TODO: add suggestions
promptM := &survey.Input{Message: "Milestone:"}
// milestone
promptM := &survey.Select{Message: "Milestone:", Options: selectables.MilestoneList, VimMode: true, Default: nilVal}
if err := survey.AskOne(promptM, &milestone); err != nil {
return err
}
// labels // TODO: add suggestions
promptL := &survey.Input{Message: "Labels:"}
// labels
promptL := &survey.MultiSelect{Message: "Labels:", Options: selectables.LabelList, VimMode: true}
if err := survey.AskOne(promptL, &labels); err != nil {
return err
}
labelIDs := make([]int64, len(labels))
for i, l := range labels {
labelIDs[i] = selectables.LabelMap[l]
}
// deadline
promptI = &survey.Input{Message: "Due date [no due date]:"}
@ -83,22 +109,6 @@ func CreateIssue(login *config.Login, owner, repo string) error {
}),
)
// resolve IDs
client := login.Client()
if len(milestone) != 0 {
ms, _, err := client.GetMilestoneByName(owner, repo, milestone)
if err != nil {
return fmt.Errorf("Milestone '%s' not found", milestone)
}
msID = ms.ID
}
if len(labels) != 0 {
labelIDs, err = task.ResolveLabelNames(client, owner, repo, strings.Split(labels, ","))
if err != nil {
return err
}
}
return task.CreateIssue(
login,
owner,
@ -107,9 +117,68 @@ func CreateIssue(login *config.Login, owner, repo string) error {
Title: title,
Body: description,
Deadline: deadline,
Assignees: strings.Split(assignees, ","),
Milestone: msID,
Assignees: assignees,
Milestone: selectables.MilestoneMap[milestone],
Labels: labelIDs,
},
)
}
type issueSelectables struct {
Collaborators []string
MilestoneList []string
MilestoneMap map[string]int64
LabelList []string
LabelMap map[string]int64
Err error
}
func fetchIssueSelectables(login *config.Login, owner, repo string, done chan issueSelectables) {
// TODO PERF make these calls concurrent
r := issueSelectables{}
c := login.Client()
// FIXME: this should ideally be ListAssignees(), https://github.com/go-gitea/gitea/issues/14856
colabs, _, err := c.ListCollaborators(owner, repo, gitea.ListCollaboratorsOptions{})
if err != nil {
r.Err = err
done <- r
return
}
r.Collaborators = make([]string, len(colabs)+2)
r.Collaborators[0] = login.User
r.Collaborators[1] = customVal
for i, u := range colabs {
r.Collaborators[i+2] = u.UserName
}
milestones, _, err := c.ListRepoMilestones(owner, repo, gitea.ListMilestoneOption{})
if err != nil {
r.Err = err
done <- r
return
}
r.MilestoneMap = make(map[string]int64)
r.MilestoneList = make([]string, len(milestones)+1)
r.MilestoneList[0] = nilVal
r.MilestoneMap[nilVal] = 0
for i, m := range milestones {
r.MilestoneMap[m.Title] = m.ID
r.MilestoneList[i+1] = m.Title
}
labels, _, err := c.ListRepoLabels(owner, repo, gitea.ListLabelsOptions{})
if err != nil {
r.Err = err
done <- r
return
}
r.LabelMap = make(map[string]int64)
r.LabelList = make([]string, len(labels))
for i, l := range labels {
r.LabelMap[l.Name] = l.ID
r.LabelList[i] = l.Name
}
done <- r
}