setupWorktree creates the git worktree requested by --worktree or --worktree-pr, returning nil when neither was given. The returned worktree (when non-nil) becomes the session's working directory and is cleaned up when an interactive run ends.
(ctx context.Context, wd string)
| 579 | // (when non-nil) becomes the session's working directory and is cleaned up |
| 580 | // when an interactive run ends. |
| 581 | func (f *runExecFlags) setupWorktree(ctx context.Context, wd string) (*worktree.Worktree, error) { |
| 582 | switch { |
| 583 | case f.worktreePR != "": |
| 584 | wt, err := worktree.CreatePR(ctx, wd, f.worktreePR) |
| 585 | if err != nil { |
| 586 | switch { |
| 587 | case errors.Is(err, worktree.ErrNotGitRepository): |
| 588 | return nil, fmt.Errorf("--worktree-pr requires %s to be inside a git repository", wd) |
| 589 | case errors.Is(err, worktree.ErrInvalidPRRef): |
| 590 | return nil, fmt.Errorf("invalid --worktree-pr value: %w", err) |
| 591 | case errors.Is(err, worktree.ErrGHNotFound): |
| 592 | return nil, fmt.Errorf("--worktree-pr requires the GitHub CLI: %w", err) |
| 593 | default: |
| 594 | return nil, err |
| 595 | } |
| 596 | } |
| 597 | return wt, nil |
| 598 | |
| 599 | case f.worktree: |
| 600 | name := f.worktreeName |
| 601 | if name == worktreeAutoName { |
| 602 | name = "" |
| 603 | } |
| 604 | wt, err := worktree.Create(ctx, wd, name, worktree.WithBase(f.worktreeBase)) |
| 605 | if err != nil { |
| 606 | switch { |
| 607 | case errors.Is(err, worktree.ErrNotGitRepository): |
| 608 | return nil, fmt.Errorf("--worktree requires %s to be inside a git repository", wd) |
| 609 | case errors.Is(err, worktree.ErrInvalidName): |
| 610 | return nil, fmt.Errorf("invalid --worktree name: %w", err) |
| 611 | case errors.Is(err, worktree.ErrInvalidBase): |
| 612 | return nil, fmt.Errorf("invalid --worktree-base: %w", err) |
| 613 | default: |
| 614 | return nil, err |
| 615 | } |
| 616 | } |
| 617 | return wt, nil |
| 618 | |
| 619 | default: |
| 620 | return nil, nil |
| 621 | } |
| 622 | } |
| 623 | |
| 624 | // cleanupWorktree removes a worktree created for an interactive run once it |
| 625 | // ends. A clean worktree (no uncommitted changes, untracked files, or new |
no test coverage detected