74 lines
1.6 KiB
TypeScript
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;
|
|
}
|
|
}
|