summaryrefslogtreecommitdiff
path: root/packages/core/src/utils/gitUtils.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/core/src/utils/gitUtils.ts')
-rw-r--r--packages/core/src/utils/gitUtils.ts73
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;
+ }
+}