fix(worker): reorder PlanningAggregator checkout/delete and kill git on cancel
Also stub new IWorkerClient planning members in FakeWorkerClient to restore build. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -78,11 +78,13 @@ public sealed class PlanningAggregator
|
||||
|
||||
var integrationBranch = BuildIntegrationBranchName(planning);
|
||||
|
||||
// Reset: delete if exists, then recreate off the target branch.
|
||||
// Reset: checkout target first (so we're never ON the integration branch when deleting it),
|
||||
// then delete if exists, then recreate off the target branch.
|
||||
await _git.CheckoutBranchAsync(repoDir, targetBranch, ct);
|
||||
|
||||
try { await _git.BranchDeleteAsync(repoDir, integrationBranch, force: true, ct); }
|
||||
catch { /* didn't exist */ }
|
||||
|
||||
await _git.CheckoutBranchAsync(repoDir, targetBranch, ct);
|
||||
await GitRawAsync(repoDir, ct, "checkout", "-b", integrationBranch);
|
||||
|
||||
foreach (var child in childSubtasks)
|
||||
@@ -150,7 +152,15 @@ public sealed class PlanningAggregator
|
||||
using var p = System.Diagnostics.Process.Start(psi)!;
|
||||
var stdoutTask = p.StandardOutput.ReadToEndAsync();
|
||||
var stderrTask = p.StandardError.ReadToEndAsync();
|
||||
await p.WaitForExitAsync(ct);
|
||||
try
|
||||
{
|
||||
await p.WaitForExitAsync(ct);
|
||||
}
|
||||
catch (OperationCanceledException)
|
||||
{
|
||||
try { if (!p.HasExited) p.Kill(entireProcessTree: true); } catch { }
|
||||
throw;
|
||||
}
|
||||
var stdout = await stdoutTask;
|
||||
var stderr = await stderrTask;
|
||||
if (p.ExitCode != 0) throw new InvalidOperationException($"git {string.Join(' ', args)} failed: {stderr}");
|
||||
|
||||
@@ -32,6 +32,19 @@ sealed class FakeWorkerClient : IWorkerClient
|
||||
public Task DiscardPlanningSessionAsync(string taskId, CancellationToken ct = default) { DiscardPlanningCalls++; return Task.CompletedTask; }
|
||||
public Task FinalizePlanningSessionAsync(string taskId, bool queueAgentTasks = true, CancellationToken ct = default) { FinalizePlanningCalls++; return Task.CompletedTask; }
|
||||
public Task<int> GetPendingDraftCountAsync(string taskId, CancellationToken ct = default) => Task.FromResult(0);
|
||||
|
||||
public event Action<string, string>? PlanningMergeStartedEvent;
|
||||
public event Action<string, string>? PlanningSubtaskMergedEvent;
|
||||
public event Action<string, string, IReadOnlyList<string>>? PlanningMergeConflictEvent;
|
||||
public event Action<string>? PlanningMergeAbortedEvent;
|
||||
public event Action<string>? PlanningCompletedEvent;
|
||||
|
||||
public Task<MergeTargetsDto?> GetMergeTargetsAsync(string taskId) => Task.FromResult<MergeTargetsDto?>(null);
|
||||
public Task<IReadOnlyList<SubtaskDiffDto>> GetPlanningAggregateAsync(string planningTaskId) => Task.FromResult<IReadOnlyList<SubtaskDiffDto>>(Array.Empty<SubtaskDiffDto>());
|
||||
public Task<CombinedDiffResultDto?> BuildPlanningIntegrationBranchAsync(string planningTaskId, string targetBranch) => Task.FromResult<CombinedDiffResultDto?>(null);
|
||||
public Task MergeAllPlanningAsync(string planningTaskId, string targetBranch) => Task.CompletedTask;
|
||||
public Task ContinuePlanningMergeAsync(string planningTaskId) => Task.CompletedTask;
|
||||
public Task AbortPlanningMergeAsync(string planningTaskId) => Task.CompletedTask;
|
||||
}
|
||||
|
||||
// ── Helper to build VM with pre-seeded Items ──────────────────────────────────
|
||||
|
||||
Reference in New Issue
Block a user