From 9c16b4a7f6527db3f30e79b14a0d066084c8508f Mon Sep 17 00:00:00 2001
From: Peter Scheibel <scheibel1@llnl.gov>
Date: Sat, 29 Jun 2019 16:04:15 -0700
Subject: [PATCH] Allow uninstalling missing packages (#11874)

Remove package access from directory_layout; add regression test to ensure
that specs can be uninstalled without a package being known
---
 lib/spack/spack/directory_layout.py | 11 +++++++----
 lib/spack/spack/test/install.py     | 14 ++++++++++++--
 2 files changed, 19 insertions(+), 6 deletions(-)

diff --git a/lib/spack/spack/directory_layout.py b/lib/spack/spack/directory_layout.py
index 4f77e618ce..60bc18a5b8 100644
--- a/lib/spack/spack/directory_layout.py
+++ b/lib/spack/spack/directory_layout.py
@@ -78,10 +78,13 @@ def path_for_spec(self, spec):
 
         if spec.external:
             return spec.external_path
-        if self.check_upstream and spec.package.installed_upstream:
-            raise SpackError(
-                "Internal error: attempted to call path_for_spec on"
-                " upstream-installed package.")
+        if self.check_upstream:
+            upstream, record = spack.store.db.query_by_spec_hash(
+                spec.dag_hash())
+            if upstream:
+                raise SpackError(
+                    "Internal error: attempted to call path_for_spec on"
+                    " upstream-installed package.")
 
         path = self.relative_path_for_spec(spec)
         assert(not path.startswith(self.root))
diff --git a/lib/spack/spack/test/install.py b/lib/spack/spack/test/install.py
index 79287c2adf..8e1d5c7940 100644
--- a/lib/spack/spack/test/install.py
+++ b/lib/spack/spack/test/install.py
@@ -12,17 +12,27 @@
 from spack.spec import Spec
 
 
-def test_install_and_uninstall(install_mockery, mock_fetch):
+def test_install_and_uninstall(install_mockery, mock_fetch, monkeypatch):
     # Get a basic concrete spec for the trivial install package.
     spec = Spec('trivial-install-test-package')
     spec.concretize()
     assert spec.concrete
 
     # Get the package
-    pkg = spack.repo.get(spec)
+    pkg = spec.package
+
+    def find_nothing(*args):
+        raise spack.repo.UnknownPackageError(
+            'Repo package access is disabled for test')
 
     try:
         pkg.do_install()
+
+        spec._package = None
+        monkeypatch.setattr(spack.repo, 'get', find_nothing)
+        with pytest.raises(spack.repo.UnknownPackageError):
+            spec.package
+
         pkg.do_uninstall()
     except Exception:
         pkg.remove_prefix()
-- 
GitLab