Fix how environments are read from lockfile
This commit is contained in:
parent
f6e7c0b740
commit
cb0d12b9d5
@ -27,7 +27,6 @@
|
||||
import spack.config as config
|
||||
import spack.database as spack_db
|
||||
import spack.fetch_strategy as fs
|
||||
import spack.hash_types as ht
|
||||
import spack.hooks
|
||||
import spack.hooks.sbang
|
||||
import spack.mirror
|
||||
@ -806,10 +805,8 @@ def generate_package_index(cache_prefix):
|
||||
spec_file_contents = codecs.getreader('utf-8')(spec_file).read()
|
||||
# Need full spec.json name or this gets confused with index.json.
|
||||
if spec_url.endswith('.json'):
|
||||
spec_dict = sjson.load(spec_file_contents)
|
||||
s = Spec.from_json(spec_file_contents)
|
||||
elif spec_url.endswith('.yaml'):
|
||||
spec_dict = syaml.load(spec_file_contents)
|
||||
s = Spec.from_yaml(spec_file_contents)
|
||||
if s:
|
||||
db.add(s, None)
|
||||
|
@ -332,18 +332,15 @@ def _report_suite_results(test_suite, args, constraints):
|
||||
.format(results_desc, test_suite.name, matching))
|
||||
|
||||
results = {}
|
||||
tty.msg('test results')
|
||||
with open(test_suite.results_file, 'r') as f:
|
||||
for line in f:
|
||||
pkg_id, status = line.split()
|
||||
results[pkg_id] = status
|
||||
tty.msg(' {0}'.format(pkg_id))
|
||||
|
||||
tty.msg('test specs:')
|
||||
|
||||
failed, skipped, untested = 0, 0, 0
|
||||
for pkg_id in test_specs:
|
||||
tty.msg(' {0}'.format(pkg_id))
|
||||
if pkg_id in results:
|
||||
status = results[pkg_id]
|
||||
if status == 'FAILED':
|
||||
|
@ -1812,78 +1812,34 @@ def _read_lockfile(self, file_or_json):
|
||||
|
||||
def _read_lockfile_dict(self, d):
|
||||
"""Read a lockfile dictionary into this environment."""
|
||||
self.specs_by_hash = {}
|
||||
|
||||
roots = d['roots']
|
||||
self.concretized_user_specs = [Spec(r['spec']) for r in roots]
|
||||
self.concretized_order = [r['hash'] for r in roots]
|
||||
|
||||
json_specs_by_hash = d['concrete_specs']
|
||||
root_hashes = set(self.concretized_order)
|
||||
|
||||
import pdb
|
||||
pdb.set_trace()
|
||||
|
||||
specs_by_hash = {}
|
||||
for dag_hash, node_dict in json_specs_by_hash.items():
|
||||
spec = Spec.from_node_dict(node_dict)
|
||||
if d['_meta']['lockfile-version'] > 1:
|
||||
# Build hash is stored as a key, but not as part of the node dict
|
||||
# To ensure build hashes are not recomputed, we reattach here
|
||||
setattr(spec, ht.dag_hash.attr, dag_hash)
|
||||
specs_by_hash[dag_hash] = spec
|
||||
|
||||
for dag_hash, node_dict in json_specs_by_hash.items():
|
||||
for lockfile_key, node_dict in json_specs_by_hash.items():
|
||||
specs_by_hash[lockfile_key] = Spec.from_node_dict(node_dict)
|
||||
|
||||
for lockfile_key, node_dict in json_specs_by_hash.items():
|
||||
for _, dep_hash, deptypes, _ in (
|
||||
Spec.dependencies_from_node_dict(node_dict)):
|
||||
specs_by_hash[dag_hash]._add_dependency(
|
||||
specs_by_hash[lockfile_key]._add_dependency(
|
||||
specs_by_hash[dep_hash], deptypes)
|
||||
|
||||
# Current lockfile key: dag_hash() (dag_hash() == full_hash())
|
||||
# Previous lockfile keys from most recent to least:
|
||||
# 1. build_hash
|
||||
# 2. dag_hash (computed *without* build deps)
|
||||
# Now make sure concretized_order and our internal specs dict
|
||||
# contains the keys used by modern spack (i.e. the dag_hash
|
||||
# that includes build deps and package hash).
|
||||
self.concretized_order = [specs_by_hash[h_key].dag_hash()
|
||||
for h_key in self.concretized_order]
|
||||
|
||||
# If we are reading an older lockfile format, the key may have been computed
|
||||
# using a different hash type than the one spack uses currently (which
|
||||
# includes build deps as well as the package hash). If this is the case
|
||||
# the following code updates the keys in in 'concretized_order' to be computed
|
||||
# using the hash type spack currently uses, while maintaining the order of the
|
||||
# list.
|
||||
old_hash_to_new = {}
|
||||
self.specs_by_hash = {}
|
||||
for _, spec in specs_by_hash.items():
|
||||
# - to get old dag_hash() (w/out build deps) use runtime_hash() now
|
||||
# - dag_hash() now includes build deps and package hash
|
||||
# - i.e. dag_hash() == full_hash()
|
||||
# - regardless of what hash type keyed the lockfile we're reading,
|
||||
# the dag_hash we read from the file may appear appear in install
|
||||
# trees and binary mirrors, and as such, must be considered the
|
||||
# permanent id of the spec.
|
||||
dag_hash = spec.dag_hash() # == full_hash()
|
||||
runtime_hash = spec.runtime_hash() # == old dag_hash()
|
||||
|
||||
if dag_hash in root_hashes:
|
||||
# This spec's dag hash (now computed with build deps and pkg
|
||||
# hash) is in the keys found in the file, so we're looking at
|
||||
# the current format
|
||||
pass
|
||||
elif runtime_hash in root_hashes:
|
||||
# This spec's runtime hash (the old dag hash w/out build deps,
|
||||
# etc) is a key in this lockfile, so this is the oldest format
|
||||
old_hash_to_new[runtime_hash] = dag_hash
|
||||
else:
|
||||
# Neither of this spec's hashes appeared as a key in the lock
|
||||
# file, so
|
||||
old_hash_to_new[build_hash] = dag_hash
|
||||
|
||||
if (runtime_hash in root_hashes or
|
||||
build_hash in root_hashes or dag_hash in root_hashes):
|
||||
self.specs_by_hash[dag_hash] = spec
|
||||
|
||||
if old_hash_to_new:
|
||||
# Replace any older hashes in concretized_order with hashes
|
||||
# that include build deps
|
||||
self.concretized_order = [
|
||||
old_hash_to_new.get(h, h) for h in self.concretized_order]
|
||||
for _, env_spec in specs_by_hash.items():
|
||||
spec_dag_hash = env_spec.dag_hash()
|
||||
if spec_dag_hash in self.concretized_order:
|
||||
self.specs_by_hash[spec_dag_hash] = env_spec
|
||||
|
||||
def write(self, regenerate=True):
|
||||
"""Writes an in-memory environment to its location on disk.
|
||||
|
@ -184,7 +184,7 @@
|
||||
default_format += '{variants}{arch=architecture}'
|
||||
|
||||
#: specfile format version. Must increase monotonically
|
||||
specfile_format_version = 2
|
||||
specfile_format_version = 3
|
||||
|
||||
|
||||
def colorize_spec(spec):
|
||||
|
@ -11,15 +11,12 @@
|
||||
import py
|
||||
import pytest
|
||||
|
||||
import llnl.util.filesystem as fs
|
||||
|
||||
import spack.binary_distribution as bindist
|
||||
import spack.config
|
||||
import spack.hooks.sbang as sbang
|
||||
import spack.main
|
||||
import spack.mirror
|
||||
import spack.repo
|
||||
import spack.spec as spec
|
||||
import spack.store
|
||||
import spack.util.gpg
|
||||
import spack.util.web as web_util
|
||||
@ -426,14 +423,14 @@ def test_spec_needs_rebuild(monkeypatch, tmpdir):
|
||||
# Put installed package in the buildcache
|
||||
buildcache_cmd('create', '-u', '-a', '-d', mirror_dir.strpath, s.name)
|
||||
|
||||
rebuild = bindist.needs_rebuild(s, mirror_url, rebuild_on_errors=True)
|
||||
rebuild = bindist.needs_rebuild(s, mirror_url)
|
||||
|
||||
assert not rebuild
|
||||
|
||||
# Now monkey patch Spec to change the full hash on the package
|
||||
# Now monkey patch Spec to change the hash on the package
|
||||
monkeypatch.setattr(spack.spec.Spec, 'dag_hash', fake_dag_hash)
|
||||
|
||||
rebuild = bindist.needs_rebuild(s, mirror_url, rebuild_on_errors=True)
|
||||
rebuild = bindist.needs_rebuild(s, mirror_url)
|
||||
|
||||
assert rebuild
|
||||
|
||||
|
@ -19,6 +19,7 @@
|
||||
import spack.environment.shell
|
||||
import spack.hash_types as ht
|
||||
import spack.modules
|
||||
import spack.paths
|
||||
import spack.repo
|
||||
import spack.util.spack_json as sjson
|
||||
from spack.cmd.env import _env_create
|
||||
@ -28,6 +29,7 @@
|
||||
from spack.util.executable import Executable
|
||||
from spack.util.mock_package import MockPackageMultiRepo
|
||||
from spack.util.path import substitute_path_variables
|
||||
from spack.version import Version
|
||||
|
||||
# TODO-27021
|
||||
# everything here uses the mock_env_path
|
||||
@ -982,7 +984,8 @@ def create_v1_lockfile_dict(roots, all_specs):
|
||||
# Version one lockfiles use the dag hash without build deps as keys,
|
||||
# but they write out the full node dict (including build deps)
|
||||
"concrete_specs": dict(
|
||||
(s.runtime_hash(), s.to_node_dict(hash=ht.dag_hash))
|
||||
# (s.dag_hash(), s.to_node_dict(hash=ht.dag_hash))
|
||||
(s.runtime_hash(), s.to_node_dict(hash=ht.build_hash))
|
||||
for s in all_specs
|
||||
)
|
||||
}
|
||||
@ -1044,8 +1047,9 @@ def test_read_old_lock_creates_backup(tmpdir):
|
||||
assert os.path.exists(e._lock_backup_v1_path)
|
||||
with open(e._lock_backup_v1_path, 'r') as backup_v1_file:
|
||||
lockfile_dict_v1 = sjson.load(backup_v1_file)
|
||||
|
||||
# Make sure that the backup file follows the v1 hash scheme
|
||||
assert y.dag_hash() in lockfile_dict_v1['concrete_specs']
|
||||
assert y.runtime_hash() in lockfile_dict_v1['concrete_specs']
|
||||
|
||||
|
||||
@pytest.mark.usefixtures('config')
|
||||
@ -2861,6 +2865,54 @@ def test_environment_query_spec_by_hash(mock_stage, mock_fetch, install_mockery)
|
||||
assert e.matching_spec('libelf').installed
|
||||
|
||||
|
||||
def test_read_legacy_lockfile_and_reconcretize(mock_stage, mock_fetch, install_mockery):
|
||||
"""Make sure that when we read a legacy environment lock file with a hash
|
||||
conflict (one from before we switched to full hash), the behavior as to
|
||||
which of the conflicting specs we pick is deterministic. When we read
|
||||
the lockfile, we process root specs in the order they appear in 'roots',
|
||||
so we expect the dependencies of the last root in that list to be the
|
||||
ones that appear in the environment before we forcefully re-concretize
|
||||
the environment. After we force reconcretization, we should see all
|
||||
the dependencies again."""
|
||||
legacy_lockfile_path = os.path.join(
|
||||
spack.paths.test_path, 'data', 'legacy_env', 'spack.lock'
|
||||
)
|
||||
|
||||
env('create', 'test', legacy_lockfile_path)
|
||||
test = ev.read('test')
|
||||
|
||||
# Before we forcefully reconcretize, we expect there will be only a
|
||||
# single actual spec in the environment, and it should depend on
|
||||
# dtbuild1@1.0, since that root appears last in the list.
|
||||
assert len(test.specs_by_hash) == 1
|
||||
|
||||
single_root = next(iter(test.specs_by_hash.values()))
|
||||
|
||||
assert single_root['dtbuild1'].version == Version('1.0')
|
||||
|
||||
# Now forcefully reconcretize
|
||||
with ev.read('test'):
|
||||
concretize('-f')
|
||||
|
||||
test = ev.read('test')
|
||||
|
||||
# After reconcretizing, we should again see two roots, one depending on
|
||||
# each of the dtbuild1 versions specified in the roots of the original
|
||||
# lockfile.
|
||||
assert len(test.specs_by_hash) == 2
|
||||
|
||||
expected_dtbuild1_versions = [Version('0.5'), Version('1.0')]
|
||||
|
||||
for s in test.specs_by_hash.values():
|
||||
expected_dtbuild1_versions.remove(s['dtbuild1'].version)
|
||||
|
||||
assert len(expected_dtbuild1_versions) == 0
|
||||
|
||||
expected_versions = set([Version('0.5'), Version('1.0')])
|
||||
current_versions = set(s['dtbuild1'].version for s in test.specs_by_hash.values())
|
||||
assert current_versions == expected_versions
|
||||
|
||||
|
||||
def test_environment_depfile_makefile(tmpdir, mock_packages):
|
||||
env('create', 'test')
|
||||
make = Executable('make')
|
||||
|
@ -9,9 +9,12 @@
|
||||
|
||||
import pytest
|
||||
|
||||
from llnl.util.filesystem import copy_tree
|
||||
|
||||
import spack.cmd.install
|
||||
import spack.config
|
||||
import spack.package
|
||||
import spack.paths
|
||||
import spack.store
|
||||
from spack.main import SpackCommand
|
||||
|
||||
@ -242,37 +245,28 @@ def test_has_test_method_fails(capsys):
|
||||
assert 'is not a class' in captured
|
||||
|
||||
|
||||
def test_hash_change(mock_test_stage, mock_packages, mock_archive, mock_fetch,
|
||||
install_mockery_mutable_config):
|
||||
"""Ensure output printed from pkgs is captured by output redirection."""
|
||||
install('printing-package')
|
||||
spack_test('run', '--alias', 'printpkg', 'printing-package')
|
||||
def test_read_old_results(mock_test_stage):
|
||||
"""Take test data generated before the switch to full hash everywhere
|
||||
and make sure we can still read it in"""
|
||||
# Test data was generated with:
|
||||
# spack install printing-package
|
||||
# spack test run --alias printpkg printing-package
|
||||
|
||||
stage_files = os.listdir(mock_test_stage)
|
||||
test_data_src = os.path.join(
|
||||
spack.paths.test_path, 'data', 'test', 'test_stage')
|
||||
|
||||
# Grab test stage directory contents
|
||||
testdir = os.path.join(mock_test_stage, stage_files[0])
|
||||
# Copy the old test data into the mock stage directory
|
||||
copy_tree(test_data_src, mock_test_stage)
|
||||
|
||||
outfile = os.path.join(testdir, 'test_suite.lock')
|
||||
with open(outfile, 'r') as f:
|
||||
output = f.read()
|
||||
val_replace = '"hash": "{0}"'.format(
|
||||
spack.store.db.query('printing-package')[0].dag_hash())
|
||||
changed_hash = output.replace(
|
||||
val_replace,
|
||||
'"hash": "fakehash492ucwhwvzhxfbmcc45x49ha"')
|
||||
with open(outfile, 'w') as f:
|
||||
f.write(changed_hash)
|
||||
|
||||
# The find command should show the contents
|
||||
# The find command should print info about the old test, under
|
||||
# the alias used at test generation time
|
||||
find_output = spack_test('find')
|
||||
assert 'printpkg' in find_output
|
||||
# The results should be obtainable
|
||||
|
||||
# The results command should still print the old test results
|
||||
results_output = spack_test('results')
|
||||
assert 'PASSED' in results_output
|
||||
|
||||
assert(False)
|
||||
|
||||
|
||||
def test_test_results_none(mock_packages, mock_test_stage):
|
||||
name = 'trivial'
|
||||
|
672
lib/spack/spack/test/data/legacy_env/spack.lock
Normal file
672
lib/spack/spack/test/data/legacy_env/spack.lock
Normal file
@ -0,0 +1,672 @@
|
||||
{
|
||||
"_meta": {
|
||||
"file-type": "spack-lockfile",
|
||||
"lockfile-version": 3,
|
||||
"specfile-version": 2
|
||||
},
|
||||
"roots": [
|
||||
{
|
||||
"hash": "wci7a3aaaa4nj6ct6rj4aeltgbfojefy",
|
||||
"spec": "dttop ^dtbuild1@0.5"
|
||||
},
|
||||
{
|
||||
"hash": "5zg6wxwir2xien62soca6xaeilfzofz7",
|
||||
"spec": "dttop ^dtbuild1@1.0"
|
||||
}
|
||||
],
|
||||
"concrete_specs": {
|
||||
"wci7a3aaaa4nj6ct6rj4aeltgbfojefy": {
|
||||
"name": "dttop",
|
||||
"version": "1.0",
|
||||
"arch": {
|
||||
"platform": "test",
|
||||
"platform_os": "debian6",
|
||||
"target": {
|
||||
"name": "core2",
|
||||
"vendor": "GenuineIntel",
|
||||
"features": [
|
||||
"mmx",
|
||||
"sse",
|
||||
"sse2",
|
||||
"ssse3"
|
||||
],
|
||||
"generation": 0,
|
||||
"parents": [
|
||||
"nocona"
|
||||
]
|
||||
}
|
||||
},
|
||||
"compiler": {
|
||||
"name": "gcc",
|
||||
"version": "4.5.0"
|
||||
},
|
||||
"namespace": "builtin.mock",
|
||||
"parameters": {
|
||||
"cflags": [],
|
||||
"cppflags": [],
|
||||
"cxxflags": [],
|
||||
"fflags": [],
|
||||
"ldflags": [],
|
||||
"ldlibs": []
|
||||
},
|
||||
"dependencies": [
|
||||
{
|
||||
"name": "dtbuild1",
|
||||
"build_hash": "qgpyperfcinui6o25aoglxzkdrlakf6b",
|
||||
"type": [
|
||||
"build"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "dtlink1",
|
||||
"build_hash": "4skh62lxn6gra5li7sqaeunzgaxjkbns",
|
||||
"type": [
|
||||
"build",
|
||||
"link"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "dtrun1",
|
||||
"build_hash": "upfcexeb7zwzxdsimesyzo42yz35bw2s",
|
||||
"type": [
|
||||
"run"
|
||||
]
|
||||
}
|
||||
],
|
||||
"hash": "foya4e4rtwl5ep4mq463sdeslgaoc3qu"
|
||||
},
|
||||
"qgpyperfcinui6o25aoglxzkdrlakf6b": {
|
||||
"name": "dtbuild1",
|
||||
"version": "0.5",
|
||||
"arch": {
|
||||
"platform": "test",
|
||||
"platform_os": "debian6",
|
||||
"target": {
|
||||
"name": "core2",
|
||||
"vendor": "GenuineIntel",
|
||||
"features": [
|
||||
"mmx",
|
||||
"sse",
|
||||
"sse2",
|
||||
"ssse3"
|
||||
],
|
||||
"generation": 0,
|
||||
"parents": [
|
||||
"nocona"
|
||||
]
|
||||
}
|
||||
},
|
||||
"compiler": {
|
||||
"name": "gcc",
|
||||
"version": "4.5.0"
|
||||
},
|
||||
"namespace": "builtin.mock",
|
||||
"parameters": {
|
||||
"cflags": [],
|
||||
"cppflags": [],
|
||||
"cxxflags": [],
|
||||
"fflags": [],
|
||||
"ldflags": [],
|
||||
"ldlibs": []
|
||||
},
|
||||
"dependencies": [
|
||||
{
|
||||
"name": "dtbuild2",
|
||||
"build_hash": "pq6krl6alw7ic5ix4g5izvlzt2llbvcp",
|
||||
"type": [
|
||||
"build"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "dtlink2",
|
||||
"build_hash": "5isttyk6zuekua2nqp23rrjpmcpo7y6a",
|
||||
"type": [
|
||||
"build",
|
||||
"link"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "dtrun2",
|
||||
"build_hash": "ypkyvbgxdzvverb7ami5rb6yxmp5ylmo",
|
||||
"type": [
|
||||
"run"
|
||||
]
|
||||
}
|
||||
],
|
||||
"hash": "lgcxyf3mkho6hpzymcvbetrvbujacufn"
|
||||
},
|
||||
"pq6krl6alw7ic5ix4g5izvlzt2llbvcp": {
|
||||
"name": "dtbuild2",
|
||||
"version": "1.0",
|
||||
"arch": {
|
||||
"platform": "test",
|
||||
"platform_os": "debian6",
|
||||
"target": {
|
||||
"name": "core2",
|
||||
"vendor": "GenuineIntel",
|
||||
"features": [
|
||||
"mmx",
|
||||
"sse",
|
||||
"sse2",
|
||||
"ssse3"
|
||||
],
|
||||
"generation": 0,
|
||||
"parents": [
|
||||
"nocona"
|
||||
]
|
||||
}
|
||||
},
|
||||
"compiler": {
|
||||
"name": "gcc",
|
||||
"version": "4.5.0"
|
||||
},
|
||||
"namespace": "builtin.mock",
|
||||
"parameters": {
|
||||
"cflags": [],
|
||||
"cppflags": [],
|
||||
"cxxflags": [],
|
||||
"fflags": [],
|
||||
"ldflags": [],
|
||||
"ldlibs": []
|
||||
},
|
||||
"hash": "pq6krl6alw7ic5ix4g5izvlzt2llbvcp"
|
||||
},
|
||||
"5isttyk6zuekua2nqp23rrjpmcpo7y6a": {
|
||||
"name": "dtlink2",
|
||||
"version": "1.0",
|
||||
"arch": {
|
||||
"platform": "test",
|
||||
"platform_os": "debian6",
|
||||
"target": {
|
||||
"name": "core2",
|
||||
"vendor": "GenuineIntel",
|
||||
"features": [
|
||||
"mmx",
|
||||
"sse",
|
||||
"sse2",
|
||||
"ssse3"
|
||||
],
|
||||
"generation": 0,
|
||||
"parents": [
|
||||
"nocona"
|
||||
]
|
||||
}
|
||||
},
|
||||
"compiler": {
|
||||
"name": "gcc",
|
||||
"version": "4.5.0"
|
||||
},
|
||||
"namespace": "builtin.mock",
|
||||
"parameters": {
|
||||
"cflags": [],
|
||||
"cppflags": [],
|
||||
"cxxflags": [],
|
||||
"fflags": [],
|
||||
"ldflags": [],
|
||||
"ldlibs": []
|
||||
},
|
||||
"hash": "5isttyk6zuekua2nqp23rrjpmcpo7y6a"
|
||||
},
|
||||
"ypkyvbgxdzvverb7ami5rb6yxmp5ylmo": {
|
||||
"name": "dtrun2",
|
||||
"version": "1.0",
|
||||
"arch": {
|
||||
"platform": "test",
|
||||
"platform_os": "debian6",
|
||||
"target": {
|
||||
"name": "core2",
|
||||
"vendor": "GenuineIntel",
|
||||
"features": [
|
||||
"mmx",
|
||||
"sse",
|
||||
"sse2",
|
||||
"ssse3"
|
||||
],
|
||||
"generation": 0,
|
||||
"parents": [
|
||||
"nocona"
|
||||
]
|
||||
}
|
||||
},
|
||||
"compiler": {
|
||||
"name": "gcc",
|
||||
"version": "4.5.0"
|
||||
},
|
||||
"namespace": "builtin.mock",
|
||||
"parameters": {
|
||||
"cflags": [],
|
||||
"cppflags": [],
|
||||
"cxxflags": [],
|
||||
"fflags": [],
|
||||
"ldflags": [],
|
||||
"ldlibs": []
|
||||
},
|
||||
"hash": "ypkyvbgxdzvverb7ami5rb6yxmp5ylmo"
|
||||
},
|
||||
"4skh62lxn6gra5li7sqaeunzgaxjkbns": {
|
||||
"name": "dtlink1",
|
||||
"version": "1.0",
|
||||
"arch": {
|
||||
"platform": "test",
|
||||
"platform_os": "debian6",
|
||||
"target": {
|
||||
"name": "core2",
|
||||
"vendor": "GenuineIntel",
|
||||
"features": [
|
||||
"mmx",
|
||||
"sse",
|
||||
"sse2",
|
||||
"ssse3"
|
||||
],
|
||||
"generation": 0,
|
||||
"parents": [
|
||||
"nocona"
|
||||
]
|
||||
}
|
||||
},
|
||||
"compiler": {
|
||||
"name": "gcc",
|
||||
"version": "4.5.0"
|
||||
},
|
||||
"namespace": "builtin.mock",
|
||||
"parameters": {
|
||||
"cflags": [],
|
||||
"cppflags": [],
|
||||
"cxxflags": [],
|
||||
"fflags": [],
|
||||
"ldflags": [],
|
||||
"ldlibs": []
|
||||
},
|
||||
"dependencies": [
|
||||
{
|
||||
"name": "dtlink3",
|
||||
"build_hash": "iq7m6ubgajdcnukktxolh7nc2z666h7r",
|
||||
"type": [
|
||||
"build",
|
||||
"link"
|
||||
]
|
||||
}
|
||||
],
|
||||
"hash": "4oxug37ghalgpxyzuurftzdvlr2a7wrz"
|
||||
},
|
||||
"iq7m6ubgajdcnukktxolh7nc2z666h7r": {
|
||||
"name": "dtlink3",
|
||||
"version": "1.0",
|
||||
"arch": {
|
||||
"platform": "test",
|
||||
"platform_os": "debian6",
|
||||
"target": {
|
||||
"name": "core2",
|
||||
"vendor": "GenuineIntel",
|
||||
"features": [
|
||||
"mmx",
|
||||
"sse",
|
||||
"sse2",
|
||||
"ssse3"
|
||||
],
|
||||
"generation": 0,
|
||||
"parents": [
|
||||
"nocona"
|
||||
]
|
||||
}
|
||||
},
|
||||
"compiler": {
|
||||
"name": "gcc",
|
||||
"version": "4.5.0"
|
||||
},
|
||||
"namespace": "builtin.mock",
|
||||
"parameters": {
|
||||
"cflags": [],
|
||||
"cppflags": [],
|
||||
"cxxflags": [],
|
||||
"fflags": [],
|
||||
"ldflags": [],
|
||||
"ldlibs": []
|
||||
},
|
||||
"dependencies": [
|
||||
{
|
||||
"name": "dtbuild2",
|
||||
"build_hash": "pq6krl6alw7ic5ix4g5izvlzt2llbvcp",
|
||||
"type": [
|
||||
"build"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "dtlink4",
|
||||
"build_hash": "kdt2sgmlahmfyjt3rc3mdvuoh7wdyoe3",
|
||||
"type": [
|
||||
"build",
|
||||
"link"
|
||||
]
|
||||
}
|
||||
],
|
||||
"hash": "n4j5jrvzgfnrvwwjwfycnk6n3ce2xk25"
|
||||
},
|
||||
"kdt2sgmlahmfyjt3rc3mdvuoh7wdyoe3": {
|
||||
"name": "dtlink4",
|
||||
"version": "1.0",
|
||||
"arch": {
|
||||
"platform": "test",
|
||||
"platform_os": "debian6",
|
||||
"target": {
|
||||
"name": "core2",
|
||||
"vendor": "GenuineIntel",
|
||||
"features": [
|
||||
"mmx",
|
||||
"sse",
|
||||
"sse2",
|
||||
"ssse3"
|
||||
],
|
||||
"generation": 0,
|
||||
"parents": [
|
||||
"nocona"
|
||||
]
|
||||
}
|
||||
},
|
||||
"compiler": {
|
||||
"name": "gcc",
|
||||
"version": "4.5.0"
|
||||
},
|
||||
"namespace": "builtin.mock",
|
||||
"parameters": {
|
||||
"cflags": [],
|
||||
"cppflags": [],
|
||||
"cxxflags": [],
|
||||
"fflags": [],
|
||||
"ldflags": [],
|
||||
"ldlibs": []
|
||||
},
|
||||
"hash": "kdt2sgmlahmfyjt3rc3mdvuoh7wdyoe3"
|
||||
},
|
||||
"upfcexeb7zwzxdsimesyzo42yz35bw2s": {
|
||||
"name": "dtrun1",
|
||||
"version": "1.0",
|
||||
"arch": {
|
||||
"platform": "test",
|
||||
"platform_os": "debian6",
|
||||
"target": {
|
||||
"name": "core2",
|
||||
"vendor": "GenuineIntel",
|
||||
"features": [
|
||||
"mmx",
|
||||
"sse",
|
||||
"sse2",
|
||||
"ssse3"
|
||||
],
|
||||
"generation": 0,
|
||||
"parents": [
|
||||
"nocona"
|
||||
]
|
||||
}
|
||||
},
|
||||
"compiler": {
|
||||
"name": "gcc",
|
||||
"version": "4.5.0"
|
||||
},
|
||||
"namespace": "builtin.mock",
|
||||
"parameters": {
|
||||
"cflags": [],
|
||||
"cppflags": [],
|
||||
"cxxflags": [],
|
||||
"fflags": [],
|
||||
"ldflags": [],
|
||||
"ldlibs": []
|
||||
},
|
||||
"dependencies": [
|
||||
{
|
||||
"name": "dtlink5",
|
||||
"build_hash": "bxpadcbd6xljttj5s5m3awlrt4zqztsh",
|
||||
"type": [
|
||||
"build",
|
||||
"link"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "dtrun3",
|
||||
"build_hash": "iqth4unmdwlv7zyw7joloh2lyuyvu6gb",
|
||||
"type": [
|
||||
"run"
|
||||
]
|
||||
}
|
||||
],
|
||||
"hash": "byqsjfa6hl27wpqbva5isxgbwdybgplb"
|
||||
},
|
||||
"bxpadcbd6xljttj5s5m3awlrt4zqztsh": {
|
||||
"name": "dtlink5",
|
||||
"version": "1.0",
|
||||
"arch": {
|
||||
"platform": "test",
|
||||
"platform_os": "debian6",
|
||||
"target": {
|
||||
"name": "core2",
|
||||
"vendor": "GenuineIntel",
|
||||
"features": [
|
||||
"mmx",
|
||||
"sse",
|
||||
"sse2",
|
||||
"ssse3"
|
||||
],
|
||||
"generation": 0,
|
||||
"parents": [
|
||||
"nocona"
|
||||
]
|
||||
}
|
||||
},
|
||||
"compiler": {
|
||||
"name": "gcc",
|
||||
"version": "4.5.0"
|
||||
},
|
||||
"namespace": "builtin.mock",
|
||||
"parameters": {
|
||||
"cflags": [],
|
||||
"cppflags": [],
|
||||
"cxxflags": [],
|
||||
"fflags": [],
|
||||
"ldflags": [],
|
||||
"ldlibs": []
|
||||
},
|
||||
"hash": "bxpadcbd6xljttj5s5m3awlrt4zqztsh"
|
||||
},
|
||||
"iqth4unmdwlv7zyw7joloh2lyuyvu6gb": {
|
||||
"name": "dtrun3",
|
||||
"version": "1.0",
|
||||
"arch": {
|
||||
"platform": "test",
|
||||
"platform_os": "debian6",
|
||||
"target": {
|
||||
"name": "core2",
|
||||
"vendor": "GenuineIntel",
|
||||
"features": [
|
||||
"mmx",
|
||||
"sse",
|
||||
"sse2",
|
||||
"ssse3"
|
||||
],
|
||||
"generation": 0,
|
||||
"parents": [
|
||||
"nocona"
|
||||
]
|
||||
}
|
||||
},
|
||||
"compiler": {
|
||||
"name": "gcc",
|
||||
"version": "4.5.0"
|
||||
},
|
||||
"namespace": "builtin.mock",
|
||||
"parameters": {
|
||||
"cflags": [],
|
||||
"cppflags": [],
|
||||
"cxxflags": [],
|
||||
"fflags": [],
|
||||
"ldflags": [],
|
||||
"ldlibs": []
|
||||
},
|
||||
"dependencies": [
|
||||
{
|
||||
"name": "dtbuild3",
|
||||
"build_hash": "t77enxfrcdrc6mumxzcdossrq4gvdliq",
|
||||
"type": [
|
||||
"build"
|
||||
]
|
||||
}
|
||||
],
|
||||
"hash": "beml5jys2cfxib6evml7ufn4wy2ak5by"
|
||||
},
|
||||
"t77enxfrcdrc6mumxzcdossrq4gvdliq": {
|
||||
"name": "dtbuild3",
|
||||
"version": "1.0",
|
||||
"arch": {
|
||||
"platform": "test",
|
||||
"platform_os": "debian6",
|
||||
"target": {
|
||||
"name": "core2",
|
||||
"vendor": "GenuineIntel",
|
||||
"features": [
|
||||
"mmx",
|
||||
"sse",
|
||||
"sse2",
|
||||
"ssse3"
|
||||
],
|
||||
"generation": 0,
|
||||
"parents": [
|
||||
"nocona"
|
||||
]
|
||||
}
|
||||
},
|
||||
"compiler": {
|
||||
"name": "gcc",
|
||||
"version": "4.5.0"
|
||||
},
|
||||
"namespace": "builtin.mock",
|
||||
"parameters": {
|
||||
"cflags": [],
|
||||
"cppflags": [],
|
||||
"cxxflags": [],
|
||||
"fflags": [],
|
||||
"ldflags": [],
|
||||
"ldlibs": []
|
||||
},
|
||||
"hash": "t77enxfrcdrc6mumxzcdossrq4gvdliq"
|
||||
},
|
||||
"5zg6wxwir2xien62soca6xaeilfzofz7": {
|
||||
"name": "dttop",
|
||||
"version": "1.0",
|
||||
"arch": {
|
||||
"platform": "test",
|
||||
"platform_os": "debian6",
|
||||
"target": {
|
||||
"name": "core2",
|
||||
"vendor": "GenuineIntel",
|
||||
"features": [
|
||||
"mmx",
|
||||
"sse",
|
||||
"sse2",
|
||||
"ssse3"
|
||||
],
|
||||
"generation": 0,
|
||||
"parents": [
|
||||
"nocona"
|
||||
]
|
||||
}
|
||||
},
|
||||
"compiler": {
|
||||
"name": "gcc",
|
||||
"version": "4.5.0"
|
||||
},
|
||||
"namespace": "builtin.mock",
|
||||
"parameters": {
|
||||
"cflags": [],
|
||||
"cppflags": [],
|
||||
"cxxflags": [],
|
||||
"fflags": [],
|
||||
"ldflags": [],
|
||||
"ldlibs": []
|
||||
},
|
||||
"dependencies": [
|
||||
{
|
||||
"name": "dtbuild1",
|
||||
"build_hash": "l7ikvcp4qgxtc4queb2kawhd267pylkn",
|
||||
"type": [
|
||||
"build"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "dtlink1",
|
||||
"build_hash": "4skh62lxn6gra5li7sqaeunzgaxjkbns",
|
||||
"type": [
|
||||
"build",
|
||||
"link"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "dtrun1",
|
||||
"build_hash": "upfcexeb7zwzxdsimesyzo42yz35bw2s",
|
||||
"type": [
|
||||
"run"
|
||||
]
|
||||
}
|
||||
],
|
||||
"hash": "foya4e4rtwl5ep4mq463sdeslgaoc3qu"
|
||||
},
|
||||
"l7ikvcp4qgxtc4queb2kawhd267pylkn": {
|
||||
"name": "dtbuild1",
|
||||
"version": "1.0",
|
||||
"arch": {
|
||||
"platform": "test",
|
||||
"platform_os": "debian6",
|
||||
"target": {
|
||||
"name": "core2",
|
||||
"vendor": "GenuineIntel",
|
||||
"features": [
|
||||
"mmx",
|
||||
"sse",
|
||||
"sse2",
|
||||
"ssse3"
|
||||
],
|
||||
"generation": 0,
|
||||
"parents": [
|
||||
"nocona"
|
||||
]
|
||||
}
|
||||
},
|
||||
"compiler": {
|
||||
"name": "gcc",
|
||||
"version": "4.5.0"
|
||||
},
|
||||
"namespace": "builtin.mock",
|
||||
"parameters": {
|
||||
"cflags": [],
|
||||
"cppflags": [],
|
||||
"cxxflags": [],
|
||||
"fflags": [],
|
||||
"ldflags": [],
|
||||
"ldlibs": []
|
||||
},
|
||||
"dependencies": [
|
||||
{
|
||||
"name": "dtbuild2",
|
||||
"build_hash": "pq6krl6alw7ic5ix4g5izvlzt2llbvcp",
|
||||
"type": [
|
||||
"build"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "dtlink2",
|
||||
"build_hash": "5isttyk6zuekua2nqp23rrjpmcpo7y6a",
|
||||
"type": [
|
||||
"build",
|
||||
"link"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "dtrun2",
|
||||
"build_hash": "ypkyvbgxdzvverb7ami5rb6yxmp5ylmo",
|
||||
"type": [
|
||||
"run"
|
||||
]
|
||||
}
|
||||
],
|
||||
"hash": "4tldi4u3p35juizd5y5pqushwiddwmbm"
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,6 @@
|
||||
==> Testing package printing-package-1.0-hzgcoow
|
||||
BEFORE TEST
|
||||
==> [2022-02-28-20:21:46.510616] test: true: expect command status in [0]
|
||||
==> [2022-02-28-20:21:46.510937] '/bin/true'
|
||||
PASSED
|
||||
AFTER TEST
|
@ -0,0 +1 @@
|
||||
printing-package-1.0-hzgcoow PASSED
|
@ -0,0 +1,51 @@
|
||||
{
|
||||
"specs": [
|
||||
{
|
||||
"spec": {
|
||||
"_meta": {
|
||||
"version": 2
|
||||
},
|
||||
"nodes": [
|
||||
{
|
||||
"name": "printing-package",
|
||||
"version": "1.0",
|
||||
"arch": {
|
||||
"platform": "test",
|
||||
"platform_os": "debian6",
|
||||
"target": {
|
||||
"name": "core2",
|
||||
"vendor": "GenuineIntel",
|
||||
"features": [
|
||||
"mmx",
|
||||
"sse",
|
||||
"sse2",
|
||||
"ssse3"
|
||||
],
|
||||
"generation": 0,
|
||||
"parents": [
|
||||
"nocona"
|
||||
]
|
||||
}
|
||||
},
|
||||
"compiler": {
|
||||
"name": "gcc",
|
||||
"version": "4.5.0"
|
||||
},
|
||||
"namespace": "builtin.mock",
|
||||
"parameters": {
|
||||
"cflags": [],
|
||||
"cppflags": [],
|
||||
"cxxflags": [],
|
||||
"fflags": [],
|
||||
"ldflags": [],
|
||||
"ldlibs": []
|
||||
},
|
||||
"hash": "hzgcoowzej2ftjj3v4nkdling63w2xcc",
|
||||
"full_hash": "fakehash492ucwhwvzhxfbmcc45x49ha"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"alias": "printpkg"
|
||||
}
|
@ -27,7 +27,7 @@ def test_hash_change_no_rehash_concrete(tmpdir, mock_packages, config):
|
||||
# rewrite the hash
|
||||
old_hash = env.concretized_order[0]
|
||||
new_hash = 'abc'
|
||||
env.specs_by_hash[old_hash]._build_hash = new_hash
|
||||
env.specs_by_hash[old_hash]._hash = new_hash
|
||||
env.concretized_order[0] = new_hash
|
||||
env.specs_by_hash[new_hash] = env.specs_by_hash[old_hash]
|
||||
del env.specs_by_hash[old_hash]
|
||||
@ -39,7 +39,7 @@ def test_hash_change_no_rehash_concrete(tmpdir, mock_packages, config):
|
||||
# Ensure read hashes are used (rewritten hash seen on read)
|
||||
assert read_in.concretized_order
|
||||
assert read_in.concretized_order[0] in read_in.specs_by_hash
|
||||
assert read_in.specs_by_hash[read_in.concretized_order[0]]._build_hash == new_hash
|
||||
assert read_in.specs_by_hash[read_in.concretized_order[0]]._hash == new_hash
|
||||
|
||||
|
||||
def test_activate_should_require_an_env():
|
||||
|
@ -215,9 +215,9 @@ def test_python_ignore_namespace_init_conflict(
|
||||
python_spec = spack.spec.Spec('python@2.7.12')
|
||||
python_spec._concrete = True
|
||||
|
||||
ext1_pkg = create_python_ext_pkg('py-extension1', ext1_prefix, python_spec,
|
||||
ext1_pkg = create_python_ext_pkg('py-extension1@1.0.0', ext1_prefix, python_spec,
|
||||
monkeypatch, py_namespace)
|
||||
ext2_pkg = create_python_ext_pkg('py-extension2', ext2_prefix, python_spec,
|
||||
ext2_pkg = create_python_ext_pkg('py-extension2@1.0.0', ext2_prefix, python_spec,
|
||||
monkeypatch, py_namespace)
|
||||
|
||||
view_dir = str(tmpdir.join('view'))
|
||||
@ -250,9 +250,9 @@ def test_python_keep_namespace_init(
|
||||
python_spec = spack.spec.Spec('python@2.7.12')
|
||||
python_spec._concrete = True
|
||||
|
||||
ext1_pkg = create_python_ext_pkg('py-extension1', ext1_prefix, python_spec,
|
||||
ext1_pkg = create_python_ext_pkg('py-extension1@1.0.0', ext1_prefix, python_spec,
|
||||
monkeypatch, py_namespace)
|
||||
ext2_pkg = create_python_ext_pkg('py-extension2', ext2_prefix, python_spec,
|
||||
ext2_pkg = create_python_ext_pkg('py-extension2@1.0.0', ext2_prefix, python_spec,
|
||||
monkeypatch, py_namespace)
|
||||
|
||||
view_dir = str(tmpdir.join('view'))
|
||||
@ -293,9 +293,9 @@ def test_python_namespace_conflict(tmpdir, namespace_extensions,
|
||||
python_spec = spack.spec.Spec('python@2.7.12')
|
||||
python_spec._concrete = True
|
||||
|
||||
ext1_pkg = create_python_ext_pkg('py-extension1', ext1_prefix, python_spec,
|
||||
ext1_pkg = create_python_ext_pkg('py-extension1@1.0.0', ext1_prefix, python_spec,
|
||||
monkeypatch, py_namespace)
|
||||
ext2_pkg = create_python_ext_pkg('py-extension2', ext2_prefix, python_spec,
|
||||
ext2_pkg = create_python_ext_pkg('py-extension2@1.0.0', ext2_prefix, python_spec,
|
||||
monkeypatch, other_namespace)
|
||||
|
||||
view_dir = str(tmpdir.join('view'))
|
||||
|
@ -143,7 +143,7 @@ def test_check_prefix_manifest(tmpdir):
|
||||
prefix_path = tmpdir.join('prefix')
|
||||
prefix = str(prefix_path)
|
||||
|
||||
spec = spack.spec.Spec('libelf')
|
||||
spec = spack.spec.Spec('libelf@0.8.13')
|
||||
spec._mark_concrete()
|
||||
spec.prefix = prefix
|
||||
|
||||
|
@ -14,6 +14,7 @@ class Dtbuild1(Package):
|
||||
url = "http://www.example.com/dtbuild1-1.0.tar.gz"
|
||||
|
||||
version('1.0', '0123456789abcdef0123456789abcdef')
|
||||
version('0.5', 'fedcba9876543210fedcba9876543210')
|
||||
|
||||
depends_on('dtbuild2', type='build')
|
||||
depends_on('dtlink2')
|
||||
|
Loading…
Reference in New Issue
Block a user