X Tutup
Skip to content

Commit 80035aa

Browse files
committed
💅 cleanup switching to search mode in issue list
1 parent f791bbd commit 80035aa

File tree

5 files changed

+395
-268
lines changed

5 files changed

+395
-268
lines changed

api/queries_issue.go

Lines changed: 22 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -454,70 +454,44 @@ func IssueByNumber(client *Client, repo ghrepo.Interface, number int) (*Issue, e
454454
}
455455

456456
func IssueSearch(client *Client, repo ghrepo.Interface, searchQuery string, limit int) (*IssuesAndTotalCount, error) {
457-
query :=
458-
`query IssueSearch($repoName: String!, $owner: String!, $type: SearchType!, $first: Int, $after: String, $searchQuery: String!) {
459-
repository(name: $repoName, owner: $owner) {
457+
query := fragments +
458+
`query IssueSearch($repo: String!, $owner: String!, $type: SearchType!, $limit: Int, $after: String, $query: String!) {
459+
repository(name: $repo, owner: $owner) {
460460
hasIssuesEnabled
461461
}
462-
search(type: $type, first: $first, after: $after, query: $searchQuery) {
462+
search(type: $type, last: $limit, after: $after, query: $query) {
463463
issueCount
464-
edges {
465-
node {
466-
... on Issue {
467-
repository {
468-
hasIssuesEnabled
469-
}
470-
number
471-
title
472-
updatedAt
473-
state
474-
labels(first: 100) {
475-
nodes {
476-
name
477-
}
478-
}
479-
}
464+
nodes { ...issue }
465+
pageInfo {
466+
hasNextPage
467+
endCursor
480468
}
481469
}
482-
pageInfo {
483-
hasNextPage
484-
endCursor
485-
}
486-
}
487-
}`
470+
}`
488471

489472
type response struct {
490473
Repository struct {
491474
HasIssuesEnabled bool
492475
}
493476
Search struct {
494477
IssueCount int
495-
Edges []struct {
496-
Node struct {
497-
Number int
498-
Title string
499-
State string
500-
UpdatedAt time.Time
501-
Labels Labels
502-
}
503-
}
504-
PageInfo struct {
478+
Nodes []Issue
479+
PageInfo struct {
505480
HasNextPage bool
506481
EndCursor string
507482
}
508483
}
509484
}
510485

511-
searchQuery = fmt.Sprintf("is:issue repo:%s/%s %s", repo.RepoOwner(), repo.RepoName(), searchQuery)
512-
513486
perPage := min(limit, 100)
487+
searchQuery = fmt.Sprintf("repo:%s/%s %s", repo.RepoOwner(), repo.RepoName(), searchQuery)
514488

515489
variables := map[string]interface{}{
516-
"repoName": repo.RepoName(),
517-
"owner": repo.RepoOwner(),
518-
"type": "ISSUE",
519-
"first": perPage,
520-
"searchQuery": searchQuery,
490+
"owner": repo.RepoOwner(),
491+
"repo": repo.RepoName(),
492+
"type": "ISSUE",
493+
"limit": perPage,
494+
"query": searchQuery,
521495
}
522496

523497
ic := IssuesAndTotalCount{}
@@ -536,25 +510,18 @@ loop:
536510

537511
ic.TotalCount = resp.Search.IssueCount
538512

539-
for _, i := range resp.Search.Edges {
540-
ic.Issues = append(ic.Issues, Issue{
541-
Number: i.Node.Number,
542-
Title: i.Node.Title,
543-
State: i.Node.State,
544-
UpdatedAt: i.Node.UpdatedAt,
545-
Labels: i.Node.Labels,
546-
})
513+
for _, issue := range resp.Search.Nodes {
514+
ic.Issues = append(ic.Issues, issue)
547515
if len(ic.Issues) == limit {
548516
break loop
549517
}
550518
}
551519

552-
if resp.Search.PageInfo.HasNextPage {
553-
variables["after"] = resp.Search.PageInfo.EndCursor
554-
variables["first"] = min(perPage, limit-len(resp.Search.Edges))
555-
} else {
520+
if !resp.Search.PageInfo.HasNextPage {
556521
break
557522
}
523+
variables["after"] = resp.Search.PageInfo.EndCursor
524+
variables["perPage"] = min(perPage, limit-len(ic.Issues))
558525
}
559526

560527
return &ic, nil

pkg/cmd/issue/list/fixtures/issueSearch.json

Lines changed: 35 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -5,56 +5,50 @@
55
},
66
"search": {
77
"issueCount": 3,
8-
"edges": [
8+
"nodes": [
99
{
10-
"node": {
11-
"number": 1,
12-
"title": "number won",
13-
"url": "https://wow.com",
14-
"updatedAt": "2011-01-26T19:01:12Z",
15-
"labels": {
16-
"nodes": [
17-
{
18-
"name": "label"
19-
}
20-
],
21-
"totalCount": 1
22-
}
10+
"number": 1,
11+
"title": "number won",
12+
"url": "https://wow.com",
13+
"updatedAt": "2011-01-26T19:01:12Z",
14+
"labels": {
15+
"nodes": [
16+
{
17+
"name": "label"
18+
}
19+
],
20+
"totalCount": 1
2321
}
2422
},
2523
{
26-
"node": {
27-
"number": 2,
28-
"title": "number too",
29-
"url": "https://wow.com",
30-
"updatedAt": "2011-01-26T19:01:12Z",
31-
"labels": {
32-
"nodes": [
33-
{
34-
"name": "label"
35-
}
36-
],
37-
"totalCount": 1
38-
}
24+
"number": 2,
25+
"title": "number too",
26+
"url": "https://wow.com",
27+
"updatedAt": "2011-01-26T19:01:12Z",
28+
"labels": {
29+
"nodes": [
30+
{
31+
"name": "label"
32+
}
33+
],
34+
"totalCount": 1
3935
}
4036
},
4137
{
42-
"node": {
43-
"number": 4,
44-
"title": "number fore",
45-
"url": "https://wow.com",
46-
"updatedAt": "2011-01-26T19:01:12Z",
47-
"labels": {
48-
"nodes": [
49-
{
50-
"name": "label"
51-
}
52-
],
53-
"totalCount": 1
54-
}
38+
"number": 4,
39+
"title": "number fore",
40+
"url": "https://wow.com",
41+
"updatedAt": "2011-01-26T19:01:12Z",
42+
"labels": {
43+
"nodes": [
44+
{
45+
"name": "label"
46+
}
47+
],
48+
"totalCount": 1
5549
}
5650
}
5751
]
5852
}
5953
}
60-
}
54+
}

pkg/cmd/issue/list/list.go

Lines changed: 55 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package list
33
import (
44
"fmt"
55
"net/http"
6+
"strconv"
67

78
"github.com/MakeNowJust/heredoc"
89
"github.com/cli/cli/api"
@@ -46,11 +47,11 @@ func NewCmdList(f *cmdutil.Factory, runF func(*ListOptions) error) *cobra.Comman
4647
Use: "list",
4748
Short: "List and filter issues in this repository",
4849
Example: heredoc.Doc(`
49-
$ gh issue list -l "help wanted"
50+
$ gh issue list -l "bug" -l "help wanted"
5051
$ gh issue list -A monalisa
5152
$ gh issue list -a @me
5253
$ gh issue list --web
53-
$ gh issue list --milestone 'MVP'
54+
$ gh issue list --milestone "The big 1.0"
5455
$ gh issue list --search "error no:assignee sort:created-asc"
5556
`),
5657
Args: cmdutil.NoArgsQuoteReminder,
@@ -86,40 +87,25 @@ func listRun(opts *ListOptions) error {
8687
if err != nil {
8788
return err
8889
}
89-
apiClient := api.NewClientFromHTTP(httpClient)
9090

9191
baseRepo, err := opts.BaseRepo()
9292
if err != nil {
9393
return err
9494
}
9595

96-
isTerminal := opts.IO.IsStdoutTTY()
97-
98-
meReplacer := shared.NewMeReplacer(apiClient, baseRepo.RepoHost())
99-
filterAssignee, err := meReplacer.Replace(opts.Assignee)
100-
if err != nil {
101-
return err
102-
}
103-
filterAuthor, err := meReplacer.Replace(opts.Author)
104-
if err != nil {
105-
return err
106-
}
107-
filterMention, err := meReplacer.Replace(opts.Mention)
108-
if err != nil {
109-
return err
110-
}
111-
11296
filterOptions := prShared.FilterOptions{
11397
Entity: "issue",
11498
State: opts.State,
115-
Assignee: filterAssignee,
99+
Assignee: opts.Assignee,
116100
Labels: opts.Labels,
117-
Author: filterAuthor,
118-
Mention: filterMention,
101+
Author: opts.Author,
102+
Mention: opts.Mention,
119103
Milestone: opts.Milestone,
120104
Search: opts.Search,
121105
}
122106

107+
isTerminal := opts.IO.IsStdoutTTY()
108+
123109
if opts.WebMode {
124110
issueListURL := ghrepo.GenerateRepoURL(baseRepo, "issues")
125111
openURL, err := prShared.ListURLWithQuery(issueListURL, filterOptions)
@@ -133,20 +119,9 @@ func listRun(opts *ListOptions) error {
133119
return utils.OpenInBrowser(openURL)
134120
}
135121

136-
searchQuery := prShared.IssueSearchBuild(filterOptions)
137-
138-
var listResult *api.IssuesAndTotalCount
139-
140-
if opts.Search != "" {
141-
listResult, err = api.IssueSearch(apiClient, baseRepo, searchQuery, opts.LimitResults)
142-
if err != nil {
143-
return err
144-
}
145-
} else {
146-
listResult, err = api.IssueList(apiClient, baseRepo, opts.State, opts.Labels, filterAssignee, opts.LimitResults, filterAuthor, filterMention, opts.Milestone)
147-
if err != nil {
148-
return err
149-
}
122+
listResult, err := issueList(httpClient, baseRepo, filterOptions, opts.LimitResults)
123+
if err != nil {
124+
return err
150125
}
151126

152127
err = opts.IO.StartPager()
@@ -156,7 +131,7 @@ func listRun(opts *ListOptions) error {
156131
defer opts.IO.StopPager()
157132

158133
if isTerminal {
159-
hasFilters := opts.State != "open" || len(opts.Labels) > 0 || opts.Assignee != "" || opts.Author != "" || opts.Mention != "" || opts.Milestone != ""
134+
hasFilters := opts.State != "open" || len(opts.Labels) > 0 || opts.Assignee != "" || opts.Author != "" || opts.Mention != "" || opts.Milestone != "" || opts.Search != ""
160135
title := prShared.ListHeader(ghrepo.FullName(baseRepo), "issue", len(listResult.Issues), listResult.TotalCount, hasFilters)
161136
fmt.Fprintf(opts.IO.Out, "\n%s\n\n", title)
162137
}
@@ -165,3 +140,46 @@ func listRun(opts *ListOptions) error {
165140

166141
return nil
167142
}
143+
144+
func issueList(client *http.Client, repo ghrepo.Interface, filters prShared.FilterOptions, limit int) (*api.IssuesAndTotalCount, error) {
145+
apiClient := api.NewClientFromHTTP(client)
146+
147+
if filters.Search != "" {
148+
if milestoneNumber, err := strconv.ParseInt(filters.Milestone, 10, 32); err == nil {
149+
milestone, err := api.MilestoneByNumber(apiClient, repo, int32(milestoneNumber))
150+
if err != nil {
151+
return nil, err
152+
}
153+
filters.Milestone = milestone.Title
154+
}
155+
156+
searchQuery := prShared.IssueSearchBuild(filters)
157+
return api.IssueSearch(apiClient, repo, searchQuery, limit)
158+
}
159+
160+
meReplacer := shared.NewMeReplacer(apiClient, repo.RepoHost())
161+
filterAssignee, err := meReplacer.Replace(filters.Assignee)
162+
if err != nil {
163+
return nil, err
164+
}
165+
filterAuthor, err := meReplacer.Replace(filters.Author)
166+
if err != nil {
167+
return nil, err
168+
}
169+
filterMention, err := meReplacer.Replace(filters.Mention)
170+
if err != nil {
171+
return nil, err
172+
}
173+
174+
return api.IssueList(
175+
apiClient,
176+
repo,
177+
filters.State,
178+
filters.Labels,
179+
filterAssignee,
180+
limit,
181+
filterAuthor,
182+
filterMention,
183+
filters.Milestone,
184+
)
185+
}

0 commit comments

Comments
 (0)
X Tutup