Skip to content

Commit d983ae0

Browse files
authored
Merge pull request cli#12623 from LouisLau-art/fix/issue-list-pr-search-qualifier
fix(issue list): reject pull request-only search qualifiers
2 parents 7a59033 + b601b30 commit d983ae0

2 files changed

Lines changed: 60 additions & 0 deletions

File tree

pkg/cmd/issue/list/http.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,16 @@ package list
22

33
import (
44
"fmt"
5+
"regexp"
56

67
"github.com/cli/cli/v2/api"
78
fd "github.com/cli/cli/v2/internal/featuredetection"
89
"github.com/cli/cli/v2/internal/ghrepo"
910
prShared "github.com/cli/cli/v2/pkg/cmd/pr/shared"
1011
)
1112

13+
var pullRequestSearchQualifierRE = regexp.MustCompile(`(?i)\b(?:is|type):(?:pr|pull-?request)\b`)
14+
1215
func listIssues(client *api.Client, repo ghrepo.Interface, filters prShared.FilterOptions, limit int) (*api.IssuesAndTotalCount, error) {
1316
var states []string
1417
switch filters.State {
@@ -114,6 +117,10 @@ loop:
114117
}
115118

116119
func searchIssues(client *api.Client, detector fd.Detector, repo ghrepo.Interface, filters prShared.FilterOptions, limit int) (*api.IssuesAndTotalCount, error) {
120+
if pullRequestSearchQualifierRE.MatchString(filters.Search) {
121+
return nil, fmt.Errorf("cannot use pull request search qualifiers with `gh issue list`; use `gh pr list` instead")
122+
}
123+
117124
// TODO advancedIssueSearchCleanup
118125
// We won't need feature detection when GHES 3.17 support ends, since
119126
// the advanced issue search is the only available search backend for

pkg/cmd/issue/list/http_test.go

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,3 +214,56 @@ func TestSearchIssuesAndAdvancedSearch(t *testing.T) {
214214
})
215215
}
216216
}
217+
218+
func TestSearchIssues_rejectsPullRequestQualifiers(t *testing.T) {
219+
tests := []struct {
220+
name string
221+
search string
222+
}{
223+
{
224+
name: "is:pr",
225+
search: "is:pr",
226+
},
227+
{
228+
name: "type:pr",
229+
search: "type:pr",
230+
},
231+
{
232+
name: "type:pull-request",
233+
search: "type:pull-request",
234+
},
235+
{
236+
name: "type:pullrequest",
237+
search: "type:pullrequest",
238+
},
239+
{
240+
name: "case-insensitive is:PR",
241+
search: "is:PR",
242+
},
243+
{
244+
name: "case-insensitive TYPE:Pull-Request",
245+
search: "TYPE:Pull-Request",
246+
},
247+
}
248+
249+
for _, tt := range tests {
250+
t.Run(tt.name, func(t *testing.T) {
251+
reg := &httpmock.Registry{}
252+
defer reg.Verify(t)
253+
254+
httpClient := &http.Client{Transport: reg}
255+
client := api.NewClientFromHTTP(httpClient)
256+
257+
_, err := searchIssues(
258+
client,
259+
fd.AdvancedIssueSearchSupportedAsOnlyBackend(),
260+
ghrepo.New("OWNER", "REPO"),
261+
prShared.FilterOptions{Search: tt.search},
262+
30,
263+
)
264+
265+
assert.EqualError(t, err, "cannot use pull request search qualifiers with `gh issue list`; use `gh pr list` instead")
266+
assert.Len(t, reg.Requests, 0)
267+
})
268+
}
269+
}

0 commit comments

Comments
 (0)