From 5194256928d00e514328e66793bbcded8901c598 Mon Sep 17 00:00:00 2001 From: Louis Shawn Date: Fri, 6 Feb 2026 10:45:28 +0800 Subject: [PATCH 1/2] fix(issue list): reject pull request-only search qualifiers --- pkg/cmd/issue/list/http.go | 7 +++++++ pkg/cmd/issue/list/http_test.go | 19 +++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/pkg/cmd/issue/list/http.go b/pkg/cmd/issue/list/http.go index 49e316db6b6..0657637bfb5 100644 --- a/pkg/cmd/issue/list/http.go +++ b/pkg/cmd/issue/list/http.go @@ -2,6 +2,7 @@ package list import ( "fmt" + "regexp" "github.com/cli/cli/v2/api" fd "github.com/cli/cli/v2/internal/featuredetection" @@ -9,6 +10,8 @@ import ( prShared "github.com/cli/cli/v2/pkg/cmd/pr/shared" ) +var pullRequestSearchQualifierRE = regexp.MustCompile(`(?i)\b(?:is|type):(?:pr|pull-?request)\b`) + func listIssues(client *api.Client, repo ghrepo.Interface, filters prShared.FilterOptions, limit int) (*api.IssuesAndTotalCount, error) { var states []string switch filters.State { @@ -114,6 +117,10 @@ loop: } func searchIssues(client *api.Client, detector fd.Detector, repo ghrepo.Interface, filters prShared.FilterOptions, limit int) (*api.IssuesAndTotalCount, error) { + if pullRequestSearchQualifierRE.MatchString(filters.Search) { + return nil, fmt.Errorf("cannot use pull request search qualifiers with `gh issue list`; use `gh pr list` instead") + } + // TODO advancedIssueSearchCleanup // We won't need feature detection when GHES 3.17 support ends, since // the advanced issue search is the only available search backend for diff --git a/pkg/cmd/issue/list/http_test.go b/pkg/cmd/issue/list/http_test.go index 747bd0a4be3..52d35570265 100644 --- a/pkg/cmd/issue/list/http_test.go +++ b/pkg/cmd/issue/list/http_test.go @@ -214,3 +214,22 @@ func TestSearchIssuesAndAdvancedSearch(t *testing.T) { }) } } + +func TestSearchIssues_rejectsPullRequestQualifiers(t *testing.T) { + reg := &httpmock.Registry{} + defer reg.Verify(t) + + httpClient := &http.Client{Transport: reg} + client := api.NewClientFromHTTP(httpClient) + + _, err := searchIssues( + client, + fd.AdvancedIssueSearchSupportedAsOnlyBackend(), + ghrepo.New("OWNER", "REPO"), + prShared.FilterOptions{Search: "is:pr"}, + 30, + ) + + assert.EqualError(t, err, "cannot use pull request search qualifiers with `gh issue list`; use `gh pr list` instead") + assert.Len(t, reg.Requests, 0) +} From b601b307a4d2db5c77e369f7ec01dcca2ab89271 Mon Sep 17 00:00:00 2001 From: Louis Shawn Date: Tue, 3 Mar 2026 10:13:57 +0800 Subject: [PATCH 2/2] test(issue list): cover additional PR search qualifier variants --- pkg/cmd/issue/list/http_test.go | 60 ++++++++++++++++++++++++++------- 1 file changed, 47 insertions(+), 13 deletions(-) diff --git a/pkg/cmd/issue/list/http_test.go b/pkg/cmd/issue/list/http_test.go index 52d35570265..d313da90b6a 100644 --- a/pkg/cmd/issue/list/http_test.go +++ b/pkg/cmd/issue/list/http_test.go @@ -216,20 +216,54 @@ func TestSearchIssuesAndAdvancedSearch(t *testing.T) { } func TestSearchIssues_rejectsPullRequestQualifiers(t *testing.T) { - reg := &httpmock.Registry{} - defer reg.Verify(t) + tests := []struct { + name string + search string + }{ + { + name: "is:pr", + search: "is:pr", + }, + { + name: "type:pr", + search: "type:pr", + }, + { + name: "type:pull-request", + search: "type:pull-request", + }, + { + name: "type:pullrequest", + search: "type:pullrequest", + }, + { + name: "case-insensitive is:PR", + search: "is:PR", + }, + { + name: "case-insensitive TYPE:Pull-Request", + search: "TYPE:Pull-Request", + }, + } - httpClient := &http.Client{Transport: reg} - client := api.NewClientFromHTTP(httpClient) + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + reg := &httpmock.Registry{} + defer reg.Verify(t) - _, err := searchIssues( - client, - fd.AdvancedIssueSearchSupportedAsOnlyBackend(), - ghrepo.New("OWNER", "REPO"), - prShared.FilterOptions{Search: "is:pr"}, - 30, - ) + httpClient := &http.Client{Transport: reg} + client := api.NewClientFromHTTP(httpClient) - assert.EqualError(t, err, "cannot use pull request search qualifiers with `gh issue list`; use `gh pr list` instead") - assert.Len(t, reg.Requests, 0) + _, err := searchIssues( + client, + fd.AdvancedIssueSearchSupportedAsOnlyBackend(), + ghrepo.New("OWNER", "REPO"), + prShared.FilterOptions{Search: tt.search}, + 30, + ) + + assert.EqualError(t, err, "cannot use pull request search qualifiers with `gh issue list`; use `gh pr list` instead") + assert.Len(t, reg.Requests, 0) + }) + } }