[flutter_tools] fix path escaping on in depfile generation (#50538)
diff --git a/packages/flutter_tools/lib/src/build_system/depfile.dart b/packages/flutter_tools/lib/src/build_system/depfile.dart
index 6ae6021..7a50704 100644
--- a/packages/flutter_tools/lib/src/build_system/depfile.dart
+++ b/packages/flutter_tools/lib/src/build_system/depfile.dart
@@ -74,11 +74,15 @@
void _writeFilesToBuffer(List<File> files, StringBuffer buffer) {
for (final File outputFile in files) {
if (globals.platform.isWindows) {
- // Paths in a depfile have to be escaped on windows.
- final String escapedPath = outputFile.path.replaceAll(r'\', r'\\');
- buffer.write(' $escapedPath');
+ // Foward slashes and spaces in a depfile have to be escaped on windows.
+ final String path = outputFile.path
+ .replaceAll(r'\', r'\\')
+ .replaceAll(r' ', r'\ ');
+ buffer.write(' $path');
} else {
- buffer.write(' ${outputFile.path}');
+ final String path = outputFile.path
+ .replaceAll(r' ', r'\ ');
+ buffer.write(' $path');
}
}
}
diff --git a/packages/flutter_tools/test/general.shard/build_system/depfile_test.dart b/packages/flutter_tools/test/general.shard/build_system/depfile_test.dart
index 60331fa..1f31c4a 100644
--- a/packages/flutter_tools/test/general.shard/build_system/depfile_test.dart
+++ b/packages/flutter_tools/test/general.shard/build_system/depfile_test.dart
@@ -6,6 +6,7 @@
import 'package:flutter_tools/src/base/file_system.dart';
import 'package:flutter_tools/src/build_system/depfile.dart';
import 'package:flutter_tools/src/globals.dart' as globals;
+import 'package:platform/platform.dart';
import '../../src/common.dart';
import '../../src/testbed.dart';
@@ -66,6 +67,39 @@
FileSystem: () => MemoryFileSystem(style: FileSystemStyle.windows),
}));
+ test('Can escape depfile with windows file paths and spaces in directory names', () => testbed.run(() {
+ final File inputFile = globals.fs.directory(r'Hello Flutter').childFile('a.txt').absolute
+ ..createSync(recursive: true);
+ final File outputFile = globals.fs.directory(r'Hello Flutter').childFile('b.txt').absolute
+ ..createSync();
+ final Depfile depfile = Depfile(<File>[inputFile], <File>[outputFile]);
+ final File outputDepfile = globals.fs.file('depfile');
+ depfile.writeToFile(outputDepfile);
+
+ expect(outputDepfile.readAsStringSync(), contains(r'C:\\Hello\ Flutter\\a.txt'));
+ expect(outputDepfile.readAsStringSync(), contains(r'C:\\Hello\ Flutter\\b.txt'));
+ }, overrides: <Type, Generator>{
+ FileSystem: () => MemoryFileSystem(style: FileSystemStyle.windows),
+ Platform: () => FakePlatform(operatingSystem: 'windows'),
+ }));
+
+ test('Can escape depfile with spaces in directory names', () => testbed.run(() {
+ final File inputFile = globals.fs.directory(r'Hello Flutter').childFile('a.txt').absolute
+ ..createSync(recursive: true);
+ final File outputFile = globals.fs.directory(r'Hello Flutter').childFile('b.txt').absolute
+ ..createSync();
+ final Depfile depfile = Depfile(<File>[inputFile], <File>[outputFile]);
+ final File outputDepfile = globals.fs.file('depfile');
+ depfile.writeToFile(outputDepfile);
+
+ expect(outputDepfile.readAsStringSync(), contains(r'/Hello\ Flutter/a.txt'));
+ expect(outputDepfile.readAsStringSync(), contains(r'/Hello\ Flutter/b.txt'));
+ }, overrides: <Type, Generator>{
+ FileSystem: () => MemoryFileSystem(style: FileSystemStyle.posix),
+ Platform: () => FakePlatform(operatingSystem: 'linux'),
+ }));
+
+
test('Resillient to weird whitespace', () => testbed.run(() {
final File depfileSource = globals.fs.file('example.d')..writeAsStringSync(r'''
a.txt