Fix `global deactivate` on case-insensitive but case-preserving file systems (#3774)
diff --git a/lib/src/global_packages.dart b/lib/src/global_packages.dart
index 8925e28..e3b03af 100644
--- a/lib/src/global_packages.dart
+++ b/lib/src/global_packages.dart
@@ -340,7 +340,19 @@
/// Returns `false` if no package with [name] was currently active.
bool deactivate(String name) {
var dir = p.join(_directory, name);
- if (!dirExists(dir)) return false;
+ if (!dirExists(_directory)) {
+ return false;
+ }
+ // By listing all files instead of using only `dirExists` this check will
+ // work on case-preserving file-systems.
+ final files = listDir(_directory);
+ if (!files.contains(dir)) {
+ return false;
+ }
+ if (!dirExists(dir)) {
+ // This can happen if `dir` was really a file.
+ return false;
+ }
_deleteBinStubs(name);
diff --git a/test/global/deactivate/unknown_package_test.dart b/test/global/deactivate/unknown_package_test.dart
index 9b55042..2a8c297 100644
--- a/test/global/deactivate/unknown_package_test.dart
+++ b/test/global/deactivate/unknown_package_test.dart
@@ -17,4 +17,15 @@
exitCode: exit_codes.DATA,
);
});
+
+ test('errors if the package exists with another casing', () async {
+ final server = await servePackages();
+ server.serve('foo', '1.0.0');
+ await runPub(args: ['global', 'activate', 'foo']);
+ await runPub(
+ args: ['global', 'deactivate', 'Foo'],
+ error: 'No active package Foo.',
+ exitCode: exit_codes.DATA,
+ );
+ });
}