mirror of
https://github.com/google-gemini/gemini-cli.git
synced 2026-05-23 12:44:30 +00:00
86 lines
2.0 KiB
TypeScript
86 lines
2.0 KiB
TypeScript
/**
|
|
* @license
|
|
* Copyright 2025 Google LLC
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
import * as fs from 'node:fs';
|
|
import * as path from 'node:path';
|
|
import { spawnAsync } from './shell-utils.js';
|
|
|
|
/**
|
|
* Gets the absolute path to the git directory (.git) for the given working directory.
|
|
* This handles standard git repositories, subdirectories, and worktrees.
|
|
*/
|
|
export async function getAbsoluteGitDir(cwd: string): Promise<string> {
|
|
const result = await spawnAsync('git', ['rev-parse', '--absolute-git-dir'], {
|
|
cwd,
|
|
});
|
|
return result.stdout.trim();
|
|
}
|
|
|
|
/**
|
|
* 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 {
|
|
// 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 {
|
|
return null;
|
|
}
|
|
}
|