summaryrefslogtreecommitdiff
path: root/packages/cli/src/utils/loadIgnorePatterns.ts
diff options
context:
space:
mode:
authorEddie Santos <[email protected]>2025-06-05 10:15:27 -0700
committerGitHub <[email protected]>2025-06-05 10:15:27 -0700
commit422c763a55c28394df359bd9b31388c8d9765fc8 (patch)
treefefda70212927409936ad326de5ec50ad515bfea /packages/cli/src/utils/loadIgnorePatterns.ts
parent1d20cedf033f9c9a8f27812020fead584510bf84 (diff)
Add support for `.geminiignore` file (#757)
Diffstat (limited to 'packages/cli/src/utils/loadIgnorePatterns.ts')
-rw-r--r--packages/cli/src/utils/loadIgnorePatterns.ts71
1 files changed, 71 insertions, 0 deletions
diff --git a/packages/cli/src/utils/loadIgnorePatterns.ts b/packages/cli/src/utils/loadIgnorePatterns.ts
new file mode 100644
index 00000000..3d0a1968
--- /dev/null
+++ b/packages/cli/src/utils/loadIgnorePatterns.ts
@@ -0,0 +1,71 @@
+/**
+ * @license
+ * Copyright 2025 Google LLC
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+import * as fs from 'node:fs';
+import * as path from 'node:path';
+
+const GEMINI_IGNORE_FILE_NAME = '.geminiignore';
+
+/**
+ * Loads and parses a .geminiignore file from the given workspace root.
+ * The .geminiignore file follows a format similar to .gitignore:
+ * - Each line specifies a glob pattern.
+ * - Lines are trimmed of leading and trailing whitespace.
+ * - Blank lines (after trimming) are ignored.
+ * - Lines starting with a pound sign (#) (after trimming) are treated as comments and ignored.
+ * - Patterns are case-sensitive and follow standard glob syntax.
+ * - If a # character appears elsewhere in a line (not at the start after trimming),
+ * it is considered part of the glob pattern.
+ *
+ * @param workspaceRoot The absolute path to the workspace root where the .geminiignore file is expected.
+ * @returns An array of glob patterns extracted from the .geminiignore file. Returns an empty array
+ * if the file does not exist or contains no valid patterns.
+ */
+export function loadGeminiIgnorePatterns(workspaceRoot: string): string[] {
+ const ignoreFilePath = path.join(workspaceRoot, GEMINI_IGNORE_FILE_NAME);
+ const patterns: string[] = [];
+
+ try {
+ const fileContent = fs.readFileSync(ignoreFilePath, 'utf-8');
+ const lines = fileContent.split(/\r?\n/);
+
+ for (const line of lines) {
+ const trimmedLine = line.trim();
+ if (trimmedLine && !trimmedLine.startsWith('#')) {
+ patterns.push(trimmedLine);
+ }
+ }
+ if (patterns.length > 0) {
+ console.log(
+ `[INFO] Loaded ${patterns.length} patterns from .geminiignore`,
+ );
+ }
+ } catch (error: unknown) {
+ if (
+ error instanceof Error &&
+ 'code' in error &&
+ typeof error.code === 'string'
+ ) {
+ if (error.code === 'ENOENT') {
+ // .geminiignore not found, which is fine.
+ console.log(
+ '[INFO] No .geminiignore file found. Proceeding without custom ignore patterns.',
+ );
+ } else {
+ // Other error reading the file (e.g., permissions)
+ console.warn(
+ `[WARN] Could not read .geminiignore file at ${ignoreFilePath}: ${error.message}`,
+ );
+ }
+ } else {
+ // For other types of errors, or if code is not available
+ console.warn(
+ `[WARN] An unexpected error occurred while trying to read ${ignoreFilePath}: ${String(error)}`,
+ );
+ }
+ }
+ return patterns;
+}