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,
+    );
+  });
 }