use graphql for repo milestones on issue list
Since we can obtain the necessary ID for the query on node ID from the GraphQL API, it makes sense to remove the REST version.
This commit is contained in:
parent
75e8cb8f9c
commit
9a5e69a8a4
3 changed files with 28 additions and 40 deletions
|
|
@ -2,8 +2,9 @@ package api
|
|||
|
||||
import (
|
||||
"context"
|
||||
"encoding/base64"
|
||||
"fmt"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/cli/cli/internal/ghrepo"
|
||||
|
|
@ -249,13 +250,19 @@ func IssueList(client *Client, repo ghrepo.Interface, state string, labels []str
|
|||
}
|
||||
|
||||
if milestoneString != "" {
|
||||
milestones, err := RepoMilestonesREST(client, repo)
|
||||
milestones, err := RepoMilestones(client, repo)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
for i := range milestones {
|
||||
if milestones[i].Title == milestoneString {
|
||||
variables["milestone"] = strconv.Itoa(milestones[i].ID)
|
||||
if strings.EqualFold(milestones[i].Title, milestoneString) {
|
||||
// The query for milestones requires the use of the milestone's database ID (see #1441)
|
||||
id, err := milestoneNodeIdToDatabaseId(milestones[i].ID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
variables["milestone"] = id
|
||||
break
|
||||
}
|
||||
}
|
||||
|
|
@ -430,3 +437,20 @@ func IssueReopen(client *Client, repo ghrepo.Interface, issue Issue) error {
|
|||
|
||||
return err
|
||||
}
|
||||
|
||||
// milestoneNodeIdToDatabaseId extracts the REST Database ID from the GraphQL Node ID
|
||||
func milestoneNodeIdToDatabaseId(id string) (string, error) {
|
||||
// The node id is base64 obfuscated
|
||||
decoded, err := base64.StdEncoding.DecodeString(id)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
// The decoded node ID has a pattern like '09:Milestone12345'
|
||||
splitted := strings.Split(string(decoded), "Milestone")
|
||||
if len(splitted) != 2 {
|
||||
return "", fmt.Errorf("couldn't get database id from node id")
|
||||
}
|
||||
|
||||
return splitted[1], nil
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,7 +7,6 @@ import (
|
|||
"errors"
|
||||
"fmt"
|
||||
"sort"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
|
|
@ -802,30 +801,3 @@ func RepoMilestones(client *Client, repo ghrepo.Interface) ([]RepoMilestone, err
|
|||
|
||||
return milestones, nil
|
||||
}
|
||||
|
||||
type RepoMilestoneREST struct {
|
||||
ID int
|
||||
Title string
|
||||
}
|
||||
|
||||
func RepoMilestonesREST(client *Client, repo ghrepo.Interface) ([]RepoMilestoneREST, error) {
|
||||
var allMilestones []RepoMilestoneREST
|
||||
|
||||
path := fmt.Sprintf("repos/%s/%s/milestones", repo.RepoOwner(), repo.RepoName())
|
||||
|
||||
for page := 1; ; page++ {
|
||||
var milestonesFromPage []RepoMilestoneREST
|
||||
|
||||
err := client.REST("GET", path+"?page="+strconv.Itoa(page), nil, &milestonesFromPage)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if len(milestonesFromPage) == 0 {
|
||||
break
|
||||
}
|
||||
allMilestones = append(allMilestones, milestonesFromPage...)
|
||||
}
|
||||
|
||||
return allMilestones, nil
|
||||
}
|
||||
|
|
|
|||
|
|
@ -54,14 +54,6 @@ func Test_RepoMetadata(t *testing.T) {
|
|||
"pageInfo": { "hasNextPage": false }
|
||||
} } } }
|
||||
`))
|
||||
http.Register(
|
||||
httpmock.REST("GET", "repos/OWNER/REPO/milestones"),
|
||||
httpmock.StringResponse(`
|
||||
[
|
||||
{ "title": "GA", "id": 1 },
|
||||
{ "title": "Big One.oh", "id": 2 }
|
||||
]
|
||||
`))
|
||||
http.Register(
|
||||
httpmock.GraphQL(`query RepositoryProjectList\b`),
|
||||
httpmock.StringResponse(`
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue