summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorhealther <healther@users.noreply.github.com>2018-02-02 23:45:21 +0100
committerscheibelp <scheibel1@llnl.gov>2018-02-02 14:45:21 -0800
commite3951c2a2157d05c6e191270a0e3f846dc077234 (patch)
tree437c94417565903f3f75f9561f15951560620676 /lib
parent0b6d7f7397642b48c5bb693c8bda3f2039a6de96 (diff)
downloadspack-e3951c2a2157d05c6e191270a0e3f846dc077234.tar.gz
spack-e3951c2a2157d05c6e191270a0e3f846dc077234.tar.bz2
spack-e3951c2a2157d05c6e191270a0e3f846dc077234.tar.xz
spack-e3951c2a2157d05c6e191270a0e3f846dc077234.zip
Fix ignore-conflicts for extensions in views (#7167)
Fixes #7159 When activating extensions in external views, the --ignore-conflicts option was being ignored. In this particular issue the conflict was for the duplicate __init__ file for multiple python packages in the same namespace, but in general any conflict for extensions would cause an error whether or not --ignore-conflicts was set. This also renames the 'force' option of do_activate to 'with_dependencies' and updates views to call do_activate with this set to False (since it traverses the dependency dag anyway). This isn't strictly required, it just avoids redundant calls.
Diffstat (limited to 'lib')
-rw-r--r--lib/spack/spack/cmd/activate.py3
-rw-r--r--lib/spack/spack/filesystem_view.py5
-rw-r--r--lib/spack/spack/package.py29
3 files changed, 28 insertions, 9 deletions
diff --git a/lib/spack/spack/cmd/activate.py b/lib/spack/spack/cmd/activate.py
index a5909df9fb..12a743161d 100644
--- a/lib/spack/spack/cmd/activate.py
+++ b/lib/spack/spack/cmd/activate.py
@@ -61,4 +61,5 @@ def activate(parser, args):
if spec.package.is_activated(extensions_layout=layout):
tty.die("Package %s is already activated." % specs[0].short_spec)
- spec.package.do_activate(extensions_layout=layout)
+ spec.package.do_activate(extensions_layout=layout,
+ with_dependencies=not args.force)
diff --git a/lib/spack/spack/filesystem_view.py b/lib/spack/spack/filesystem_view.py
index 9be55e381b..1c6e5f0523 100644
--- a/lib/spack/spack/filesystem_view.py
+++ b/lib/spack/spack/filesystem_view.py
@@ -94,7 +94,7 @@ class FilesystemView(object):
def add_extension(self, spec):
"""
- Add (link) an extension in this view.
+ Add (link) an extension in this view. Does not add dependencies.
"""
raise NotImplementedError
@@ -228,6 +228,9 @@ class YamlFilesystemView(FilesystemView):
try:
if not spec.package.is_activated(self.extensions_layout):
spec.package.do_activate(
+ ignore_conflicts=self.ignore_conflicts,
+ with_dependencies=False, # already taken care of
+ # in add_specs()
verbose=self.verbose,
extensions_layout=self.extensions_layout)
diff --git a/lib/spack/spack/package.py b/lib/spack/spack/package.py
index f0f092015f..f7cb3b0253 100644
--- a/lib/spack/spack/package.py
+++ b/lib/spack/spack/package.py
@@ -1825,12 +1825,17 @@ class PackageBase(with_metaclass(PackageMeta, object)):
raise ActivationError("%s does not extend %s!" %
(self.name, self.extendee.name))
- def do_activate(self, force=False, verbose=True, extensions_layout=None):
+ def do_activate(self, with_dependencies=True, ignore_conflicts=False,
+ verbose=True, extensions_layout=None):
"""Called on an extension to invoke the extendee's activate method.
Commands should call this routine, and should not call
activate() directly.
"""
+ if verbose:
+ tty.msg("Activating extension %s for %s" %
+ (self.spec.cshort_spec, self.extendee_spec.cshort_spec))
+
self._sanity_check_extension()
if extensions_layout is None:
@@ -1840,16 +1845,19 @@ class PackageBase(with_metaclass(PackageMeta, object)):
self.extendee_spec, self.spec)
# Activate any package dependencies that are also extensions.
- if not force:
+ if with_dependencies:
for spec in self.dependency_activations():
if not spec.package.is_activated(
extensions_layout=extensions_layout):
spec.package.do_activate(
- force=force, verbose=verbose,
+ with_dependencies=with_dependencies,
+ ignore_conflicts=ignore_conflicts,
+ verbose=verbose,
extensions_layout=extensions_layout)
self.extendee_spec.package.activate(
- self, extensions_layout=extensions_layout, **self.extendee_args)
+ self, extensions_layout=extensions_layout,
+ ignore_conflicts=ignore_conflicts, **self.extendee_args)
extensions_layout.add_extension(self.extendee_spec, self.spec)
@@ -1863,7 +1871,7 @@ class PackageBase(with_metaclass(PackageMeta, object)):
return (spec for spec in self.spec.traverse(root=False, deptype='run')
if spec.package.extends(self.extendee_spec))
- def activate(self, extension, **kwargs):
+ def activate(self, extension, ignore_conflicts=False, **kwargs):
"""Make extension package usable by linking all its files to a target
provided by the directory layout (depending if the user wants to
activate globally or in a specified file system view).
@@ -1883,11 +1891,18 @@ class PackageBase(with_metaclass(PackageMeta, object)):
kwargs.get('ignore', lambda f: False)(filename))
tree = LinkTree(extension.prefix)
+
conflict = tree.find_conflict(target, ignore=ignore)
- if conflict:
+ if not conflict:
+ pass
+ elif ignore_conflicts:
+ tty.warn("While activating %s, found conflict %s" %
+ (self.spec.cshort_spec, conflict))
+ else:
raise ExtensionConflictError(conflict)
- tree.merge(target, ignore=ignore, link=extensions_layout.link)
+ tree.merge(target, ignore=ignore, link=extensions_layout.link,
+ ignore_conflicts=ignore_conflicts)
def do_deactivate(self, **kwargs):
"""Called on the extension to invoke extendee's deactivate() method.