diff --git a/internal/agents/tasks.go b/internal/agents/tasks.go index ba8610e..c963dcf 100644 --- a/internal/agents/tasks.go +++ b/internal/agents/tasks.go @@ -119,6 +119,17 @@ func (m *Manager) createTask(ctx context.Context, project api.Project, t api.Tas t.Status = api.TaskStatusActive t.CreatedAt = time.Now().UTC() + if base == project.DefaultBranch { + creator, err := m.store.GetUser(ctx, t.CreatedBy) + if err != nil { + return api.Task{}, err + } + err = git.EnsureBranchCommit(ctx, project.RepoPath, base, git.IdentityEnv(creator.GitName, creator.GitEmail)) + if err != nil { + return api.Task{}, err + } + } + var err error t.BaseRef, err = git.AddWorktree(ctx, project.RepoPath, t.WorktreePath, t.Branch, base) if err != nil { diff --git a/internal/git/git.go b/internal/git/git.go index c5e96f8..a35cb19 100644 --- a/internal/git/git.go +++ b/internal/git/git.go @@ -75,6 +75,27 @@ func AddWorktree(ctx context.Context, repo, path, branch, base string) (string, return sha, nil } +func EnsureBranchCommit(ctx context.Context, repo, branch string, env []string) error { + _, _, code, err := runCode(ctx, repo, nil, "rev-parse", "--verify", "--quiet", "refs/heads/"+branch+"^{commit}") + if err != nil || code == 0 { + return err + } + refs, err := run(ctx, repo, "for-each-ref", "--count=1") + if err != nil || refs != "" { + return err + } + tree, err := run(ctx, repo, "mktree") + if err != nil { + return err + } + commit, err := runEnv(ctx, repo, env, "commit-tree", tree, "-m", "Initial commit") + if err != nil { + return err + } + _, err = run(ctx, repo, "update-ref", "refs/heads/"+branch, commit, "") + return err +} + func AddDetachedWorktree(ctx context.Context, repo, path, commit string) error { _, err := run(ctx, repo, "worktree", "add", "--detach", path, commit) return err