From 544af867e953ed566c2138b172993cf526375001 Mon Sep 17 00:00:00 2001 From: gjsjohnmurray Date: Fri, 4 Oct 2024 12:52:10 +0100 Subject: [PATCH 1/2] Make Explorer Find widget work in 1.94 as long as proposed APIs are enabled (fix #1443) --- .../FileSystemProvider/FileSearchProvider.ts | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/providers/FileSystemProvider/FileSearchProvider.ts b/src/providers/FileSystemProvider/FileSearchProvider.ts index db9c0f52..704eb226 100644 --- a/src/providers/FileSystemProvider/FileSearchProvider.ts +++ b/src/providers/FileSystemProvider/FileSearchProvider.ts @@ -18,6 +18,11 @@ export class FileSearchProvider implements vscode.FileSearchProvider { ): Promise { let counter = 0; let pattern = query.pattern.charAt(0) == "/" ? query.pattern.slice(1) : query.pattern; + + // Drop a leading **/ from the glob pattern if it exists (added by Find widget of Explorer tree, which since 1.94 uses FileSearchProvider) + if (pattern.startsWith("**/")) { + pattern = pattern.slice(3); + } const params = new URLSearchParams(options.folder.query); const csp = params.has("csp") && ["", "1"].includes(params.get("csp")); if (params.has("project") && params.get("project").length) { @@ -44,13 +49,17 @@ export class FileSearchProvider implements vscode.FileSearchProvider { // When this is called without a query.pattern, every file is supposed to be returned, so do not provide a filter let filter = ""; if (pattern.length) { - pattern = !csp ? query.pattern.replace(/\//g, ".") : query.pattern; + let escapeClause = ""; + pattern = !csp ? pattern.replace(/\//g, ".") : pattern; if (pattern.includes("_") || pattern.includes("%")) { // Need to escape any % or _ characters - filter = `Name LIKE '%${pattern.replace(/(_|%|\\)/g, "\\$1")}%' ESCAPE '\\'`; - } else { - filter = `Name LIKE '%${pattern}%'`; + pattern = pattern.replace(/(_|%|\\)/g, "\\$1"); + escapeClause = " ESCAPE '\\'"; } + // Change glob syntax to SQL LIKE syntax + pattern = pattern.replace(/\*/g, "%"); + pattern = pattern.replace(/\?/g, "_"); + filter = `Name LIKE '%${pattern}%'${escapeClause}`; } if (token.isCancellationRequested) { return; From 2b08554d4241cb8b2ed0b760f42bbcd7a80dce9f Mon Sep 17 00:00:00 2001 From: gjsjohnmurray Date: Fri, 4 Oct 2024 13:28:45 +0100 Subject: [PATCH 2/2] Adopt feedback --- .../FileSystemProvider/FileSearchProvider.ts | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/src/providers/FileSystemProvider/FileSearchProvider.ts b/src/providers/FileSystemProvider/FileSearchProvider.ts index 704eb226..3feece08 100644 --- a/src/providers/FileSystemProvider/FileSearchProvider.ts +++ b/src/providers/FileSystemProvider/FileSearchProvider.ts @@ -49,17 +49,13 @@ export class FileSearchProvider implements vscode.FileSearchProvider { // When this is called without a query.pattern, every file is supposed to be returned, so do not provide a filter let filter = ""; if (pattern.length) { - let escapeClause = ""; pattern = !csp ? pattern.replace(/\//g, ".") : pattern; - if (pattern.includes("_") || pattern.includes("%")) { - // Need to escape any % or _ characters - pattern = pattern.replace(/(_|%|\\)/g, "\\$1"); - escapeClause = " ESCAPE '\\'"; - } - // Change glob syntax to SQL LIKE syntax - pattern = pattern.replace(/\*/g, "%"); - pattern = pattern.replace(/\?/g, "_"); - filter = `Name LIKE '%${pattern}%'${escapeClause}`; + filter = `Name LIKE '%${pattern + // Escape % or _ characters + .replace(/(_|%|\\)/g, "\\$1") + // Change glob syntax to SQL LIKE syntax + .replace(/\*/g, "%") + .replace(/\?/g, "_")}%' ESCAPE '\\'`; } if (token.isCancellationRequested) { return;