summaryrefslogtreecommitdiff
path: root/packages/core/src
diff options
context:
space:
mode:
authorSandy Tao <[email protected]>2025-08-20 13:51:49 -0700
committerGitHub <[email protected]>2025-08-20 20:51:49 +0000
commit6aff66f501cb6b124bafc4158b1b56640481cf34 (patch)
tree734c8c2441daeb8f1a8aef522b4f3e102425038c /packages/core/src
parentb4ecdd67ec74da8599275649e281a9dd873ac314 (diff)
feat(core): Handle special characters in file search paths (#6680)
Diffstat (limited to 'packages/core/src')
-rw-r--r--packages/core/src/utils/filesearch/fileSearch.test.ts29
-rw-r--r--packages/core/src/utils/filesearch/fileSearch.ts3
2 files changed, 31 insertions, 1 deletions
diff --git a/packages/core/src/utils/filesearch/fileSearch.test.ts b/packages/core/src/utils/filesearch/fileSearch.test.ts
index 2deea82d..316f17ec 100644
--- a/packages/core/src/utils/filesearch/fileSearch.test.ts
+++ b/packages/core/src/utils/filesearch/fileSearch.test.ts
@@ -566,6 +566,35 @@ describe('FileSearch', () => {
expect(limitedResults).toEqual(['file1.js', 'file2.js']);
});
+ it('should handle file paths with special characters that need escaping', async () => {
+ tmpDir = await createTmpDir({
+ src: {
+ 'file with (special) chars.txt': '',
+ 'another-file.txt': '',
+ },
+ });
+
+ const fileSearch = FileSearchFactory.create({
+ projectRoot: tmpDir,
+ useGitignore: false,
+ useGeminiignore: false,
+ ignoreDirs: [],
+ cache: false,
+ cacheTtl: 0,
+ enableRecursiveFileSearch: true,
+ });
+
+ await fileSearch.initialize();
+
+ // Search for the file using a pattern that contains special characters.
+ // The `unescapePath` function should handle the escaped path correctly.
+ const results = await fileSearch.search(
+ 'src/file with \\(special\\) chars.txt',
+ );
+
+ expect(results).toEqual(['src/file with (special) chars.txt']);
+ });
+
describe('DirectoryFileSearch', () => {
it('should search for files in the current directory', async () => {
tmpDir = await createTmpDir({
diff --git a/packages/core/src/utils/filesearch/fileSearch.ts b/packages/core/src/utils/filesearch/fileSearch.ts
index fa36dab4..876d37f0 100644
--- a/packages/core/src/utils/filesearch/fileSearch.ts
+++ b/packages/core/src/utils/filesearch/fileSearch.ts
@@ -10,6 +10,7 @@ import { Ignore, loadIgnoreRules } from './ignore.js';
import { ResultCache } from './result-cache.js';
import { crawl } from './crawler.js';
import { AsyncFzf, FzfResultItem } from 'fzf';
+import { unescapePath } from '../paths.js';
export interface FileSearchOptions {
projectRoot: string;
@@ -116,7 +117,7 @@ class RecursiveFileSearch implements FileSearch {
throw new Error('Engine not initialized. Call initialize() first.');
}
- pattern = pattern || '*';
+ pattern = unescapePath(pattern) || '*';
let filteredCandidates;
const { files: candidates, isExactMatch } =