fix(rtk/find): detect and group Windows backslash-style find output (#2448)

isPathLike rejected any line with a colon, so Windows absolute paths
(C:\Users\me\a.js) were never recognized and find dumps went uncompacted.
find.js also split only on "/", mis-grouping backslash paths.

- autodetect: treat drive-letter prefix (X:\ or X:/) as path-like before
  the general colon rejection.
- find.js: split on the last "/" or "\" separator and normalize emitted
  directory labels to forward slashes.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Diwak4r
2026-07-09 15:09:41 +07:00
committed by decolua
parent 0c55d49ab6
commit d75471bbbc
3 changed files with 74 additions and 5 deletions

View File

@@ -84,6 +84,11 @@ function isGrepLine(line) {
function isPathLike(line) {
const t = line.trim();
if (t.length === 0) return false;
// A drive-letter prefix (e.g. "C:\Users\me" or "C:/Users/me") marks a
// Windows absolute path, so treat the whole line as path-like. Trailing
// colons (e.g. "C:\path\file.js:10") are tolerated, matching grep-style
// suffixes on Windows dumps.
if (/^[A-Za-z]:[\\/]/.test(t)) return true;
if (t.includes(":")) return false;
return t.startsWith(".") || t.startsWith("/") || t.includes("/");
}

View File

@@ -9,16 +9,17 @@ export function find(input) {
const byDir = new Map();
for (const path of lines) {
const lastSlash = path.lastIndexOf("/");
// Accept both Unix ("/a/b") and Windows ("C:\a\b") separators
const lastSep = Math.max(path.lastIndexOf("/"), path.lastIndexOf("\\"));
let dir;
let basename;
if (lastSlash === -1) {
if (lastSep === -1) {
dir = ".";
basename = path;
} else {
// Rust: PathBuf::from(path).parent().display() + file_name().display()
dir = path.slice(0, lastSlash) || "/";
basename = path.slice(lastSlash + 1);
dir = path.slice(0, lastSep) || "/";
basename = path.slice(lastSep + 1);
}
if (!byDir.has(dir)) byDir.set(dir, []);
byDir.get(dir).push(basename);
@@ -31,7 +32,8 @@ export function find(input) {
const showDirs = dirs.slice(0, FIND_TOTAL_DIR_MAX);
for (const dir of showDirs) {
const files = byDir.get(dir);
out += `${dir}/ (${files.length})\n`;
const dirLabel = dir.replace(/\\/g, "/");
out += `${dirLabel}/ (${files.length})\n`;
const showFiles = files.slice(0, FIND_PER_DIR_MAX);
for (const f of showFiles) out += ` ${f}\n`;
if (files.length > FIND_PER_DIR_MAX) {