From 130354b867f6800da733e2eb0890384e3bf5057b Mon Sep 17 00:00:00 2001 From: Greg Becker Date: Thu, 10 Feb 2022 00:10:23 -0800 Subject: spack audit: fix spurious failures for target/platform conflicts (#28860) --- lib/spack/spack/audit.py | 15 +++++++++++---- lib/spack/spack/test/audit.py | 5 ++++- .../packages/unconstrainable-conflict/package.py | 16 ++++++++++++++++ 3 files changed, 31 insertions(+), 5 deletions(-) create mode 100644 var/spack/repos/builtin.mock/packages/unconstrainable-conflict/package.py diff --git a/lib/spack/spack/audit.py b/lib/spack/spack/audit.py index df5fd6c86b..8787f520c2 100644 --- a/lib/spack/spack/audit.py +++ b/lib/spack/spack/audit.py @@ -323,10 +323,17 @@ def _unknown_variants_in_directives(pkgs, error_cls): vrn = spack.spec.Spec(conflict) try: vrn.constrain(trigger) - except Exception as e: - msg = 'Generic error in conflict for package "{0}": ' - errors.append(error_cls(msg.format(pkg.name), [str(e)])) - continue + except Exception: + # If one of the conflict/trigger includes a platform and the other + # includes an os or target, the constraint will fail if the current + # platform is not the plataform in the conflict/trigger. Audit the + # conflict and trigger separately in that case. + # When os and target constraints can be created independently of + # the platform, TODO change this back to add an error. + errors.extend(_analyze_variants_in_directive( + pkg, spack.spec.Spec(trigger), + directive='conflicts', error_cls=error_cls + )) errors.extend(_analyze_variants_in_directive( pkg, vrn, directive='conflicts', error_cls=error_cls )) diff --git a/lib/spack/spack/test/audit.py b/lib/spack/spack/test/audit.py index 207e98a7e8..ffc0d5b8d9 100644 --- a/lib/spack/spack/test/audit.py +++ b/lib/spack/spack/test/audit.py @@ -16,7 +16,10 @@ import spack.config # The package use a non existing variant in a depends_on directive (['wrong-variant-in-depends-on'], 'PKG-DIRECTIVES'), # This package has no issues - (['mpileaks'], None) + (['mpileaks'], None), + # This package has a conflict with a trigger which cannot constrain the constraint + # Should not raise an error + (['unconstrainable-conflict'], None), ]) def test_package_audits(packages, failing_check, mock_packages): reports = spack.audit.run_group('packages', pkgs=packages) diff --git a/var/spack/repos/builtin.mock/packages/unconstrainable-conflict/package.py b/var/spack/repos/builtin.mock/packages/unconstrainable-conflict/package.py new file mode 100644 index 0000000000..e869b13b3f --- /dev/null +++ b/var/spack/repos/builtin.mock/packages/unconstrainable-conflict/package.py @@ -0,0 +1,16 @@ +# Copyright 2013-2022 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +class UnconstrainableConflict(Package): + """Package with a conflict whose trigger cannot constrain its constraint.""" + + homepage = "http://www.example.com" + url = "http://www.example.com/unconstrainable-conflict-1.0.tar.gz" + + version('1.0', '0123456789abcdef0123456789abcdef') + + # Two conflicts so there's always one that is not the current platform + conflicts('target=x86_64', when='platform=darwin') + conflicts('target=aarch64', when='platform=linux') -- cgit v1.2.3-60-g2f50