diff options
| author | Eddie Santos <[email protected]> | 2025-06-05 10:15:27 -0700 |
|---|---|---|
| committer | GitHub <[email protected]> | 2025-06-05 10:15:27 -0700 |
| commit | 422c763a55c28394df359bd9b31388c8d9765fc8 (patch) | |
| tree | fefda70212927409936ad326de5ec50ad515bfea /packages/cli/src/utils/loadIgnorePatterns.ts | |
| parent | 1d20cedf033f9c9a8f27812020fead584510bf84 (diff) | |
Add support for `.geminiignore` file (#757)
Diffstat (limited to 'packages/cli/src/utils/loadIgnorePatterns.ts')
| -rw-r--r-- | packages/cli/src/utils/loadIgnorePatterns.ts | 71 |
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; +} |
