| 548 | } |
| 549 | |
| 550 | func (f *runExecFlags) loadTeamInWorktree(ctx context.Context, b backend, wd string) (*teamloader.LoadResult, *worktree.Worktree, string, error) { |
| 551 | createdWorktree, err := f.setupWorktree(ctx, wd) |
| 552 | if err != nil { |
| 553 | return nil, nil, wd, err |
| 554 | } |
| 555 | if createdWorktree != nil { |
| 556 | wd = createdWorktree.Dir |
| 557 | f.runConfig.WorkingDir = createdWorktree.Dir |
| 558 | } |
| 559 | |
| 560 | loadResult, err := b.LoadTeam(ctx, b.LoadTeamRequest()) |
| 561 | if err != nil { |
| 562 | // The worktree was created before the load; tear it down so a load |
| 563 | // failure doesn't leave an orphaned worktree behind. A fresh context |
| 564 | // is used because the load may have failed on a cancelled ctx (Ctrl-C), |
| 565 | // which would otherwise kill the git removal subprocess and orphan the |
| 566 | // worktree. |
| 567 | if createdWorktree != nil { |
| 568 | if rmErr := createdWorktree.Remove(context.WithoutCancel(ctx)); rmErr != nil { |
| 569 | slog.WarnContext(ctx, "Failed to remove worktree after load error", "dir", createdWorktree.Dir, "error", rmErr) |
| 570 | } |
| 571 | } |
| 572 | return nil, nil, wd, err |
| 573 | } |
| 574 | return loadResult, createdWorktree, wd, nil |
| 575 | } |
| 576 | |
| 577 | // setupWorktree creates the git worktree requested by --worktree or |
| 578 | // --worktree-pr, returning nil when neither was given. The returned worktree |