fix(actions): nil pointer dereference in concurrency during PR creation #137

Merged
jmiller merged 1 commits from fix/136-actions-concurrency-nil-panic into main 2026-05-24 03:26:43 +00:00
3 changed files with 16 additions and 6 deletions
+7 -2
View File
@@ -35,11 +35,16 @@ func EvaluateRunConcurrencyFillModel(ctx context.Context, run *actions_model.Act
}
}
var err error
attempt.ConcurrencyGroup, attempt.ConcurrencyCancel, err = jobparser.EvaluateConcurrency(wfRawConcurrency, "", nil, actionsRunCtx, jobResults, vars, inputs)
concurrencyGroup, concurrencyCancel, err := jobparser.EvaluateConcurrency(wfRawConcurrency, "", nil, actionsRunCtx, jobResults, vars, inputs)
if err != nil {
return fmt.Errorf("evaluate concurrency: %w", err)
}
run.ConcurrencyGroup = concurrencyGroup
run.ConcurrencyCancel = concurrencyCancel
if attempt != nil {
attempt.ConcurrencyGroup = concurrencyGroup
attempt.ConcurrencyCancel = concurrencyCancel
}
return nil
}
+6 -2
View File
@@ -31,11 +31,15 @@ func TestEvaluateRunConcurrency_RunIDFallback(t *testing.T) {
CancelInProgress: "true",
}
assert.NoError(t, EvaluateRunConcurrencyFillModel(ctx, runA, expr, nil, nil))
assert.NoError(t, EvaluateRunConcurrencyFillModel(ctx, runB, expr, nil, nil))
attemptA := &actions_model.ActionRunAttempt{RunID: runA.ID, RepoID: runA.RepoID}
attemptB := &actions_model.ActionRunAttempt{RunID: runB.ID, RepoID: runB.RepoID}
assert.NoError(t, EvaluateRunConcurrencyFillModel(ctx, runA, attemptA, expr, nil, nil))
assert.NoError(t, EvaluateRunConcurrencyFillModel(ctx, runB, attemptB, expr, nil, nil))
assert.Contains(t, runA.ConcurrencyGroup, "791")
assert.Contains(t, runB.ConcurrencyGroup, "792")
assert.Equal(t, runA.ConcurrencyGroup, attemptA.ConcurrencyGroup)
assert.Equal(t, runB.ConcurrencyGroup, attemptB.ConcurrencyGroup)
assert.NotEqual(t, runA.ConcurrencyGroup, runB.ConcurrencyGroup)
}
+3 -2
View File
@@ -88,10 +88,11 @@ func InsertRun(ctx context.Context, run *actions_model.ActionRun, content []byte
}
if wfRawConcurrency != nil {
if err := EvaluateRunConcurrencyFillModel(ctx, run, nil, wfRawConcurrency, vars, inputs); err != nil {
attempt := &actions_model.ActionRunAttempt{RunID: run.ID, RepoID: run.RepoID}
if err := EvaluateRunConcurrencyFillModel(ctx, run, attempt, wfRawConcurrency, vars, inputs); err != nil {
return fmt.Errorf("EvaluateRunConcurrencyFillModel: %w", err)
}
run.Status, _, err = PrepareToStartRunWithConcurrency(ctx, &actions_model.ActionRunAttempt{RunID: run.ID})
run.Status, _, err = PrepareToStartRunWithConcurrency(ctx, attempt)
if err != nil {
return err
}