@@ -57,6 +57,8 @@ type issueLabel struct {
57
57
Description string
58
58
}
59
59
60
+ var noLabels = []issueLabel {{ID : 0 , Name : "non-existant" }}
61
+
60
62
func (c gitlabClient ) getIssueLabels (project * gitlab.Project ) ([]issueLabel , error ) {
61
63
l := []issueLabel {}
62
64
labels , _ , err := c .gitlab .Labels .ListLabels (project .ID , & gitlab.ListLabelsOptions {})
@@ -74,6 +76,8 @@ type issueMilestone struct {
74
76
Name string
75
77
}
76
78
79
+ var noMilestone = issueMilestone {ID : 0 , Name : "non-existant" }
80
+
77
81
func (c gitlabClient ) getIssueMilestones (project * gitlab.Project ) ([]issueMilestone , error ) {
78
82
m := []issueMilestone {}
79
83
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
127
131
},
128
132
}
129
133
localIssueTemplates , err := getLocalIssueTemplates ()
130
- issueTemplates = append (issueTemplates , localIssueTemplates ... )
131
134
if err != nil {
132
135
return issueTemplates , fmt .Errorf ("could not get local issue templates: %w" , err )
133
136
}
137
+ issueTemplates = append (issueTemplates , localIssueTemplates ... )
134
138
nodes , _ , err := c .gitlab .Repositories .ListTree (
135
139
project .ID ,
136
140
& gitlab.ListTreeOptions {
@@ -244,6 +248,21 @@ func (c gitlabClient) createIssueFromTemplate(repository *git.Repository, projec
244
248
return issue , err
245
249
}
246
250
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
+
247
266
func main () {
248
267
currentFullPath , err := filepath .Abs ("." )
249
268
if err != nil {
@@ -296,30 +315,56 @@ func main() {
296
315
log .Fatalf ("Failed to select template: %s" , err )
297
316
}
298
317
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
+
319
334
issue , err := client .createIssueFromTemplate (repo , project , templates [idx ])
320
335
if err != nil {
321
336
log .Fatalf ("could not create issue: %s" , err )
322
337
}
323
338
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
+ }
325
370
}
0 commit comments