From cf550ae44a0eb1d934ff439d90df50c3e13e0265 Mon Sep 17 00:00:00 2001 From: Jai Pradeesh Date: Mon, 2 Mar 2026 11:30:33 -0800 Subject: [PATCH 1/6] Migrate PR issues to new flattened API with server-side filters - Switch from `issueOccurrences` to `issues` field in PR issues GraphQL query - Flatten response structure, remove nested issue/analyzer objects - Add source, category, severity, and q filter params to PR issues query - Add buildPRFilters() to map CLI flags to server-side filter params - Update GetPRIssues signature to accept filter params - Update golden files and tests to match new schema --- command/issues/issues.go | 24 +++++- .../tests/golden_files/pr_scope_output.json | 8 +- .../tests/golden_files/pr_scope_response.json | 38 ++++----- command/issues/tests/issues_test.go | 8 +- deepsource/client.go | 13 ++- deepsource/issues/queries/pr_issues.go | 83 ++++++++++--------- 6 files changed, 97 insertions(+), 77 deletions(-) diff --git a/command/issues/issues.go b/command/issues/issues.go index e923cc59..e9fdd692 100644 --- a/command/issues/issues.go +++ b/command/issues/issues.go @@ -280,6 +280,7 @@ func (opts *IssuesOptions) Run(ctx context.Context) error { func (opts *IssuesOptions) resolveIssues(ctx context.Context, client *deepsource.Client, remote *vcs.RemoteData) ([]issues.Issue, error) { serverFilters := opts.buildServerFilters() + prFilters := opts.buildPRFilters() var issuesList []issues.Issue var err error @@ -287,7 +288,7 @@ func (opts *IssuesOptions) resolveIssues(ctx context.Context, client *deepsource case opts.CommitOid != "": issuesList, err = client.GetRunIssuesFlat(ctx, opts.CommitOid, serverFilters) case opts.PRNumber > 0: - issuesList, err = client.GetPRIssues(ctx, remote.Owner, remote.RepoName, remote.VCSProvider, opts.PRNumber) + issuesList, err = client.GetPRIssues(ctx, remote.Owner, remote.RepoName, remote.VCSProvider, opts.PRNumber, prFilters) case opts.DefaultBranch: issuesList, err = client.GetIssues(ctx, remote.Owner, remote.RepoName, remote.VCSProvider) default: @@ -307,7 +308,7 @@ func (opts *IssuesOptions) resolveIssues(ctx context.Context, client *deepsource case ab.PRNumber > 0: opts.PRNumber = ab.PRNumber opts.CommitOid = ab.CommitOid - issuesList, err = client.GetPRIssues(ctx, remote.Owner, remote.RepoName, remote.VCSProvider, ab.PRNumber) + issuesList, err = client.GetPRIssues(ctx, remote.Owner, remote.RepoName, remote.VCSProvider, ab.PRNumber, prFilters) case ab.UseRepo: issuesList, err = client.GetIssues(ctx, remote.Owner, remote.RepoName, remote.VCSProvider) default: @@ -375,6 +376,25 @@ func (opts *IssuesOptions) buildServerFilters() issuesQuery.RunIssuesFlatParams return params } +// buildPRFilters returns PRIssuesListParams with server-side filters set +// for any filter that has exactly one value. +func (opts *IssuesOptions) buildPRFilters() issuesQuery.PRIssuesListParams { + var params issuesQuery.PRIssuesListParams + if len(opts.SourceFilters) == 1 { + v := normalizeEnumValue(opts.SourceFilters[0]) + params.Source = &v + } + if len(opts.CategoryFilters) == 1 { + v := normalizeEnumValue(opts.CategoryFilters[0]) + params.Category = &v + } + if len(opts.SeverityFilters) == 1 { + v := normalizeEnumValue(opts.SeverityFilters[0]) + params.Severity = &v + } + return params +} + // --- Filters --- func (opts *IssuesOptions) hasFilters() bool { diff --git a/command/issues/tests/golden_files/pr_scope_output.json b/command/issues/tests/golden_files/pr_scope_output.json index 87f592ee..6654df10 100644 --- a/command/issues/tests/golden_files/pr_scope_output.json +++ b/command/issues/tests/golden_files/pr_scope_output.json @@ -8,8 +8,8 @@ "description": "Return value of io.ReadAll is not checked for errors", "category": "BUG_RISK", "severity": "MAJOR", - "source": "", - "analyzer": "go" + "source": "static", + "analyzer": "" }, { "path": "internal/vcs/remotes.go", @@ -20,7 +20,7 @@ "description": "Constructing HTTP request with user-controlled URL allows SSRF", "category": "SECURITY", "severity": "MAJOR", - "source": "", - "analyzer": "go" + "source": "ai", + "analyzer": "" } ] diff --git a/command/issues/tests/golden_files/pr_scope_response.json b/command/issues/tests/golden_files/pr_scope_response.json index 989a813c..71c0bbf0 100644 --- a/command/issues/tests/golden_files/pr_scope_response.json +++ b/command/issues/tests/golden_files/pr_scope_response.json @@ -1,45 +1,39 @@ { "repository": { "pullRequest": { - "issueOccurrences": { + "issues": { "edges": [ { "node": { + "source": "static", "path": "cmd/deepsource/main.go", "beginLine": 42, "endLine": 42, "title": "Unchecked error return value of os.ReadFile", - "issue": { - "shortcode": "GO-W1007", - "shortDescription": "Return value of io.ReadAll is not checked for errors", - "category": "BUG_RISK", - "severity": "MAJOR", - "analyzer": { - "name": "Go", - "shortcode": "go" - } - } + "shortcode": "GO-W1007", + "category": "BUG_RISK", + "severity": "MAJOR", + "explanation": "Return value of io.ReadAll is not checked for errors" } }, { "node": { + "source": "ai", "path": "internal/vcs/remotes.go", "beginLine": 87, "endLine": 91, "title": "HTTP request built with user-controlled URL", - "issue": { - "shortcode": "GO-S1010", - "shortDescription": "Constructing HTTP request with user-controlled URL allows SSRF", - "category": "SECURITY", - "severity": "MAJOR", - "analyzer": { - "name": "Go", - "shortcode": "go" - } - } + "shortcode": "GO-S1010", + "category": "SECURITY", + "severity": "MAJOR", + "explanation": "Constructing HTTP request with user-controlled URL allows SSRF" } } - ] + ], + "pageInfo": { + "hasNextPage": false, + "endCursor": null + } } } } diff --git a/command/issues/tests/issues_test.go b/command/issues/tests/issues_test.go index 06d64257..d1e84f2a 100644 --- a/command/issues/tests/issues_test.go +++ b/command/issues/tests/issues_test.go @@ -61,9 +61,9 @@ func TestIssuesAutoDetectBranch(t *testing.T) { func TestIssuesAutoDetectPR(t *testing.T) { cfgMgr := testutil.CreateTestConfigManager(t, "test-token", "deepsource.com", "test@example.com") mock := testutil.MockQueryFunc(t, map[string]string{ - "pullRequests(": goldenPath("get_pr_by_branch_found_response.json"), - "query GetAnalysisRuns(": goldenPath("get_analysis_runs_response.json"), - "issueOccurrences(first:": goldenPath("pr_scope_response.json"), + "pullRequests(": goldenPath("get_pr_by_branch_found_response.json"), + "query GetAnalysisRuns(": goldenPath("get_analysis_runs_response.json"), + "query GetPRIssues(": goldenPath("pr_scope_response.json"), }) client := deepsource.NewWithGraphQLClient(mock) @@ -185,7 +185,7 @@ func TestIssuesCommitScope(t *testing.T) { func TestIssuesPRScope(t *testing.T) { cfgMgr := testutil.CreateTestConfigManager(t, "test-token", "deepsource.com", "test@example.com") mock := testutil.MockQueryFunc(t, map[string]string{ - "issueOccurrences(first:": goldenPath("pr_scope_response.json"), + "query GetPRIssues(": goldenPath("pr_scope_response.json"), }) client := deepsource.NewWithGraphQLClient(mock) diff --git a/deepsource/client.go b/deepsource/client.go index bf7bae11..42385675 100644 --- a/deepsource/client.go +++ b/deepsource/client.go @@ -266,13 +266,12 @@ func (c Client) GetRunIssuesFlat(ctx context.Context, commitOid string, filters } // Auto-paginates to fetch all results. -func (c Client) GetPRIssues(ctx context.Context, owner, repoName, provider string, prNumber int) ([]issues.Issue, error) { - req := issuesQuery.NewPRIssuesListRequest(c.gqlWrapper, issuesQuery.PRIssuesListParams{ - Owner: owner, - RepoName: repoName, - Provider: provider, - PRNumber: prNumber, - }) +func (c Client) GetPRIssues(ctx context.Context, owner, repoName, provider string, prNumber int, filters issuesQuery.PRIssuesListParams) ([]issues.Issue, error) { + filters.Owner = owner + filters.RepoName = repoName + filters.Provider = provider + filters.PRNumber = prNumber + req := issuesQuery.NewPRIssuesListRequest(c.gqlWrapper, filters) res, err := req.Do(ctx) if err != nil { return nil, err diff --git a/deepsource/issues/queries/pr_issues.go b/deepsource/issues/queries/pr_issues.go index 9883a412..bad4beb7 100644 --- a/deepsource/issues/queries/pr_issues.go +++ b/deepsource/issues/queries/pr_issues.go @@ -16,26 +16,25 @@ const fetchPRIssuesQuery = `query GetPRIssues( $prNumber: Int! $limit: Int! $after: String + $source: AnalysisIssueSource + $category: IssueCategory + $severity: IssueSeverity + $q: String ) { repository(name: $name, login: $owner, vcsProvider: $provider) { pullRequest(number: $prNumber) { - issueOccurrences(first: $limit, after: $after) { + issues(first: $limit, after: $after, source: $source, category: $category, severity: $severity, q: $q) { edges { node { + source path beginLine endLine title - issue { - shortcode - shortDescription - category - severity - analyzer { - name - shortcode - } - } + shortcode + category + severity + explanation } } pageInfo { @@ -52,6 +51,10 @@ type PRIssuesListParams struct { RepoName string Provider string PRNumber int + Source *string + Category *string + Severity *string + Q *string } type PRIssuesListRequest struct { @@ -62,27 +65,22 @@ type PRIssuesListRequest struct { type PRIssuesListResponse struct { Repository struct { PullRequest struct { - IssueOccurrences struct { + Issues struct { Edges []struct { Node struct { - Path string `json:"path"` - BeginLine int `json:"beginLine"` - EndLine int `json:"endLine"` - Title string `json:"title"` - Issue struct { - Shortcode string `json:"shortcode"` - ShortDescription string `json:"shortDescription"` - Category string `json:"category"` - Severity string `json:"severity"` - Analyzer struct { - Name string `json:"name"` - Shortcode string `json:"shortcode"` - } `json:"analyzer"` - } `json:"issue"` + Source string `json:"source"` + Path string `json:"path"` + BeginLine int `json:"beginLine"` + EndLine int `json:"endLine"` + Title string `json:"title"` + Shortcode string `json:"shortcode"` + Category string `json:"category"` + Severity string `json:"severity"` + Explanation string `json:"explanation"` } `json:"node"` } `json:"edges"` PageInfo pagination.PageInfo `json:"pageInfo"` - } `json:"issueOccurrences"` + } `json:"issues"` } `json:"pullRequest"` } `json:"repository"` } @@ -106,20 +104,33 @@ func (r *PRIssuesListRequest) Do(ctx context.Context) ([]issues.Issue, error) { if cursor != nil { vars["after"] = *cursor } + if r.Params.Source != nil { + vars["source"] = *r.Params.Source + } + if r.Params.Category != nil { + vars["category"] = *r.Params.Category + } + if r.Params.Severity != nil { + vars["severity"] = *r.Params.Severity + } + if r.Params.Q != nil { + vars["q"] = *r.Params.Q + } var respData PRIssuesListResponse if err := r.client.Query(ctx, fetchPRIssuesQuery, vars, &respData); err != nil { return nil, fmt.Errorf("List PR issues: %w", err) } - for _, edge := range respData.Repository.PullRequest.IssueOccurrences.Edges { + for _, edge := range respData.Repository.PullRequest.Issues.Edges { node := edge.Node issue := issues.Issue{ IssueText: node.Title, - IssueCode: node.Issue.Shortcode, - IssueCategory: node.Issue.Category, - IssueSeverity: node.Issue.Severity, - Description: node.Issue.ShortDescription, + IssueCode: node.Shortcode, + IssueCategory: node.Category, + IssueSeverity: node.Severity, + IssueSource: node.Source, + Description: node.Explanation, Location: issues.Location{ Path: node.Path, Position: issues.Position{ @@ -127,10 +138,6 @@ func (r *PRIssuesListRequest) Do(ctx context.Context) ([]issues.Issue, error) { EndLine: node.EndLine, }, }, - Analyzer: issues.AnalyzerMeta{ - Name: node.Issue.Analyzer.Name, - Shortcode: node.Issue.Analyzer.Shortcode, - }, } allIssues = append(allIssues, issue) } @@ -138,10 +145,10 @@ func (r *PRIssuesListRequest) Do(ctx context.Context) ([]issues.Issue, error) { if len(allIssues) >= pagination.MaxResults { break } - if !respData.Repository.PullRequest.IssueOccurrences.PageInfo.HasNextPage { + if !respData.Repository.PullRequest.Issues.PageInfo.HasNextPage { break } - cursor = respData.Repository.PullRequest.IssueOccurrences.PageInfo.EndCursor + cursor = respData.Repository.PullRequest.Issues.PageInfo.EndCursor } return allIssues, nil From 6e0458bd398b27f5245ad7265cc1c27d170aa8ac Mon Sep 17 00:00:00 2001 From: Jai Pradeesh Date: Mon, 2 Mar 2026 11:37:26 -0800 Subject: [PATCH 2/6] Handle nil issues list before filtering - Return early when issuesList is nil to avoid passing nil to filterIssues --- command/issues/issues.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/command/issues/issues.go b/command/issues/issues.go index e9fdd692..401081fe 100644 --- a/command/issues/issues.go +++ b/command/issues/issues.go @@ -254,6 +254,9 @@ func (opts *IssuesOptions) Run(ctx context.Context) error { if err != nil { return err } + if issuesList == nil { + return nil + } issuesList = opts.filterIssues(issuesList) From db07aed5ed6eed49455ecba92a3ceed3b29e99d9 Mon Sep 17 00:00:00 2001 From: Jai Pradeesh Date: Mon, 2 Mar 2026 11:52:51 -0800 Subject: [PATCH 3/6] Improve "no runs found" messages with actionable hints - Suggest checking if branch has been pushed/analyzed when no runs exist - Replace generic "no completed runs" with "analysis still in progress" - Point users to --default-branch as a fallback option - Update test assertions to match new message text --- command/cmdutil/resolve_run.go | 6 +++--- command/cmdutil/resolve_run_test.go | 4 ++-- command/issues/tests/issues_test.go | 4 ++-- command/reportcard/reportcard.go | 4 ++-- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/command/cmdutil/resolve_run.go b/command/cmdutil/resolve_run.go index b689337d..52f5c82f 100644 --- a/command/cmdutil/resolve_run.go +++ b/command/cmdutil/resolve_run.go @@ -67,7 +67,7 @@ func resolveRunFromCommits( } if len(allRuns) == 0 { return nil, fmt.Errorf( - "no analysis runs found for branch %q.\nTry: --default-branch, --commit , or --pr ", + "no analysis runs found for branch %q. Has this branch been pushed and analyzed on DeepSource?\nTry: --default-branch, --commit , or --pr ", branchName, ) } @@ -286,7 +286,7 @@ func resolveWithPR( return nil, fallbackErr } if completedRun == nil { - style.Infof(w, "No completed analysis runs found for branch %q.", branchName) + style.Infof(w, "Analysis is still in progress for branch %q. Try again shortly, or use --default-branch to see results from the default branch.", branchName) result.Empty = true return result, nil } @@ -336,7 +336,7 @@ func resolveWithoutPR( return nil, fallbackErr } if run == nil { - style.Infof(w, "No completed analysis runs found for branch %q.", branchName) + style.Infof(w, "Analysis is still in progress for branch %q. Try again shortly, or use --default-branch to see results from the default branch.", branchName) result.Empty = true return result, nil } diff --git a/command/cmdutil/resolve_run_test.go b/command/cmdutil/resolve_run_test.go index 7f362023..ec75e58f 100644 --- a/command/cmdutil/resolve_run_test.go +++ b/command/cmdutil/resolve_run_test.go @@ -491,8 +491,8 @@ func TestResolveWithPR_PendingNoCompletedRuns(t *testing.T) { if !got.Empty { t.Fatal("expected Empty=true when no completed runs exist") } - if !strings.Contains(buf.String(), "No completed analysis runs found") { - t.Errorf("expected 'no completed runs' message, got: %s", buf.String()) + if !strings.Contains(buf.String(), "Analysis is still in progress") { + t.Errorf("expected 'analysis still in progress' message, got: %s", buf.String()) } } diff --git a/command/issues/tests/issues_test.go b/command/issues/tests/issues_test.go index d1e84f2a..483ec226 100644 --- a/command/issues/tests/issues_test.go +++ b/command/issues/tests/issues_test.go @@ -447,8 +447,8 @@ func TestIssuesRunInProgress(t *testing.T) { got := buf.String() // In non-TTY (test runner), in-progress auto-falls back to last completed run. // Since the mock only has a PENDING run, no completed run is found. - if !strings.Contains(got, "No completed analysis runs found") { - t.Errorf("expected fallback 'no completed runs' message, got: %q", got) + if !strings.Contains(got, "Analysis is still in progress") { + t.Errorf("expected 'analysis still in progress' message, got: %q", got) } } diff --git a/command/reportcard/reportcard.go b/command/reportcard/reportcard.go index d976a1fb..3dc2febd 100644 --- a/command/reportcard/reportcard.go +++ b/command/reportcard/reportcard.go @@ -219,7 +219,7 @@ func (opts *ReportCardOptions) resolveByPR(ctx context.Context, client *deepsour return err } if completed == nil { - style.Infof(opts.stdout(), "No completed analysis runs found for branch %q.", branch) + style.Infof(opts.stdout(), "Analysis is still in progress for branch %q. Try again shortly, or use --default-branch to see results from the default branch.", branch) return nil } style.Infof(opts.stdout(), "Analysis is running on commit %s. Showing results from the last analyzed commit (%s).", run.CommitOid[:8], completed.CommitOid[:8]) @@ -276,7 +276,7 @@ func (opts *ReportCardOptions) resolveByCurrentBranch(ctx context.Context, clien return err } if completed == nil { - style.Infof(opts.stdout(), "No completed analysis runs found for branch %q.", branchName) + style.Infof(opts.stdout(), "Analysis is still in progress for branch %q. Try again shortly, or use --default-branch to see results from the default branch.", branchName) return nil } style.Infof(opts.stdout(), "Analysis is running on commit %s. Showing results from the last analyzed commit (%s).", run.CommitOid[:8], completed.CommitOid[:8]) From ffd020835035244fb87459ffa80b803f934c30fe Mon Sep 17 00:00:00 2001 From: Jai Pradeesh Date: Mon, 2 Mar 2026 11:53:03 -0800 Subject: [PATCH 4/6] Bump version to 2.0.41 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 3d22ace4..d3d5bc4f 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.0.40 +2.0.41 From c4ccfd8fe6ec1ceb122b622d0436babb0112ba7d Mon Sep 17 00:00:00 2001 From: Jai Pradeesh Date: Mon, 2 Mar 2026 12:08:31 -0800 Subject: [PATCH 5/6] Suppress empty-results message when showing fallback data - Add Fallback field to AutoBranchResult to track when results come from a previous completed run while a new analysis is in progress - Propagate fallback state to issues, metrics, and vulnerabilities commands - Skip "no results found" message in fallback mode since it's misleading when the data is from an older run, not the current commit --- command/cmdutil/resolve_run.go | 3 +++ command/issues/issues.go | 5 +++++ command/metrics/metrics.go | 5 +++++ command/vulnerabilities/vulnerabilities.go | 5 +++++ 4 files changed, 18 insertions(+) diff --git a/command/cmdutil/resolve_run.go b/command/cmdutil/resolve_run.go index 52f5c82f..e2a9c745 100644 --- a/command/cmdutil/resolve_run.go +++ b/command/cmdutil/resolve_run.go @@ -223,6 +223,7 @@ type AutoBranchResult struct { PRNumber int // >0 if a PR was detected for the branch UseRepo bool // true when the caller should fall back to repo-level (default branch) data Empty bool // true when there are no results (timeout, no completed runs) + Fallback bool // true when showing results from a previous completed run while a new analysis is in progress } // ResolveAutoBranch encapsulates the shared "default" branch resolution logic @@ -292,6 +293,7 @@ func resolveWithPR( } style.Infof(w, "Analysis is running on commit %s. Showing results from the last analyzed commit (%s).", run.CommitOid[:8], completedRun.CommitOid[:8]) result.CommitOid = completedRun.CommitOid + result.Fallback = true return result, nil } } @@ -342,6 +344,7 @@ func resolveWithoutPR( } style.Infof(w, "Analysis is running on commit %s. Showing results from the last analyzed commit (%s).", commitOid[:8], run.CommitOid[:8]) commitOid = run.CommitOid + result.Fallback = true } if IsRunTimedOut(finalStatus) { style.Warnf(w, "Analysis timed out for branch %q.", branchName) diff --git a/command/issues/issues.go b/command/issues/issues.go index 401081fe..fd6255e5 100644 --- a/command/issues/issues.go +++ b/command/issues/issues.go @@ -42,6 +42,7 @@ type IssuesOptions struct { DefaultBranch bool repoSlug string autoDetectedBranch string + fallback bool issues []issues.Issue deps *cmddeps.Deps client *deepsource.Client @@ -307,6 +308,7 @@ func (opts *IssuesOptions) resolveIssues(ctx context.Context, client *deepsource return nil, nil } opts.autoDetectedBranch = ab.BranchName + opts.fallback = ab.Fallback switch { case ab.PRNumber > 0: opts.PRNumber = ab.PRNumber @@ -561,6 +563,9 @@ func groupIssuesByCategory(issuesList []issues.Issue) map[string][]issues.Issue func (opts *IssuesOptions) outputHuman(_ context.Context) error { if len(opts.issues) == 0 { + if opts.fallback { + return nil + } if opts.hasFilters() { style.Infof(opts.stdout(), "No issues matched the provided filters in %s on %s.", opts.repoSlug, opts.scopeLabel()) } else { diff --git a/command/metrics/metrics.go b/command/metrics/metrics.go index 956f66de..826fe7ae 100644 --- a/command/metrics/metrics.go +++ b/command/metrics/metrics.go @@ -34,6 +34,7 @@ type MetricsOptions struct { LimitArg int repoSlug string autoDetectedBranch string + fallback bool repoMetrics []metrics.RepositoryMetric runMetrics *metrics.RunMetrics prMetrics *metrics.PRMetrics @@ -246,6 +247,7 @@ func (opts *MetricsOptions) resolveMetrics(ctx context.Context, client *deepsour return nil } opts.autoDetectedBranch = ab.BranchName + opts.fallback = ab.Fallback switch { case ab.PRNumber > 0: opts.PRNumber = ab.PRNumber @@ -359,6 +361,9 @@ func (opts *MetricsOptions) outputHuman() error { w := opts.stdout() if len(metricsList) == 0 { + if opts.fallback { + return nil + } style.Infof(w, "No metrics found in %s on %s.", opts.repoSlug, opts.scopeLabel()) return nil } diff --git a/command/vulnerabilities/vulnerabilities.go b/command/vulnerabilities/vulnerabilities.go index 026c9535..0d04ebe2 100644 --- a/command/vulnerabilities/vulnerabilities.go +++ b/command/vulnerabilities/vulnerabilities.go @@ -34,6 +34,7 @@ type VulnerabilitiesOptions struct { SeverityFilters []string repoSlug string autoDetectedBranch string + fallback bool repoVulns []vulnerabilities.VulnerabilityOccurrence runVulns *vulnerabilities.RunVulns prVulns *vulnerabilities.PRVulns @@ -234,6 +235,7 @@ func (opts *VulnerabilitiesOptions) resolveVulnerabilities(ctx context.Context, return nil } opts.autoDetectedBranch = ab.BranchName + opts.fallback = ab.Fallback switch { case ab.PRNumber > 0: opts.PRNumber = ab.PRNumber @@ -342,6 +344,9 @@ func (opts *VulnerabilitiesOptions) outputHuman() error { vulnsList := opts.getVulns() if len(vulnsList) == 0 { + if opts.fallback { + return nil + } if opts.hasFilters() { style.Infof(opts.stdout(), "No vulnerabilities matched the provided filters in %s on %s.", opts.repoSlug, opts.scopeLabel()) } else { From b6c9f87854e4a98b2b8c2bda91100c12213a3095 Mon Sep 17 00:00:00 2001 From: Jai Pradeesh Date: Mon, 2 Mar 2026 12:13:10 -0800 Subject: [PATCH 6/6] Bump version to 2.0.42 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index d3d5bc4f..a31ecb10 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.0.41 +2.0.42