Fix Python issue with build failures; Add test case for build failures. (#2687)

This commit is contained in:
Todd Gamblin 2016-12-30 11:37:50 -08:00 committed by GitHub
parent 5fbab1f4b5
commit 972a277956
3 changed files with 55 additions and 4 deletions

View file

@ -60,9 +60,10 @@
import llnl.util.lang as lang import llnl.util.lang as lang
import llnl.util.tty as tty import llnl.util.tty as tty
from llnl.util.filesystem import *
import spack import spack
import spack.store import spack.store
from llnl.util.filesystem import *
from spack.environment import EnvironmentModifications, validate from spack.environment import EnvironmentModifications, validate
from spack.util.environment import * from spack.util.environment import *
from spack.util.executable import Executable, which from spack.util.executable import Executable, which
@ -450,7 +451,8 @@ def parent_class_modules(cls):
""" """
Get list of super class modules that are all descend from spack.Package Get list of super class modules that are all descend from spack.Package
""" """
if not issubclass(cls, spack.Package) or issubclass(spack.Package, cls): if (not issubclass(cls, spack.package.Package) or
issubclass(spack.package.Package, cls)):
return [] return []
result = [] result = []
module = sys.modules.get(cls.__module__) module = sys.modules.get(cls.__module__)
@ -622,9 +624,9 @@ def make_stack(tb, stack=None):
for tb in stack: for tb in stack:
frame = tb.tb_frame frame = tb.tb_frame
if 'self' in frame.f_locals: if 'self' in frame.f_locals:
# Find the first proper subclass of spack.PackageBase. # Find the first proper subclass of PackageBase.
obj = frame.f_locals['self'] obj = frame.f_locals['self']
if isinstance(obj, spack.PackageBase): if isinstance(obj, spack.package.PackageBase):
break break
# we found obj, the Package implementation we care about. # we found obj, the Package implementation we care about.

View file

@ -90,3 +90,15 @@ def test_store(mock_archive):
except Exception: except Exception:
pkg.remove_prefix() pkg.remove_prefix()
raise raise
@pytest.mark.usefixtures('install_mockery')
def test_failing_build(mock_archive):
spec = Spec('failing-build').concretized()
for s in spec.traverse():
fake_fetchify(mock_archive.url, s.package)
pkg = spec.package
with pytest.raises(spack.build_environment.ChildError):
pkg.do_install()

View file

@ -0,0 +1,37 @@
##############################################################################
# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC.
# Produced at the Lawrence Livermore National Laboratory.
#
# This file is part of Spack.
# Created by Todd Gamblin, tgamblin@llnl.gov, All rights reserved.
# LLNL-CODE-647188
#
# For details, see https://github.com/llnl/spack
# Please also see the LICENSE file for our notice and the LGPL.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License (as
# published by the Free Software Foundation) version 2.1, February 1999.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the IMPLIED WARRANTY OF
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the terms and
# conditions of the GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
##############################################################################
from spack import *
class FailingBuild(Package):
"""This package has a trivial install method that fails."""
homepage = "http://www.example.com/trivial_install"
url = "http://www.unit-test-should-replace-this-url/trivial_install-1.0.tar.gz"
version('1.0', 'foobarbaz')
def install(self, spec, prefix):
raise InstallError("Expected failure.")