From 8f199ba7306bcab90b5e72c238527b5f03d83c6c Mon Sep 17 00:00:00 2001 From: ffalor Date: Fri, 6 May 2022 00:37:15 +0000 Subject: [PATCH] status: exclude results from archived repositories MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This adds `arhived:false` to the underlying search queries. Additionally, the query approach was rearranged so that the query strings are passed as GraphQL variables rather than being interpolated directly into the GraphQL query string. Co-authored-by: Mislav Marohnić --- pkg/cmd/status/status.go | 109 ++++++++++++++++------------------ pkg/cmd/status/status_test.go | 44 -------------- 2 files changed, 50 insertions(+), 103 deletions(-) diff --git a/pkg/cmd/status/status.go b/pkg/cmd/status/status.go index 0e890bf52..c9e5ff3e6 100644 --- a/pkg/cmd/status/status.go +++ b/pkg/cmd/status/status.go @@ -302,71 +302,62 @@ func (s *StatusGetter) LoadNotifications() error { return nil } -func (s *StatusGetter) buildSearchQuery() string { - q := ` - query AssignedSearch { - assignments: search(first: 25, type: ISSUE, query:"%s") { - edges { - node { - ...on Issue { - __typename - updatedAt - title - number - repository { - nameWithOwner - } - } - ...on PullRequest { - updatedAt - __typename - title - number - repository { - nameWithOwner - } - } - } - } - } - reviewRequested: search(first: 25, type: ISSUE, query:"%s") { - edges { - node { - ...on PullRequest { - updatedAt - __typename - title - number - repository { - nameWithOwner - } - } - } - } - } - }` - assignmentsQ := `assignee:@me state:open%s%s` - requestedQ := `state:open review-requested:@me%s%s` - - orgFilter := "" - if s.Org != "" { - orgFilter = " org:" + s.Org +const searchQuery = ` +fragment issue on Issue { + __typename + updatedAt + title + number + repository { + nameWithOwner } - excludeFilter := "" - for _, repo := range s.Exclude { - excludeFilter += " -repo:" + repo - } - assignmentsQ = fmt.Sprintf(assignmentsQ, orgFilter, excludeFilter) - requestedQ = fmt.Sprintf(requestedQ, orgFilter, excludeFilter) - - return fmt.Sprintf(q, assignmentsQ, requestedQ) } +fragment pr on PullRequest { + __typename + updatedAt + title + number + repository { + nameWithOwner + } +} +query AssignedSearch($searchAssigns: String!, $searchReviews: String!, $limit: Int = 25) { + assignments: search(first: $limit, type: ISSUE, query: $searchAssigns) { + edges { + node { + ...issue + ...pr + } + } + } + reviewRequested: search(first: $limit, type: ISSUE, query: $searchReviews) { + edges { + node { + ...pr + } + } + } +}` // Populate .AssignedPRs, .AssignedIssues, .ReviewRequests func (s *StatusGetter) LoadSearchResults() error { - q := s.buildSearchQuery() c := api.NewClientFromHTTP(s.Client) + searchAssigns := `assignee:@me state:open archived:false` + searchReviews := `review-requested:@me state:open archived:false` + if s.Org != "" { + searchAssigns += " org:" + s.Org + searchReviews += " org:" + s.Org + } + for _, repo := range s.Exclude { + searchAssigns += " -repo:" + repo + searchReviews += " -repo:" + repo + } + variables := map[string]interface{}{ + "searchAssigns": searchAssigns, + "searchReviews": searchReviews, + } + var resp struct { Assignments struct { Edges []struct { @@ -379,7 +370,7 @@ func (s *StatusGetter) LoadSearchResults() error { } } } - err := c.GraphQL(s.hostname(), q, nil, &resp) + err := c.GraphQL(s.hostname(), searchQuery, variables, &resp) if err != nil { return fmt.Errorf("could not search for assignments: %w", err) } diff --git a/pkg/cmd/status/status_test.go b/pkg/cmd/status/status_test.go index 670699841..9475ade1c 100644 --- a/pkg/cmd/status/status_test.go +++ b/pkg/cmd/status/status_test.go @@ -301,47 +301,3 @@ func TestStatusRun(t *testing.T) { }) } } - -func Test_buildSearchQuery(t *testing.T) { - tests := []struct { - name string - sg StatusGetter - wantReviewQ string - wantAssignedQ string - }{ - { - name: "nothing", - wantReviewQ: "first: 25, type: ISSUE, query:\"state:open review-requested:@me", - wantAssignedQ: "assignee:@me state:open", - }, - { - name: "exclude one", - sg: StatusGetter{ - Exclude: []string{"cli/cli"}, - }, - wantReviewQ: "first: 25, type: ISSUE, query:\"state:open review-requested:@me -repo:cli/cli", - wantAssignedQ: "assignee:@me state:open", - }, - { - name: "exclude several", - sg: StatusGetter{ - Exclude: []string{"cli/cli", "vilmibm/testing"}, - }, - wantReviewQ: "first: 25, type: ISSUE, query:\"state:open review-requested:@me -repo:cli/cli -repo:vilmibm/testing", - wantAssignedQ: "assignee:@me state:open", - }, - { - name: "org filter", - sg: StatusGetter{ - Org: "cli", - }, - wantReviewQ: "first: 25, type: ISSUE, query:\"state:open review-requested:@me org:cli", - wantAssignedQ: "assignee:@me state:open org:cli", - }, - } - - for _, tt := range tests { - assert.Contains(t, tt.sg.buildSearchQuery(), tt.wantReviewQ) - assert.Contains(t, tt.sg.buildSearchQuery(), tt.wantAssignedQ) - } -}