diff --git a/packages/core/src/utils/pathReader.test.ts b/packages/core/src/utils/pathReader.test.ts index 45229a678b..0aa4e308e1 100644 --- a/packages/core/src/utils/pathReader.test.ts +++ b/packages/core/src/utils/pathReader.test.ts @@ -20,7 +20,12 @@ const createMockConfig = ( cwd: string, otherDirs: string[] = [], mockFileService?: FileDiscoveryService, + fileFiltering: { + respectGitIgnore?: boolean; + respectGeminiIgnore?: boolean; + } = {}, ): Config => { + const { respectGitIgnore = true, respectGeminiIgnore = true } = fileFiltering; const workspace = new WorkspaceContext(cwd, otherDirs); const fileSystemService = new StandardFileSystemService(); return { @@ -29,6 +34,8 @@ const createMockConfig = ( getTargetDir: () => cwd, getFileSystemService: () => fileSystemService, getFileService: () => mockFileService, + getFileFilteringRespectGitIgnore: () => respectGitIgnore, + getFileFilteringRespectGeminiIgnore: () => respectGeminiIgnore, } as unknown as Config; }; @@ -333,6 +340,51 @@ describe('readPathFromWorkspace', () => { expect(resultText).not.toContain('invisible'); expect(mockFileService.filterFiles).toHaveBeenCalled(); }); + + it('should pass correct ignore flags to file service for a single file', async () => { + mock({ + [CWD]: { + 'file.txt': 'content', + }, + }); + const mockFileService = { + filterFiles: vi.fn(() => []), + } as unknown as FileDiscoveryService; + const config = createMockConfig(CWD, [], mockFileService, { + respectGitIgnore: false, + respectGeminiIgnore: true, + }); + await readPathFromWorkspace('file.txt', config); + expect(mockFileService.filterFiles).toHaveBeenCalledWith(['file.txt'], { + respectGitIgnore: false, + respectGeminiIgnore: true, + }); + }); + + it('should pass correct ignore flags to file service for a directory', async () => { + mock({ + [CWD]: { + 'my-dir': { + 'file.txt': 'content', + }, + }, + }); + const mockFileService = { + filterFiles: vi.fn((files) => files), + } as unknown as FileDiscoveryService; + const config = createMockConfig(CWD, [], mockFileService, { + respectGitIgnore: true, + respectGeminiIgnore: false, + }); + await readPathFromWorkspace('my-dir', config); + expect(mockFileService.filterFiles).toHaveBeenCalledWith( + [path.join('my-dir', 'file.txt')], + { + respectGitIgnore: true, + respectGeminiIgnore: false, + }, + ); + }); }); it('should throw an error for an absolute path outside the workspace', async () => { diff --git a/packages/core/src/utils/pathReader.ts b/packages/core/src/utils/pathReader.ts index 1b177848db..486ce2a821 100644 --- a/packages/core/src/utils/pathReader.ts +++ b/packages/core/src/utils/pathReader.ts @@ -73,8 +73,8 @@ export async function readPathFromWorkspace( path.relative(config.getTargetDir(), p), ); const filteredFiles = fileService.filterFiles(relativeFiles, { - respectGitIgnore: true, - respectGeminiIgnore: true, + respectGitIgnore: config.getFileFilteringRespectGitIgnore(), + respectGeminiIgnore: config.getFileFilteringRespectGeminiIgnore(), }); const finalFiles = filteredFiles.map((p) => path.resolve(config.getTargetDir(), p), @@ -98,8 +98,8 @@ export async function readPathFromWorkspace( // It's a single file, check if it's ignored. const relativePath = path.relative(config.getTargetDir(), absolutePath); const filtered = fileService.filterFiles([relativePath], { - respectGitIgnore: true, - respectGeminiIgnore: true, + respectGitIgnore: config.getFileFilteringRespectGitIgnore(), + respectGeminiIgnore: config.getFileFilteringRespectGeminiIgnore(), }); if (filtered.length === 0) {