From 416f3bb65888902a63564ddfe524041f01281e4e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 21 Jul 2026 06:12:59 +0000 Subject: [PATCH 1/2] Propagate cancellation in audit analysis soft-failure paths Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- pkg/cli/audit.go | 9 +++++++++ pkg/cli/audit_concurrency_test.go | 25 +++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/pkg/cli/audit.go b/pkg/cli/audit.go index e615bb7aa2d..ed54b07f471 100644 --- a/pkg/cli/audit.go +++ b/pkg/cli/audit.go @@ -675,6 +675,9 @@ func collectAuditAnalysisResults(ctx context.Context, run WorkflowRun, runOutput if err := g.Wait(); err != nil { return results, err } + if err := ctx.Err(); err != nil { + return results, err + } return results, nil } @@ -743,6 +746,9 @@ func launchJobDetailsAnalysis(g *errgroup.Group, gctx context.Context, results * } jobDetails, failedJobCount, err := fetchJobDetailsWithCounts(gctx, runID, verbose) if err != nil { + if err := gctx.Err(); err != nil { + return err + } auditLog.Printf("fetchJobDetailsWithCounts failed: %v", err) if verbose { fmt.Fprintln(os.Stderr, console.FormatWarningMessage(fmt.Sprintf("Failed to fetch job details: %v", err))) @@ -839,6 +845,9 @@ func runAuditAnalysis[T any](g *errgroup.Group, gctx context.Context, verbose bo } value, err := fn() if err != nil { + if err := gctx.Err(); err != nil { + return err + } auditLog.Printf("%s failed: %v", name, err) if verbose { fmt.Fprintln(os.Stderr, console.FormatWarningMessage(fmt.Sprintf("%s: %v", warning, err))) diff --git a/pkg/cli/audit_concurrency_test.go b/pkg/cli/audit_concurrency_test.go index 9198ab85b09..08880644e91 100644 --- a/pkg/cli/audit_concurrency_test.go +++ b/pkg/cli/audit_concurrency_test.go @@ -35,3 +35,28 @@ func TestRunAuditAnalysisSoftFailuresRemainNonFatal(t *testing.T) { t.Fatal("expected setter not to be called on soft failure") } } + +func TestRunAuditAnalysisReturnsCancellationForSoftFailuresWhenContextCanceled(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + g, gctx := errgroup.WithContext(ctx) + called := false + started := make(chan struct{}) + + runAuditAnalysis(g, gctx, false, "test", "test warning", func(v int) { + called = true + }, func() (int, error) { + close(started) + <-gctx.Done() + return 0, errors.New("soft failure") + }) + + <-started + cancel() + + if err := g.Wait(); !errors.Is(err, context.Canceled) { + t.Fatalf("expected context canceled error for canceled context soft failure, got %v", err) + } + if called { + t.Fatal("expected setter not to be called when context is canceled") + } +} From 3a0f501009780bb92e8f58e90d1375017fd5fc24 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 21 Jul 2026 06:24:01 +0000 Subject: [PATCH 2/2] Simplify context cancellation checks in audit fanout Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- pkg/cli/audit.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pkg/cli/audit.go b/pkg/cli/audit.go index ed54b07f471..927c0f60b5b 100644 --- a/pkg/cli/audit.go +++ b/pkg/cli/audit.go @@ -675,8 +675,8 @@ func collectAuditAnalysisResults(ctx context.Context, run WorkflowRun, runOutput if err := g.Wait(); err != nil { return results, err } - if err := ctx.Err(); err != nil { - return results, err + if ctx.Err() != nil { + return results, ctx.Err() } return results, nil } @@ -746,8 +746,8 @@ func launchJobDetailsAnalysis(g *errgroup.Group, gctx context.Context, results * } jobDetails, failedJobCount, err := fetchJobDetailsWithCounts(gctx, runID, verbose) if err != nil { - if err := gctx.Err(); err != nil { - return err + if gctx.Err() != nil { + return gctx.Err() } auditLog.Printf("fetchJobDetailsWithCounts failed: %v", err) if verbose { @@ -845,8 +845,8 @@ func runAuditAnalysis[T any](g *errgroup.Group, gctx context.Context, verbose bo } value, err := fn() if err != nil { - if err := gctx.Err(); err != nil { - return err + if gctx.Err() != nil { + return gctx.Err() } auditLog.Printf("%s failed: %v", name, err) if verbose {