[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