| /** | |
| * @license | |
| * Copyright 2025 Google LLC | |
| * SPDX-License-Identifier: Apache-2.0 | |
| */ | |
| import * as fs from 'fs'; | |
| import * as path from 'path'; | |
| /** | |
| * Checks if a directory is within a git repository | |
| * @param directory The directory to check | |
| * @returns true if the directory is in a git repository, false otherwise | |
| */ | |
| export function isGitRepository(directory: string): boolean { | |
| try { | |
| let currentDir = path.resolve(directory); | |
| while (true) { | |
| const gitDir = path.join(currentDir, '.git'); | |
| // Check if .git exists (either as directory or file for worktrees) | |
| if (fs.existsSync(gitDir)) { | |
| return true; | |
| } | |
| const parentDir = path.dirname(currentDir); | |
| // If we've reached the root directory, stop searching | |
| if (parentDir === currentDir) { | |
| break; | |
| } | |
| currentDir = parentDir; | |
| } | |
| return false; | |
| } catch (_error) { | |
| // If any filesystem error occurs, assume not a git repo | |
| return false; | |
| } | |
| } | |
| /** | |
| * Finds the root directory of a git repository | |
| * @param directory Starting directory to search from | |
| * @returns The git repository root path, or null if not in a git repository | |
| */ | |
| export function findGitRoot(directory: string): string | null { | |
| try { | |
| let currentDir = path.resolve(directory); | |
| while (true) { | |
| const gitDir = path.join(currentDir, '.git'); | |
| if (fs.existsSync(gitDir)) { | |
| return currentDir; | |
| } | |
| const parentDir = path.dirname(currentDir); | |
| if (parentDir === currentDir) { | |
| break; | |
| } | |
| currentDir = parentDir; | |
| } | |
| return null; | |
| } catch (_error) { | |
| return null; | |
| } | |
| } | |