Skip to content
Snippets Groups Projects
Unverified Commit 2e387ef5 authored by Peter Scheibel's avatar Peter Scheibel Committed by GitHub
Browse files

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.
parent 01bda126
No related branches found
No related tags found
No related merge requests found
...@@ -98,6 +98,10 @@ def test_all_same_but_archive_hash(self): ...@@ -98,6 +98,10 @@ def test_all_same_but_archive_hash(self):
assert spec1.package.content_hash(content=content1) != \ assert spec1.package.content_hash(content=content1) != \
spec2.package.content_hash(content=content2) 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 # Below tests target direct imports of spack packages from the
# spack.pkg namespace # spack.pkg namespace
def test_import_package(self): def test_import_package(self):
......
...@@ -41,8 +41,23 @@ def __init__(self, spec): ...@@ -41,8 +41,23 @@ def __init__(self, spec):
self.spec = spec self.spec = spec
def is_directive(self, node): 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 return (isinstance(node, ast.Expr) and
node.value and isinstance(node.value, ast.Call) 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__) node.value.func.id in spack.directives.__all__)
def is_spack_attr(self, node): def is_spack_attr(self, node):
......
# 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)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment