From de91c95e8e45b8ab066ba3dfc8f89c92da761b5a Mon Sep 17 00:00:00 2001
From: Todd Gamblin <tgamblin@llnl.gov>
Date: Tue, 20 Jan 2015 15:07:53 -0800
Subject: [PATCH] Ability to ignore files in activate/deactivate for
 extensions.

---
 lib/spack/llnl/util/link_tree.py      | 11 ++++-------
 lib/spack/spack/package.py            | 16 +++++++++-------
 var/spack/packages/py-nose/package.py |  4 +++-
 var/spack/packages/python/package.py  | 17 ++++++++++-------
 4 files changed, 26 insertions(+), 22 deletions(-)

diff --git a/lib/spack/llnl/util/link_tree.py b/lib/spack/llnl/util/link_tree.py
index 19c2d46938..2d7126be2c 100644
--- a/lib/spack/llnl/util/link_tree.py
+++ b/lib/spack/llnl/util/link_tree.py
@@ -72,8 +72,7 @@ def traverse(self, dest_root, **kwargs):
 
         order=[pre|post] -- Whether to do pre- or post-order traveral.
 
-        ignore=<container> -- Optional container of root-relative
-                              paths to ignore.
+        ignore=<predicate> -- Predicate indicating which files to ignore.
 
         follow_nonexisting -- Whether to descend into directories in
                               src that do not exit in dest.
@@ -85,9 +84,7 @@ def traverse(self, dest_root, **kwargs):
             raise ValueError("Order must be 'pre' or 'post'.")
 
         # List of relative paths to ignore under the src root.
-        ignore = kwargs.get('ignore', None)
-        if isinstance(ignore, basestring):
-            ignore = (ignore,)
+        ignore = kwargs.get('ignore', lambda filename: False)
 
         # Whether to descend when dirs dont' exist in dest.
         follow_nonexisting = kwargs.get('follow_nonexisting', True)
@@ -98,7 +95,7 @@ def traverse(self, dest_root, **kwargs):
             dest_dirpath = os.path.join(dest_root, rel_path)
 
             # Don't descend into ignored directories
-            if ignore and dest_dirpath in ignore:
+            if ignore(dest_dirpath):
                 return
 
             # Don't descend into dirs in dest that do not exist in src.
@@ -118,7 +115,7 @@ def traverse(self, dest_root, **kwargs):
                 # Ignore particular paths inside the install root.
                 src_relpath = src_file[len(self._root):]
                 src_relpath = src_relpath.lstrip(os.path.sep)
-                if ignore and src_relpath in ignore:
+                if ignore(src_relpath):
                     continue
 
                 yield (src_file, dest_file)
diff --git a/lib/spack/spack/package.py b/lib/spack/spack/package.py
index bd63c2e0c0..43b1fcd9c8 100644
--- a/lib/spack/spack/package.py
+++ b/lib/spack/spack/package.py
@@ -995,14 +995,15 @@ def activate(self, extension, **kwargs):
         always executed.
 
         """
-        ignore_files = set(spack.install_layout.hidden_file_paths)
-        ignore_files.update(kwargs.get('ignore', ()))
+        def ignore(filename):
+            return (filename in spack.install_layout.hidden_file_paths or
+                    kwargs.get('ignore', lambda f: False)(filename))
 
         tree = LinkTree(extension.prefix)
-        conflict = tree.find_conflict(self.prefix, ignore=ignore_files)
+        conflict = tree.find_conflict(self.prefix, ignore=ignore)
         if conflict:
             raise ExtensionConflictError(conflict)
-        tree.merge(self.prefix, ignore=ignore_files)
+        tree.merge(self.prefix, ignore=ignore)
 
 
     def do_deactivate(self):
@@ -1026,11 +1027,12 @@ def deactivate(self, extension, **kwargs):
         always executed.
 
         """
-        ignore_files = set(spack.install_layout.hidden_file_paths)
-        ignore_files.update(kwargs.get('ignore', ()))
+        def ignore(filename):
+            return (filename in spack.install_layout.hidden_file_paths or
+                    kwargs.get('ignore', lambda f: False)(filename))
 
         tree = LinkTree(extension.prefix)
-        tree.unmerge(self.prefix, ignore=ignore_files)
+        tree.unmerge(self.prefix, ignore=ignore)
 
 
     def do_clean(self):
diff --git a/var/spack/packages/py-nose/package.py b/var/spack/packages/py-nose/package.py
index 7bd7106b8c..6df84e831d 100644
--- a/var/spack/packages/py-nose/package.py
+++ b/var/spack/packages/py-nose/package.py
@@ -1,7 +1,9 @@
 from spack import *
 
 class PyNose(Package):
-    """nose extends the test loading and running features of unittest, making it easier to write, find and run tests."""
+    """nose extends the test loading and running features of unittest,
+    making it easier to write, find and run tests."""
+
     homepage = "https://pypi.python.org/pypi/nose"
     url      = "https://pypi.python.org/packages/source/n/nose/nose-1.3.4.tar.gz"
 
diff --git a/var/spack/packages/python/package.py b/var/spack/packages/python/package.py
index 86b903bc23..a22bd54c82 100644
--- a/var/spack/packages/python/package.py
+++ b/var/spack/packages/python/package.py
@@ -1,5 +1,6 @@
 from spack import *
 import os
+import re
 
 class Python(Package):
     """The Python programming language."""
@@ -59,19 +60,21 @@ def setup_extension_environment(self, module, spec, ext_spec):
         mkdirp(module.site_packages_dir)
 
 
-    def add_ignore_files(self, args):
+    def make_ignore(self, args):
         """Add some ignore files to activate/deactivate args."""
-        ignore  = set(args.get('ignore', ()))
-        ignore.add(os.path.join(self.site_packages_dir, 'site.py'))
-        ignore.add(os.path.join(self.site_packages_dir, 'site.pyc'))
-        args.update(ignore=ignore)
+        orig_ignore = args.get('ignore', lambda f: False)
+        def ignore(filename):
+            return (re.search(r'/site\.pyc?$', filename) or
+                    re.search(r'\.pth$', filename) or
+                    orig_ignore(filename))
+        return ignore
 
 
     def activate(self, ext_pkg, **args):
-        self.add_ignore_files(args)
+        args.update(ignore=self.make_ignore(args))
         super(Python, self).activate(ext_pkg, **args)
 
 
     def deactivate(self, ext_pkg, **args):
-        self.add_ignore_files(args)
+        args.update(ignore=self.make_ignore(args))
         super(Python, self).deactivate(ext_pkg, **args)
-- 
GitLab