* Get the merge-base commit between the worktree's HEAD and a target branch
(params: GetMergeBaseParams)
| 821 | * Get the merge-base commit between the worktree's HEAD and a target branch |
| 822 | */ |
| 823 | async function handleGetMergeBase(params: GetMergeBaseParams): Promise<GetMergeBaseResponse> { |
| 824 | const startTime = Date.now() |
| 825 | logger.info("[Git:getMergeBase] Finding merge-base", JSON.stringify({ |
| 826 | repoDir: params.repoDir, |
| 827 | workTreeId: params.workTreeId, |
| 828 | targetBranch: params.targetBranch, |
| 829 | })) |
| 830 | |
| 831 | try { |
| 832 | validateRepoDir(params.repoDir) |
| 833 | validateWorkTreeId(params.workTreeId) |
| 834 | |
| 835 | const worktreePath = getWorktreePath(params.workTreeId) |
| 836 | |
| 837 | // Validate worktree exists |
| 838 | if (!fs.existsSync(worktreePath)) { |
| 839 | throw new Error(`Worktree does not exist: ${worktreePath}`) |
| 840 | } |
| 841 | |
| 842 | // Find merge-base between HEAD and target branch |
| 843 | const mergeBaseResult = await execGit(["merge-base", "HEAD", params.targetBranch], worktreePath) |
| 844 | |
| 845 | if (!mergeBaseResult.success) { |
| 846 | throw new Error(`Failed to find merge-base: ${mergeBaseResult.stderr}`) |
| 847 | } |
| 848 | |
| 849 | const mergeBaseCommit = mergeBaseResult.stdout.trim() |
| 850 | if (!mergeBaseCommit) { |
| 851 | throw new Error("No merge-base found") |
| 852 | } |
| 853 | |
| 854 | logger.info("[Git:getMergeBase] Found merge-base", JSON.stringify({ mergeBaseCommit, duration: Date.now() - startTime })) |
| 855 | return { mergeBaseCommit } |
| 856 | } catch (error: any) { |
| 857 | logger.error("[Git:getMergeBase] Error:", JSON.stringify({ error: error.message, stack: error.stack, duration: Date.now() - startTime })) |
| 858 | throw error |
| 859 | } |
| 860 | } |
| 861 | |
| 862 | /** |
| 863 | * Parse stats from a unified diff patch |
no test coverage detected