stacks: allow force-removing from a speclist used in a matrix
This commit is contained in:
parent
533a8d7c82
commit
f9e6de5474
2 changed files with 21 additions and 12 deletions
|
@ -680,6 +680,8 @@ def add(self, user_spec, list_name='specs'):
|
||||||
list_to_change.add(str(spec))
|
list_to_change.add(str(spec))
|
||||||
index = list(self.read_specs.keys()).index(list_name)
|
index = list(self.read_specs.keys()).index(list_name)
|
||||||
|
|
||||||
|
# read_specs is an OrderedDict, all list entries after the modified
|
||||||
|
# list may refer to the modified list. Update stale references
|
||||||
for i, (name, speclist) in enumerate(
|
for i, (name, speclist) in enumerate(
|
||||||
list(self.read_specs.items())[index + 1:], index + 1):
|
list(self.read_specs.items())[index + 1:], index + 1):
|
||||||
new_reference = dict((n, self.read_specs[n])
|
new_reference = dict((n, self.read_specs[n])
|
||||||
|
@ -711,10 +713,24 @@ def remove(self, query_spec, list_name='specs', force=False):
|
||||||
raise SpackEnvironmentError(
|
raise SpackEnvironmentError(
|
||||||
"Not found: {0}".format(query_spec))
|
"Not found: {0}".format(query_spec))
|
||||||
|
|
||||||
|
old_specs = set(self.user_specs)
|
||||||
for spec in matches:
|
for spec in matches:
|
||||||
if spec in list_to_change:
|
if spec in list_to_change:
|
||||||
list_to_change.remove(spec)
|
list_to_change.remove(spec)
|
||||||
|
|
||||||
|
# read_specs is an OrderedDict, all list entries after the modified
|
||||||
|
# list may refer to the modified list. Update stale references
|
||||||
|
index = list(self.read_specs.keys()).index(list_name)
|
||||||
|
for i, (name, speclist) in enumerate(
|
||||||
|
list(self.read_specs.items())[index + 1:], index + 1):
|
||||||
|
new_reference = dict((n, self.read_specs[n])
|
||||||
|
for n in list(self.read_specs.keys())[:i])
|
||||||
|
speclist.update_reference(new_reference)
|
||||||
|
|
||||||
|
# If force, update stale concretized specs
|
||||||
|
# Only check specs removed by this operation
|
||||||
|
new_specs = set(self.user_specs)
|
||||||
|
for spec in old_specs - new_specs:
|
||||||
if force and spec in self.concretized_user_specs:
|
if force and spec in self.concretized_user_specs:
|
||||||
i = self.concretized_user_specs.index(spec)
|
i = self.concretized_user_specs.index(spec)
|
||||||
del self.concretized_user_specs[i]
|
del self.concretized_user_specs[i]
|
||||||
|
@ -723,13 +739,6 @@ def remove(self, query_spec, list_name='specs', force=False):
|
||||||
del self.concretized_order[i]
|
del self.concretized_order[i]
|
||||||
del self.specs_by_hash[dag_hash]
|
del self.specs_by_hash[dag_hash]
|
||||||
|
|
||||||
index = list(self.read_specs.keys()).index(list_name)
|
|
||||||
for i, (name, speclist) in enumerate(
|
|
||||||
list(self.read_specs.items())[index + 1:], index + 1):
|
|
||||||
new_reference = dict((n, self.read_specs[n])
|
|
||||||
for n in list(self.read_specs.keys())[:i])
|
|
||||||
speclist.update_reference(new_reference)
|
|
||||||
|
|
||||||
def concretize(self, force=False):
|
def concretize(self, force=False):
|
||||||
"""Concretize user_specs in this environment.
|
"""Concretize user_specs in this environment.
|
||||||
|
|
||||||
|
|
|
@ -846,12 +846,12 @@ def test_stack_yaml_remove_from_list_force(tmpdir):
|
||||||
remove('-f', '-l', 'packages', 'mpileaks')
|
remove('-f', '-l', 'packages', 'mpileaks')
|
||||||
find_output = find('-c')
|
find_output = find('-c')
|
||||||
|
|
||||||
print find_output
|
assert 'mpileaks' not in find_output
|
||||||
assert False
|
|
||||||
test = ev.read('test')
|
|
||||||
|
|
||||||
assert Spec('mpileaks') not in test.user_specs
|
test = ev.read('test')
|
||||||
assert Spec('callpath') in test.user_specs
|
assert len(test.user_specs) == 2
|
||||||
|
assert Spec('callpath ^zmpi') in test.user_specs
|
||||||
|
assert Spec('callpath ^mpich') in test.user_specs
|
||||||
|
|
||||||
|
|
||||||
def test_stack_yaml_attempt_remove_from_matrix(tmpdir):
|
def test_stack_yaml_attempt_remove_from_matrix(tmpdir):
|
||||||
|
|
Loading…
Reference in a new issue