From 57f60508d4d5cad1059e9b6cd75ba27f25bdd4d6 Mon Sep 17 00:00:00 2001 From: anisherdev Date: Wed, 11 Nov 2026 14:28:43 +0530 Subject: [PATCH] fix: handle paths with escaped spaces in Cargo dep-info files Cargo and rustc emit Makefile-compatible dep-info (.d) files where spaces within paths are escaped with backslashes (\\ \). Previously, \DependencyDiscoverer\ used \line.trim().split(' ').skip(1)\, which erroneously split paths containing spaces (such as Windows user profiles or folders with spaces) into separate invalid tokens. This caused Flutter's native assets hook runner to fail with a directory listing error when watching dependencies. This change: - Unescapes Make-style escaped spaces (\\ \ -> space) while splitting dependencies only on unescaped whitespace. - Normalizes Make-style line continuations (\\\\ followed by a newline). - Adds unit test coverage for escaped spaces and line continuations. --- .../lib/src/dependency_discoverer.dart | 26 ++++++++++++++++--- .../test/dependency_discoverer_test.dart | 24 +++++++++++++++++ 2 files changed, 46 insertions(+), 4 deletions(-) diff --git a/native_toolchain_rust/lib/src/dependency_discoverer.dart b/native_toolchain_rust/lib/src/dependency_discoverer.dart index 8d63e61..7fed304 100644 --- a/native_toolchain_rust/lib/src/dependency_discoverer.dart +++ b/native_toolchain_rust/lib/src/dependency_discoverer.dart @@ -21,9 +21,27 @@ interface class DependencyDiscoverer { /// coverage for incremental rebuilds. Iterable discover(String dependencyFilePath) { logger.fine('Discovering dependencies in $dependencyFilePath'); - return File(dependencyFilePath) - .readAsLinesSync() - .expand((line) => line.trim().split(' ').skip(1)) - .map(path.toUri); + final rawContent = File(dependencyFilePath).readAsStringSync(); + // Normalize line continuations (backslash followed by newline). + final normalized = rawContent.replaceAll(RegExp(r'\\\r?\n'), ' '); + final result = []; + for (final line in normalized.split(RegExp(r'\r?\n'))) { + final trimmed = line.trim(); + if (trimmed.isEmpty) continue; + final colonIndex = trimmed.indexOf(': '); + final depsString = colonIndex != -1 + ? trimmed.substring(colonIndex + 2) + : trimmed; + // Cargo/Make dep-info escapes spaces in file paths with a backslash ('\ '). + // Split only on whitespace that is not preceded by a backslash. + final rawTokens = depsString.split(RegExp(r'(?