@@ -2,8 +2,9 @@ package api
22
33import (
44 "context"
5+ "encoding/base64"
56 "fmt"
6- "strconv "
7+ "strings "
78 "time"
89
910 "github.com/cli/cli/internal/ghrepo"
@@ -249,13 +250,19 @@ func IssueList(client *Client, repo ghrepo.Interface, state string, labels []str
249250 }
250251
251252 if milestoneString != "" {
252- milestones , err := RepoMilestonesREST (client , repo )
253+ milestones , err := RepoMilestones (client , repo )
253254 if err != nil {
254255 return nil , err
255256 }
257+
256258 for i := range milestones {
257- if milestones [i ].Title == milestoneString {
258- variables ["milestone" ] = strconv .Itoa (milestones [i ].ID )
259+ if strings .EqualFold (milestones [i ].Title , milestoneString ) {
260+ // The query for milestones requires the use of the milestone's database ID (see #1441)
261+ id , err := milestoneNodeIdToDatabaseId (milestones [i ].ID )
262+ if err != nil {
263+ return nil , err
264+ }
265+ variables ["milestone" ] = id
259266 break
260267 }
261268 }
@@ -430,3 +437,20 @@ func IssueReopen(client *Client, repo ghrepo.Interface, issue Issue) error {
430437
431438 return err
432439}
440+
441+ // milestoneNodeIdToDatabaseId extracts the REST Database ID from the GraphQL Node ID
442+ func milestoneNodeIdToDatabaseId (id string ) (string , error ) {
443+ // The node id is base64 obfuscated
444+ decoded , err := base64 .StdEncoding .DecodeString (id )
445+ if err != nil {
446+ return "" , err
447+ }
448+
449+ // The decoded node ID has a pattern like '09:Milestone12345'
450+ splitted := strings .Split (string (decoded ), "Milestone" )
451+ if len (splitted ) != 2 {
452+ return "" , fmt .Errorf ("couldn't get database id from node id" )
453+ }
454+
455+ return splitted [1 ], nil
456+ }
0 commit comments