fix(worker): block approve of a planning parent with an unfinished child, surface git stderr on ff failure

This commit is contained in:
mika kuns
2026-10-01 11:36:45 +02:00
parent a353897345
commit acd188bca9
5 changed files with 40 additions and 3 deletions
@@ -214,6 +214,7 @@ public sealed class UnitBranchTests : IDisposable
Assert.Equal(TaskStatus.Failed, child.Status);
Assert.Equal(movedHead, GitRepoFixture.RunGit(_repo.RepoDir, "rev-parse", unit.BranchName).Trim());
Assert.Contains("fast-forward", child.Result);
Assert.Contains("Not possible to fast-forward", child.Result); // git's own stderr is surfaced
Assert.Equal(WorktreeState.Active, (await WorktreeOf(Child1))!.State);
}
@@ -233,6 +234,23 @@ public sealed class UnitBranchTests : IDisposable
Assert.Equal(WorktreeState.Merged, (await WorktreeOf(Parent))!.State);
}
[Fact]
public async Task Approving_a_planning_parent_with_an_unfinished_child_is_blocked()
{
await _unit.EnsureUnitWorktreeAsync(Parent, default);
await RunChild(Child1, Writes());
await SetStatus(Child2, TaskStatus.Failed);
await SetStatus(Parent, TaskStatus.WaitingForReview);
var result = await MergeService().ApproveAndMergeAsync(Parent, "main", default);
Assert.Equal(TaskMergeService.StatusBlocked, result.Status);
Assert.Equal($"subtask {Child2} is not Done (status Failed)", result.ErrorMessage);
Assert.Equal(TaskStatus.WaitingForReview, (await TaskOf(Parent)).Status);
Assert.Equal(WorktreeState.Active, (await WorktreeOf(Parent))!.State);
Assert.Equal(_repo.BaseCommit, GitRepoFixture.RunGit(_repo.RepoDir, "rev-parse", "main").Trim());
}
[Fact]
public async Task Approving_an_interactive_child_absorbs_it_instead_of_merging_to_main()
{