feat(worker): add leaveConflictsInTree option to TaskMergeService.MergeAsync
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -51,6 +51,22 @@ public class TaskMergeServiceTests : IDisposable
|
||||
NullLogger<WorktreeManager>.Instance);
|
||||
}
|
||||
|
||||
private static async Task SeedWorktree(
|
||||
DbFixture db, string taskId, string path, string branchName, string baseCommit)
|
||||
{
|
||||
var wt = new WorktreeEntity
|
||||
{
|
||||
TaskId = taskId,
|
||||
Path = path,
|
||||
BranchName = branchName,
|
||||
BaseCommit = baseCommit,
|
||||
State = WorktreeState.Active,
|
||||
CreatedAt = DateTime.UtcNow,
|
||||
};
|
||||
using var ctx = db.CreateContext();
|
||||
await new WorktreeRepository(ctx).AddAsync(wt);
|
||||
}
|
||||
|
||||
private static async Task<(ListEntity list, TaskEntity task)> SeedListAndTask(
|
||||
DbFixture db, string workingDir, TaskStatus status)
|
||||
{
|
||||
@@ -351,6 +367,44 @@ public class TaskMergeServiceTests : IDisposable
|
||||
Assert.Equal("blocked", result.Status);
|
||||
Assert.Contains("switch target branch", result.ErrorMessage ?? "");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task MergeAsync_LeaveConflicts_DoesNotAbortAndReturnsConflictFiles()
|
||||
{
|
||||
if (!GitRepoFixture.IsGitAvailable()) return;
|
||||
|
||||
var db = NewDb();
|
||||
var repo = NewRepo();
|
||||
GitRepoFixture.RunGit(repo.RepoDir, "branch", "-m", "main");
|
||||
|
||||
File.WriteAllText(Path.Combine(repo.RepoDir, "README.md"), "# main change\n");
|
||||
GitRepoFixture.RunGit(repo.RepoDir, "commit", "-am", "main change");
|
||||
|
||||
var wtPath = Path.Combine(Path.GetTempPath(), $"wt_{Guid.NewGuid():N}");
|
||||
_wtCleanups.Add((repo.RepoDir, wtPath));
|
||||
GitRepoFixture.RunGit(repo.RepoDir, "worktree", "add", "-b", "claudedo/t1", wtPath, repo.BaseCommit);
|
||||
File.WriteAllText(Path.Combine(wtPath, "README.md"), "# branch change\n");
|
||||
GitRepoFixture.RunGit(wtPath, "commit", "-am", "branch change");
|
||||
|
||||
var (_, task) = await SeedListAndTask(db, workingDir: repo.RepoDir, status: TaskStatus.Done);
|
||||
await SeedWorktree(db, task.Id, wtPath, "claudedo/t1", repo.BaseCommit);
|
||||
|
||||
var (svc, _) = BuildService(db);
|
||||
|
||||
var result = await svc.MergeAsync(
|
||||
task.Id, "main", removeWorktree: false, "msg",
|
||||
leaveConflictsInTree: true,
|
||||
CancellationToken.None);
|
||||
|
||||
Assert.Equal(TaskMergeService.StatusConflict, result.Status);
|
||||
Assert.Contains("README.md", result.ConflictFiles);
|
||||
|
||||
var midMerge = File.Exists(Path.Combine(repo.RepoDir, ".git", "MERGE_HEAD"));
|
||||
Assert.True(midMerge, "repo should be left in mid-merge state");
|
||||
|
||||
// Cleanup
|
||||
GitRepoFixture.RunGit(repo.RepoDir, "merge", "--abort");
|
||||
}
|
||||
}
|
||||
|
||||
#region Test doubles
|
||||
|
||||
Reference in New Issue
Block a user