Skip to content

Commit 68a4de9

Browse files
committed
feat: add lables/milestones to issue
1 parent dee88c7 commit 68a4de9

File tree

1 file changed

+67
-22
lines changed

1 file changed

+67
-22
lines changed

main.go

+67-22
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ type issueLabel struct {
5757
Description string
5858
}
5959

60+
var noLabels = []issueLabel{{ID: 0, Name: "non-existant"}}
61+
6062
func (c gitlabClient) getIssueLabels(project *gitlab.Project) ([]issueLabel, error) {
6163
l := []issueLabel{}
6264
labels, _, err := c.gitlab.Labels.ListLabels(project.ID, &gitlab.ListLabelsOptions{})
@@ -74,6 +76,8 @@ type issueMilestone struct {
7476
Name string
7577
}
7678

79+
var noMilestone = issueMilestone{ID: 0, Name: "non-existant"}
80+
7781
func (c gitlabClient) getIssueMilestones(project *gitlab.Project) ([]issueMilestone, error) {
7882
m := []issueMilestone{}
7983
milestones, _, err := c.gitlab.Milestones.ListMilestones(project.ID, &gitlab.ListMilestonesOptions{State: gitlab.String("active")})
@@ -127,10 +131,10 @@ func (c gitlabClient) getIssueTemplates(project *gitlab.Project) ([]issueTemplat
127131
},
128132
}
129133
localIssueTemplates, err := getLocalIssueTemplates()
130-
issueTemplates = append(issueTemplates, localIssueTemplates...)
131134
if err != nil {
132135
return issueTemplates, fmt.Errorf("could not get local issue templates: %w", err)
133136
}
137+
issueTemplates = append(issueTemplates, localIssueTemplates...)
134138
nodes, _, err := c.gitlab.Repositories.ListTree(
135139
project.ID,
136140
&gitlab.ListTreeOptions{
@@ -244,6 +248,21 @@ func (c gitlabClient) createIssueFromTemplate(repository *git.Repository, projec
244248
return issue, err
245249
}
246250

251+
func (c gitlabClient) setIssueLabelsMilestones(project *gitlab.Project, issue *gitlab.Issue, labels []issueLabel, milestone issueMilestone) error {
252+
var labelNames []string
253+
for _, l := range labels {
254+
if l.ID != 0 {
255+
labelNames = append(labelNames, l.Name)
256+
}
257+
}
258+
options := &gitlab.UpdateIssueOptions{AddLabels: labelNames}
259+
if milestone.ID != 0 {
260+
options.MilestoneID = gitlab.Int(milestone.ID)
261+
}
262+
_, _, err := c.gitlab.Issues.UpdateIssue(project.ID, issue.IID, options)
263+
return err
264+
}
265+
247266
func main() {
248267
currentFullPath, err := filepath.Abs(".")
249268
if err != nil {
@@ -296,30 +315,56 @@ func main() {
296315
log.Fatalf("Failed to select template: %s", err)
297316
}
298317
log.Printf("Selected template: %s", templates[idx].Name)
299-
// labels, err := client.getIssueLabels(project)
300-
// if err != nil {
301-
// log.Printf("Failed to get issue labels for project: %s", err)
302-
// }
303-
// if len(labels) == 0 {
304-
// log.Println("No issue labels present")
305-
// }
306-
// for _, label := range labels {
307-
// log.Printf("Issue Label: [%s]: %s", label.Name, label.Description)
308-
// }
309-
// milestones, err := client.getIssueMilestones(project)
310-
// if err != nil {
311-
// log.Printf("Failed to get issue milestones for project: %s", err)
312-
// }
313-
// if len(milestones) == 0 {
314-
// log.Println("No issue milestones present")
315-
// }
316-
// for _, milestone := range milestones {
317-
// log.Printf("Issue Milestone: [%s]", milestone.Name)
318-
// }
318+
labels, err := client.getIssueLabels(project)
319+
if err != nil {
320+
log.Printf("Failed to get issue labels for project: %s", err)
321+
}
322+
if len(labels) == 0 {
323+
log.Println("No issue labels present")
324+
}
325+
326+
milestones, err := client.getIssueMilestones(project)
327+
if err != nil {
328+
log.Printf("Failed to get issue milestones for project: %s", err)
329+
}
330+
if len(milestones) == 0 {
331+
log.Println("No issue milestones present")
332+
}
333+
319334
issue, err := client.createIssueFromTemplate(repo, project, templates[idx])
320335
if err != nil {
321336
log.Fatalf("could not create issue: %s", err)
322337
}
323338
log.Printf("created: %s", issue.WebURL)
324-
// TODO: get labels and milestone from issue, prompt to add/set
339+
selectedMilestone := noMilestone
340+
if len(milestones) > 0 {
341+
milestoneIdx, _ := fuzzyfinder.Find(
342+
milestones,
343+
func(i int) string {
344+
return milestones[i].Name
345+
},
346+
)
347+
selectedMilestone = milestones[milestoneIdx]
348+
}
349+
selectedLabels := noLabels
350+
if len(labels) > 0 {
351+
labelIdxs, err := fuzzyfinder.FindMulti(
352+
labels,
353+
func(i int) string {
354+
return fmt.Sprintf("%s: %s", labels[i].Name, labels[i].Description)
355+
},
356+
)
357+
selectedLabels = []issueLabel{}
358+
if err != nil {
359+
selectedLabels = noLabels
360+
}
361+
for _, idx := range labelIdxs {
362+
selectedLabels = append(selectedLabels, labels[idx])
363+
}
364+
}
365+
366+
err = client.setIssueLabelsMilestones(project, issue, selectedLabels, selectedMilestone)
367+
if err != nil {
368+
log.Fatalf("could not add labels/milestones to issue: %s", err)
369+
}
325370
}

0 commit comments

Comments
 (0)