From a9e189972a547fb5f7996f0f5acafc1200702b72 Mon Sep 17 00:00:00 2001
From: Todd Gamblin <tgamblin@llnl.gov>
Date: Wed, 4 Feb 2015 15:42:41 -0800
Subject: Bugfix in spak extensions

---
 lib/spack/spack/cmd/extensions.py | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

(limited to 'lib')

diff --git a/lib/spack/spack/cmd/extensions.py b/lib/spack/spack/cmd/extensions.py
index f6ccd7b515..3b189895b0 100644
--- a/lib/spack/spack/cmd/extensions.py
+++ b/lib/spack/spack/cmd/extensions.py
@@ -93,5 +93,5 @@ def extensions(parser, args):
     if not activated:
         tty.msg("None activated.")
         return
-    tty.msg("%d currently activated:" % len(exts))
-    spack.cmd.find.display_specs(installed, mode=args.mode)
+    tty.msg("%d currently activated:" % len(activated))
+    spack.cmd.find.display_specs(activated, mode=args.mode)
-- 
cgit v1.2.3-70-g09d2


From 3a3e4d4391977327bca18c416205971dd6a85509 Mon Sep 17 00:00:00 2001
From: Todd Gamblin <tgamblin@llnl.gov>
Date: Wed, 4 Feb 2015 15:47:03 -0800
Subject: Do not automatically activate extensions on install.

---
 lib/spack/spack/hooks/extensions.py | 8 ++------
 1 file changed, 2 insertions(+), 6 deletions(-)

(limited to 'lib')

diff --git a/lib/spack/spack/hooks/extensions.py b/lib/spack/spack/hooks/extensions.py
index 718b24b965..9d6fa23d03 100644
--- a/lib/spack/spack/hooks/extensions.py
+++ b/lib/spack/spack/hooks/extensions.py
@@ -26,15 +26,11 @@
 import spack
 
 
-def post_install(pkg):
-    if pkg.is_extension:
-        pkg.do_activate()
-
-
 def pre_uninstall(pkg):
     # Need to do this b/c uninstall does not automatically do it.
     # TODO: store full graph info in stored .spec file.
     pkg.spec.normalize()
 
     if pkg.is_extension:
-        pkg.do_deactivate()
+        if pkg.activated:
+            pkg.do_deactivate()
-- 
cgit v1.2.3-70-g09d2


From befe72b9b9d1f4107eef8f24e6f194f27a15bca4 Mon Sep 17 00:00:00 2001
From: Todd Gamblin <tgamblin@llnl.gov>
Date: Sun, 8 Feb 2015 19:36:30 -0800
Subject: directory_layout now raises an error when an install fails.

---
 lib/spack/spack/directory_layout.py | 20 ++++++++++++++++++--
 1 file changed, 18 insertions(+), 2 deletions(-)

(limited to 'lib')

diff --git a/lib/spack/spack/directory_layout.py b/lib/spack/spack/directory_layout.py
index efc40a17a4..37740720a2 100644
--- a/lib/spack/spack/directory_layout.py
+++ b/lib/spack/spack/directory_layout.py
@@ -109,12 +109,17 @@ class DirectoryLayout(object):
 
 
     def remove_path_for_spec(self, spec):
-        """Removes a prefix and any empty parent directories from the root."""
+        """Removes a prefix and any empty parent directories from the root.
+           Raised RemoveFailedError if something goes wrong.
+        """
         path = self.path_for_spec(spec)
         assert(path.startswith(self.root))
 
         if os.path.exists(path):
-            shutil.rmtree(path, True)
+            try:
+                shutil.rmtree(path)
+            except exceptions.OSError, e:
+                raise RemoveFailedError(spec, path, e)
 
         path = os.path.dirname(path)
         while path != self.root:
@@ -330,6 +335,15 @@ class SpecHashCollisionError(DirectoryLayoutError):
             % installed_spec, new_spec)
 
 
+class RemoveFailedError(DirectoryLayoutError):
+    """Raised when a DirectoryLayout cannot remove an install prefix."""
+    def __init__(self, installed_spec, prefix, error):
+        super(RemoveFailedError, self).__init__(
+            'Could not remove prefix %s for %s : %s'
+            % prefix, installed_spec.short_spec, error)
+        self.cause = error
+
+
 class InconsistentInstallDirectoryError(DirectoryLayoutError):
     """Raised when a package seems to be installed to the wrong place."""
     def __init__(self, message):
@@ -370,3 +384,5 @@ class NoSuchExtensionError(DirectoryLayoutError):
         super(NoSuchExtensionError, self).__init__(
             "%s cannot be removed from %s because it's not installed."% (
                 extension_spec.short_spec, spec.short_spec))
+
+
-- 
cgit v1.2.3-70-g09d2


From 60a385d4a44b16bce77725dbb4f71a26aa610ffc Mon Sep 17 00:00:00 2001
From: Todd Gamblin <tgamblin@llnl.gov>
Date: Sun, 8 Feb 2015 19:40:28 -0800
Subject: Minor textual error in extensions command.

---
 lib/spack/spack/cmd/extensions.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

(limited to 'lib')

diff --git a/lib/spack/spack/cmd/extensions.py b/lib/spack/spack/cmd/extensions.py
index 3b189895b0..c6b6145321 100644
--- a/lib/spack/spack/cmd/extensions.py
+++ b/lib/spack/spack/cmd/extensions.py
@@ -82,7 +82,7 @@ def extensions(parser, args):
     installed  = [s.spec for s in spack.db.installed_extensions_for(spec)]
     print
     if not installed:
-        tty.msg("None activated.")
+        tty.msg("None installed.")
         return
     tty.msg("%d installed:" % len(installed))
     spack.cmd.find.display_specs(installed, mode=args.mode)
-- 
cgit v1.2.3-70-g09d2


From 20ec80295dbf2a36b633860c139d113f9c0e6388 Mon Sep 17 00:00:00 2001
From: Todd Gamblin <tgamblin@llnl.gov>
Date: Sun, 8 Feb 2015 19:41:17 -0800
Subject: setup_extension_environment is now setup_dependent_environment.

- other packages, like Qt, can now use this to set up relevant build
  variables and env vars for their dependencies.

- not just extensions anymore.
---
 lib/spack/spack/package.py           | 14 ++++++++------
 var/spack/packages/python/package.py |  2 +-
 var/spack/packages/qt/package.py     |  6 ++++++
 3 files changed, 15 insertions(+), 7 deletions(-)

(limited to 'lib')

diff --git a/lib/spack/spack/package.py b/lib/spack/spack/package.py
index b905968540..6e319a1f87 100644
--- a/lib/spack/spack/package.py
+++ b/lib/spack/spack/package.py
@@ -829,10 +829,10 @@ class Package(object):
                 self.stage.chdir_to_source()
                 build_env.setup_package(self)
 
-                # Allow extendees to further set up the environment.
-                if self.is_extension:
-                    self.extendee_spec.package.setup_extension_environment(
-                        self.module, self.extendee_spec, self.spec)
+                # Allow dependencies to further set up the environment.
+                for dep_spec in self.spec.traverse(root=False):
+                    dep_spec.package.setup_dependent_environment(
+                        self.module, dep_spec, self.spec)
 
                 if fake_install:
                     self.do_fake_install()
@@ -910,8 +910,8 @@ class Package(object):
                           fromlist=[self.__class__.__name__])
 
 
-    def setup_extension_environment(self, module, spec, ext_spec):
-        """Called before the install() method of extensions.
+    def setup_dependent_environment(self, module, spec, dependent_spec):
+        """Called before the install() method of dependents.
 
         Default implementation does nothing, but this can be
         overridden by an extendable package to set up the install
@@ -930,6 +930,8 @@ class Package(object):
            put a 'python' Execuable object in the module scope for the
            extension package to simplify extension installs.
 
+        3. A lot of Qt extensions need QTDIR set.  This can be used to do that.
+
         """
         pass
 
diff --git a/var/spack/packages/python/package.py b/var/spack/packages/python/package.py
index 8bffbf393c..eed81d095c 100644
--- a/var/spack/packages/python/package.py
+++ b/var/spack/packages/python/package.py
@@ -46,7 +46,7 @@ class Python(Package):
         return os.path.join(self.python_lib_dir, 'site-packages')
 
 
-    def setup_extension_environment(self, module, spec, ext_spec):
+    def setup_dependent_environment(self, module, spec, ext_spec):
         """Called before python modules' install() methods.
 
         In most cases, extensions will only need to have one line::
diff --git a/var/spack/packages/qt/package.py b/var/spack/packages/qt/package.py
index 6a55c89701..fcbcd2491a 100644
--- a/var/spack/packages/qt/package.py
+++ b/var/spack/packages/qt/package.py
@@ -1,3 +1,4 @@
+import os
 from spack import *
 
 class Qt(Package):
@@ -20,6 +21,11 @@ class Qt(Package):
     depends_on("libmng")
     depends_on("jpeg")
 
+    def setup_dependent_environment(self, module, spec, dep_spec):
+        """Dependencies of Qt find it using the QTDIR environment variable."""
+        os.environ['QTDIR'] = self.prefix
+
+
     def patch(self):
         # Fix qmake compilers in the default mkspec
         qmake_conf = 'mkspecs/common/g++-base.conf'
-- 
cgit v1.2.3-70-g09d2


From f81b136547347997d043bd99adf9d7013f097c69 Mon Sep 17 00:00:00 2001
From: Todd Gamblin <tgamblin@llnl.gov>
Date: Sun, 8 Feb 2015 19:43:10 -0800
Subject: import fix in cmd/clean

---
 lib/spack/spack/cmd/clean.py | 1 +
 1 file changed, 1 insertion(+)

(limited to 'lib')

diff --git a/lib/spack/spack/cmd/clean.py b/lib/spack/spack/cmd/clean.py
index 79dd91c5bf..ec3b221988 100644
--- a/lib/spack/spack/cmd/clean.py
+++ b/lib/spack/spack/cmd/clean.py
@@ -23,6 +23,7 @@
 # Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 ##############################################################################
 from external import argparse
+import subprocess
 
 import llnl.util.tty as tty
 
-- 
cgit v1.2.3-70-g09d2


From c077f0570531aac76b9182a96a2a37ee0e633989 Mon Sep 17 00:00:00 2001
From: Todd Gamblin <tgamblin@llnl.gov>
Date: Sun, 8 Feb 2015 22:01:00 -0800
Subject: Move dpeendency environment setup to build_environemnt.

---
 lib/spack/spack/build_environment.py | 5 +++++
 lib/spack/spack/package.py           | 5 -----
 2 files changed, 5 insertions(+), 5 deletions(-)

(limited to 'lib')

diff --git a/lib/spack/spack/build_environment.py b/lib/spack/spack/build_environment.py
index 45353ec640..cabde7dc86 100644
--- a/lib/spack/spack/build_environment.py
+++ b/lib/spack/spack/build_environment.py
@@ -207,3 +207,8 @@ def setup_package(pkg):
     set_compiler_environment_variables(pkg)
     set_build_environment_variables(pkg)
     set_module_variables_for_package(pkg)
+
+    # Allow dependencies to set up environment as well.
+    for dep_spec in pkg.spec.traverse(root=False):
+        dep_spec.package.setup_dependent_environment(
+            pkg.module, dep_spec, pkg.spec)
diff --git a/lib/spack/spack/package.py b/lib/spack/spack/package.py
index 6e319a1f87..b18d054990 100644
--- a/lib/spack/spack/package.py
+++ b/lib/spack/spack/package.py
@@ -829,11 +829,6 @@ class Package(object):
                 self.stage.chdir_to_source()
                 build_env.setup_package(self)
 
-                # Allow dependencies to further set up the environment.
-                for dep_spec in self.spec.traverse(root=False):
-                    dep_spec.package.setup_dependent_environment(
-                        self.module, dep_spec, self.spec)
-
                 if fake_install:
                     self.do_fake_install()
                 else:
-- 
cgit v1.2.3-70-g09d2


From aae364b4c9ffdf8949a8c7ce5a7e63c9772703c0 Mon Sep 17 00:00:00 2001
From: Todd Gamblin <tgamblin@llnl.gov>
Date: Sun, 8 Feb 2015 23:26:15 -0800
Subject: "spack extensions" shows total extension count.

---
 lib/spack/spack/cmd/extensions.py | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

(limited to 'lib')

diff --git a/lib/spack/spack/cmd/extensions.py b/lib/spack/spack/cmd/extensions.py
index c6b6145321..ae73d8ac55 100644
--- a/lib/spack/spack/cmd/extensions.py
+++ b/lib/spack/spack/cmd/extensions.py
@@ -75,7 +75,8 @@ def extensions(parser, args):
     if not extensions:
         tty.msg("%s has no extensions." % spec.cshort_spec)
         return
-    tty.msg("%s extensions:" % spec.cshort_spec)
+    tty.msg(spec.cshort_spec)
+    tty.msg("%d extensions:" % len(extensions))
     colify(ext.name for ext in extensions)
 
     # List specs of installed extensions.
-- 
cgit v1.2.3-70-g09d2