gemini-cli/packages/core/src/utils/gitUtils.ts

74 lines
1.6 KiB
TypeScript

/**
* @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;
}
}