diff options
Diffstat (limited to 'packages/core/src/utils/gitUtils.ts')
| -rw-r--r-- | packages/core/src/utils/gitUtils.ts | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/packages/core/src/utils/gitUtils.ts b/packages/core/src/utils/gitUtils.ts new file mode 100644 index 00000000..90ec27aa --- /dev/null +++ b/packages/core/src/utils/gitUtils.ts @@ -0,0 +1,73 @@ +/** + * @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; + } +} |
