feat(worker): name task branches <type>/<number>-<slug>
This commit is contained in:
@@ -66,7 +66,7 @@ public class WorktreeManagerTests : IDisposable
|
||||
Assert.NotNull(ctx);
|
||||
Assert.True(Directory.Exists(ctx.WorktreePath));
|
||||
// StartsWith: a folder leaked into the shared %TEMP% root by another test forces the id suffix.
|
||||
Assert.StartsWith($"claudedo/{task.Number}-test-task", ctx.BranchName);
|
||||
Assert.StartsWith($"chore/{task.Number}-test-task", ctx.BranchName);
|
||||
Assert.StartsWith($"{task.Number}-test-task", Path.GetFileName(ctx.WorktreePath));
|
||||
Assert.Equal(repo.BaseCommit, ctx.BaseCommit);
|
||||
|
||||
@@ -147,14 +147,14 @@ public class WorktreeManagerTests : IDisposable
|
||||
var (mgr, _) = await CreateManagerAsync(task, list);
|
||||
|
||||
// A leftover from an earlier DB whose task happened to get the same number and title.
|
||||
var foreign = $"claudedo/{WorktreeManager.NameFor(task, null, false)}";
|
||||
var foreign = $"chore/{WorktreeManager.NameFor(task, null, false)}";
|
||||
GitRepoFixture.RunGit(repo.RepoDir, "branch", foreign, repo.BaseCommit);
|
||||
|
||||
var ctx = await mgr.CreateAsync(task, list, CancellationToken.None);
|
||||
_worktreeCleanups.Add((repo.RepoDir, ctx.WorktreePath));
|
||||
|
||||
var suffixed = $"{WorktreeManager.NameFor(task, null, false)}-{task.Id.Replace("-", "")[..8]}";
|
||||
Assert.Equal($"claudedo/{suffixed}", ctx.BranchName);
|
||||
Assert.Equal($"chore/{suffixed}", ctx.BranchName);
|
||||
Assert.Equal(suffixed, Path.GetFileName(ctx.WorktreePath));
|
||||
Assert.False(string.IsNullOrWhiteSpace(GitRepoFixture.RunGit(repo.RepoDir, "branch", "--list", foreign)));
|
||||
}
|
||||
@@ -176,7 +176,7 @@ public class WorktreeManagerTests : IDisposable
|
||||
|
||||
// Occupy the plain name (-> id-suffixed fallback) and the fallback too, so
|
||||
// `git worktree add -b` hits the "already exists" self-heal path.
|
||||
var branchName = $"claudedo/{WorktreeManager.NameFor(task, null, false)}";
|
||||
var branchName = $"chore/{WorktreeManager.NameFor(task, null, false)}";
|
||||
GitRepoFixture.RunGit(repo.RepoDir, "branch", branchName, repo.BaseCommit);
|
||||
GitRepoFixture.RunGit(repo.RepoDir, "branch", $"{branchName}-{task.Id.Replace("-", "")[..8]}", repo.BaseCommit);
|
||||
|
||||
@@ -330,7 +330,7 @@ public class WorktreeManagerTests : IDisposable
|
||||
await Assert.ThrowsAnyAsync<Exception>(
|
||||
() => mgr.CreateAsync(task, list, CancellationToken.None));
|
||||
|
||||
var branchName = $"claudedo/{WorktreeManager.NameFor(task, null, false)}";
|
||||
var branchName = $"chore/{WorktreeManager.NameFor(task, null, false)}";
|
||||
var branchList = GitRepoFixture.RunGit(repo.RepoDir, "branch", "--list", branchName);
|
||||
Assert.True(string.IsNullOrWhiteSpace(branchList),
|
||||
$"orphaned branch {branchName} should be cleaned up, got: {branchList}");
|
||||
@@ -359,6 +359,72 @@ public class WorktreeManagerTests : IDisposable
|
||||
Assert.True(Directory.Exists(ctx.WorktreePath));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task CreateAsync_CompanyRepoWithTicket_UsesTicketIdAndFeaturePrefix()
|
||||
{
|
||||
if (!GitAvailable) { Assert.True(true, "git not available -- skipping"); return; }
|
||||
|
||||
var repo = CreateRepo();
|
||||
GitRepoFixture.RunGit(repo.RepoDir, "remote", "add", "origin", "https://srv.local/Coll/Proj/_git/Repo");
|
||||
var (task, list) = MakeEntities(repo.RepoDir);
|
||||
task.CommitType = "feat";
|
||||
task.TicketRef = "bandel:412";
|
||||
var (mgr, _) = await CreateManagerAsync(task, list);
|
||||
|
||||
var ctx = await mgr.CreateAsync(task, list, CancellationToken.None);
|
||||
_worktreeCleanups.Add((repo.RepoDir, ctx.WorktreePath));
|
||||
|
||||
Assert.StartsWith("feature/412-test-task", ctx.BranchName);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task CreateAsync_CompanyRepoWithoutTicket_OmitsNumber()
|
||||
{
|
||||
if (!GitAvailable) { Assert.True(true, "git not available -- skipping"); return; }
|
||||
|
||||
var repo = CreateRepo();
|
||||
GitRepoFixture.RunGit(repo.RepoDir, "remote", "add", "origin", "https://srv.local/Coll/Proj/_git/Repo");
|
||||
var (task, list) = MakeEntities(repo.RepoDir);
|
||||
var (mgr, _) = await CreateManagerAsync(task, list);
|
||||
|
||||
var ctx = await mgr.CreateAsync(task, list, CancellationToken.None);
|
||||
_worktreeCleanups.Add((repo.RepoDir, ctx.WorktreePath));
|
||||
|
||||
Assert.StartsWith("chore/test-task", ctx.BranchName);
|
||||
Assert.DoesNotContain($"/{task.Number}-", ctx.BranchName);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task CreateAsync_ChildWithoutTicket_UsesParentTicket()
|
||||
{
|
||||
if (!GitAvailable) { Assert.True(true, "git not available -- skipping"); return; }
|
||||
|
||||
var repo = CreateRepo();
|
||||
var (child, list) = MakeEntities(repo.RepoDir);
|
||||
var parent = new TaskEntity
|
||||
{
|
||||
Id = Guid.NewGuid().ToString(), ListId = list.Id, Title = "parent", CommitType = "feat",
|
||||
TicketRef = "bandel:77", CreatedAt = DateTime.UtcNow,
|
||||
};
|
||||
child.ParentTaskId = parent.Id;
|
||||
|
||||
var db = new DbFixture();
|
||||
_dbFixtures.Add(db);
|
||||
using (var seedCtx = db.CreateContext())
|
||||
{
|
||||
await new ListRepository(seedCtx).AddAsync(list);
|
||||
await new TaskRepository(seedCtx).AddAsync(parent);
|
||||
await new TaskRepository(seedCtx).AddAsync(child);
|
||||
}
|
||||
var mgr = new WorktreeManager(new GitService(), db.CreateFactory(),
|
||||
new WorkerConfig { WorktreeRootStrategy = "sibling" }, NullLogger<WorktreeManager>.Instance);
|
||||
|
||||
var ctx = await mgr.CreateAsync(child, list, CancellationToken.None);
|
||||
_worktreeCleanups.Add((repo.RepoDir, ctx.WorktreePath));
|
||||
|
||||
Assert.StartsWith("chore/77-test-task", ctx.BranchName);
|
||||
}
|
||||
|
||||
private static (TaskEntity task, ListEntity list) MakeEntities(string workingDir)
|
||||
{
|
||||
var listId = Guid.NewGuid().ToString();
|
||||
|
||||
Reference in New Issue
Block a user