fix(core) Path reader method readPathFromWorkspace does not respect git/gemini ignore config. (#10073)

Co-authored-by: Tommaso Sciortino <sciortino@gmail.com>
This commit is contained in:
Andrew Riggs
2025-11-05 21:40:54 +00:00
committed by GitHub
parent 1d2f90c7e7
commit 44b8c62db9
2 changed files with 56 additions and 4 deletions

View File

@@ -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 () => {

View File

@@ -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) {