From 41762a823ba1e227d01bdc79eedfce8cc8f24fca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=B9=BF?= Date: Fri, 14 Aug 2026 23:37:04 +0800 Subject: [PATCH] fix(ignore): correctly handle odd/even backslash counts in gitignore trailing spaces Update the trailing space trimming logic to properly handle multiple preceding backslashes per ltrzesniewski's suggestion: - Count the number of consecutive backslashes before each trailing space - If odd count: space is escaped, preserve it and stop trimming - If even count (including zero): space is unescaped, trim it This fixes cases like '\\ ' (two backslashes + space) which should be trimmed to '\\' (escaped backslash), while '\\ ' (three backslashes + space) should be preserved as '\\ ' (escaped backslash + escaped space). Fixes #3485 --- crates/ignore/src/gitignore.rs | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/crates/ignore/src/gitignore.rs b/crates/ignore/src/gitignore.rs index e3c604f98c..00403ce520 100644 --- a/crates/ignore/src/gitignore.rs +++ b/crates/ignore/src/gitignore.rs @@ -454,9 +454,23 @@ impl GitignoreBuilder { if line.starts_with("#") { return Ok(self); } - if !line.ends_with("\\ ") { - line = line.trim_right(); + // Only trim unescaped trailing spaces. + // A space is escaped only if preceded by an ODD number of backslashes. + let mut trimmed = line; + while trimmed.len() > 1 && trimmed.ends_with(' ') { + let before_space = trimmed.len() - 1; + let mut n_backslashes = 0usize; + let mut i = before_space; + while i > 0 && trimmed.as_bytes()[i - 1] == b'\\' { + n_backslashes += 1; + i -= 1; + } + if n_backslashes % 2 == 1 { + break; // Odd number of backslashes: space is escaped + } + trimmed = &trimmed[..before_space]; } + line = trimmed; if line.is_empty() { return Ok(self); }