Package hashing: fix detection of directives (#14763)
The hashing logic looks for function calls that are Spack directives. It expects that when a Spack directive is used that it is referenced directly by name, and that the directive function is not itself retrieved by calling another function. When the hashing logic encountered a function call where the function was determined dynamically, it would fail (attempting to access a name attribute that does not happen to exist in this case). This updates the hashing logic to filter out function calls where the function is determined dynamically when looking for uses of Spack directives.
This commit is contained in:
parent
01bda12692
commit
2e387ef585
@ -98,6 +98,10 @@ def test_all_same_but_archive_hash(self):
|
||||
assert spec1.package.content_hash(content=content1) != \
|
||||
spec2.package.content_hash(content=content2)
|
||||
|
||||
def test_parse_dynamic_function_call(self):
|
||||
spec = Spec("hash-test4").concretized()
|
||||
spec.package.content_hash()
|
||||
|
||||
# Below tests target direct imports of spack packages from the
|
||||
# spack.pkg namespace
|
||||
def test_import_package(self):
|
||||
|
@ -41,8 +41,23 @@ def __init__(self, spec):
|
||||
self.spec = spec
|
||||
|
||||
def is_directive(self, node):
|
||||
"""Check to determine if the node is a valid directive
|
||||
|
||||
Directives are assumed to be represented in the AST as a named function
|
||||
call expression. This means that they will NOT be represented by a
|
||||
named function call within a function call expression (e.g., as
|
||||
callbacks are sometimes represented).
|
||||
|
||||
Args:
|
||||
node (AST): the AST node being checked
|
||||
|
||||
Returns:
|
||||
(bool): ``True`` if the node represents a known directive,
|
||||
``False`` otherwise
|
||||
"""
|
||||
return (isinstance(node, ast.Expr) and
|
||||
node.value and isinstance(node.value, ast.Call) and
|
||||
isinstance(node.value.func, ast.Name) and
|
||||
node.value.func.id in spack.directives.__all__)
|
||||
|
||||
def is_spack_attr(self, node):
|
||||
|
27
var/spack/repos/builtin.mock/packages/hash-test4/package.py
Normal file
27
var/spack/repos/builtin.mock/packages/hash-test4/package.py
Normal file
@ -0,0 +1,27 @@
|
||||
# Copyright 2013-2020 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)
|
||||
|
||||
from spack import *
|
||||
|
||||
|
||||
class HashTest4(Package):
|
||||
"""This package isn't compared with others, but it contains constructs
|
||||
that package hashing logic has tripped over in the past.
|
||||
"""
|
||||
|
||||
homepage = "http://www.hashtest4.org"
|
||||
url = "http://www.hashtest1.org/downloads/hashtest4-1.1.tar.bz2"
|
||||
|
||||
version('1.1', 'a' * 32)
|
||||
|
||||
def install(self, spec, prefix):
|
||||
pass
|
||||
|
||||
@staticmethod
|
||||
def examine_prefix(pkg):
|
||||
pass
|
||||
|
||||
run_after('install')(
|
||||
examine_prefix)
|
Loading…
Reference in New Issue
Block a user