[flutter_tools] handle ERROR_INVALID_FUNCTION when trying to symlink across drives (#136424)
~~Fixes https://github.com/flutter/flutter/issues/136321~~
edit by @andrewkolos: Fixes https://github.com/flutter/flutter/issues/66224
diff --git a/packages/flutter_tools/lib/src/flutter_plugins.dart b/packages/flutter_tools/lib/src/flutter_plugins.dart
index 87880d7..fd38dd7 100644
--- a/packages/flutter_tools/lib/src/flutter_plugins.dart
+++ b/packages/flutter_tools/lib/src/flutter_plugins.dart
@@ -1035,6 +1035,14 @@
: 'You must build from a terminal run as administrator.';
throwToolExit('Building with plugins requires symlink support.\n\n$instructions');
}
+ // ERROR_INVALID_FUNCTION, trying to link across drives, which is not supported
+ if (e.osError?.errorCode == 1) {
+ throwToolExit(
+ 'Creating symlink from $source to $destination failed with '
+ 'ERROR_INVALID_FUNCTION. Try moving your Flutter project to the same '
+ 'drive as your Flutter SDK.',
+ );
+ }
}
}
diff --git a/packages/flutter_tools/test/general.shard/plugins_test.dart b/packages/flutter_tools/test/general.shard/plugins_test.dart
index 811b3fd..8efcbef 100644
--- a/packages/flutter_tools/test/general.shard/plugins_test.dart
+++ b/packages/flutter_tools/test/general.shard/plugins_test.dart
@@ -1690,6 +1690,24 @@
);
});
+ testWithoutContext('Symlink failures instruct developers to have their project on the same drive as their SDK', () async {
+ final Platform platform = FakePlatform(operatingSystem: 'windows');
+ final FakeOperatingSystemUtils os = FakeOperatingSystemUtils('Microsoft Windows [Version 10.0.14972]');
+
+ const FileSystemException e = FileSystemException('', '', OSError('', 1));
+
+ expect(
+ () => handleSymlinkException(
+ e,
+ platform: platform,
+ os: os,
+ source: pubCachePath,
+ destination: ephemeralPackagePath,
+ ),
+ throwsToolExit(message: 'Try moving your Flutter project to the same drive as your Flutter SDK'),
+ );
+ });
+
testWithoutContext('Symlink failures only give instructions for specific errors', () async {
final Platform platform = FakePlatform(operatingSystem: 'windows');
final FakeOperatingSystemUtils os = FakeOperatingSystemUtils('Microsoft Windows [Version 10.0.14393]');