Fail gracefully when run inside the pub-cache (#3471)

diff --git a/lib/src/entrypoint.dart b/lib/src/entrypoint.dart
index d250cc0..b536cca 100644
--- a/lib/src/entrypoint.dart
+++ b/lib/src/entrypoint.dart
@@ -224,7 +224,11 @@
     bool withPubspecOverrides = true,
   })  : root = Package.load(null, rootDir, cache.sources,
             withPubspecOverrides: withPubspecOverrides),
-        globalDir = null;
+        globalDir = null {
+    if (p.isWithin(cache.rootDir, rootDir)) {
+      fail('Cannot operate on packages inside the cache.');
+    }
+  }
 
   Entrypoint.inMemory(this.root, this.cache,
       {required LockFile? lockFile, SolveResult? solveResult})
diff --git a/test/descriptor.dart b/test/descriptor.dart
index 9248ad4..0b11de9 100644
--- a/test/descriptor.dart
+++ b/test/descriptor.dart
@@ -188,11 +188,12 @@
 /// If [port] is passed, it's used as the port number of the local hosted server
 /// that this cache represents. It defaults to [globalServer.port].
 Descriptor hostedCache(Iterable<Descriptor> contents, {int? port}) {
-  return dir(cachePath, [
-    dir('hosted', [dir('localhost%58${port ?? globalServer.port}', contents)])
-  ]);
+  return dir(hostedCachePath(port: port), contents);
 }
 
+String hostedCachePath({int? port}) =>
+    p.join(cachePath, 'hosted', 'localhost%58${port ?? globalServer.port}');
+
 /// Describes the file that contains the client's OAuth2
 /// credentials. The URL "/token" on [server] will be used as the token
 /// endpoint for refreshing the access token.
diff --git a/test/get/get_inside_cache_fails_test.dart b/test/get/get_inside_cache_fails_test.dart
new file mode 100644
index 0000000..a7a6b45
--- /dev/null
+++ b/test/get/get_inside_cache_fails_test.dart
@@ -0,0 +1,27 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:path/path.dart' as p;
+import 'package:test/test.dart';
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+void main() {
+  test('`pub get` inside the cache fails gracefully', () async {
+    final server = await servePackages();
+    server.serve('foo', '1.0.0', pubspec: {
+      'name': 'foo',
+      'version': '1.0.0',
+      'environment': {'sdk': '>=0.1.2+3 <0.2.0'}
+    });
+    await d.appDir({'foo': 'any'}).create();
+
+    await pubGet();
+
+    await pubGet(
+        workingDirectory: p.join(d.sandbox, d.hostedCachePath(), 'foo-1.0.0'),
+        error: 'Cannot operate on packages inside the cache.');
+  });
+}