Ensure command_line scope is always last (#48255)
This commit is contained in:
parent
e9cdcc4af0
commit
78bd905fe0
@ -529,6 +529,7 @@ def __call__(self, parser, namespace, values, option_string):
|
|||||||
# the const from the constructor or a value from the CLI.
|
# the const from the constructor or a value from the CLI.
|
||||||
# Note that this is only called if the argument is actually
|
# Note that this is only called if the argument is actually
|
||||||
# specified on the command line.
|
# specified on the command line.
|
||||||
|
spack.config.CONFIG.ensure_scope_ordering()
|
||||||
spack.config.set(self.config_path, self.const, scope="command_line")
|
spack.config.set(self.config_path, self.const, scope="command_line")
|
||||||
|
|
||||||
|
|
||||||
|
@ -431,6 +431,19 @@ def ensure_unwrapped(self) -> "Configuration":
|
|||||||
"""Ensure we unwrap this object from any dynamic wrapper (like Singleton)"""
|
"""Ensure we unwrap this object from any dynamic wrapper (like Singleton)"""
|
||||||
return self
|
return self
|
||||||
|
|
||||||
|
def highest(self) -> ConfigScope:
|
||||||
|
"""Scope with highest precedence"""
|
||||||
|
return next(reversed(self.scopes.values())) # type: ignore
|
||||||
|
|
||||||
|
@_config_mutator
|
||||||
|
def ensure_scope_ordering(self):
|
||||||
|
"""Ensure that scope order matches documented precedent"""
|
||||||
|
# FIXME: We also need to consider that custom configurations and other orderings
|
||||||
|
# may not be preserved correctly
|
||||||
|
if "command_line" in self.scopes:
|
||||||
|
# TODO (when dropping python 3.6): self.scopes.move_to_end
|
||||||
|
self.scopes["command_line"] = self.remove_scope("command_line")
|
||||||
|
|
||||||
@_config_mutator
|
@_config_mutator
|
||||||
def push_scope(self, scope: ConfigScope) -> None:
|
def push_scope(self, scope: ConfigScope) -> None:
|
||||||
"""Add a higher precedence scope to the Configuration."""
|
"""Add a higher precedence scope to the Configuration."""
|
||||||
|
@ -3043,11 +3043,13 @@ def prepare_config_scope(self) -> None:
|
|||||||
"""Add the manifest's scopes to the global configuration search path."""
|
"""Add the manifest's scopes to the global configuration search path."""
|
||||||
for scope in self.env_config_scopes:
|
for scope in self.env_config_scopes:
|
||||||
spack.config.CONFIG.push_scope(scope)
|
spack.config.CONFIG.push_scope(scope)
|
||||||
|
spack.config.CONFIG.ensure_scope_ordering()
|
||||||
|
|
||||||
def deactivate_config_scope(self) -> None:
|
def deactivate_config_scope(self) -> None:
|
||||||
"""Remove any of the manifest's scopes from the global config path."""
|
"""Remove any of the manifest's scopes from the global config path."""
|
||||||
for scope in self.env_config_scopes:
|
for scope in self.env_config_scopes:
|
||||||
spack.config.CONFIG.remove_scope(scope.name)
|
spack.config.CONFIG.remove_scope(scope.name)
|
||||||
|
spack.config.CONFIG.ensure_scope_ordering()
|
||||||
|
|
||||||
@contextlib.contextmanager
|
@contextlib.contextmanager
|
||||||
def use_config(self):
|
def use_config(self):
|
||||||
|
@ -1441,3 +1441,30 @@ def test_config_path_dsl(path, it_should_work, expected_parsed):
|
|||||||
else:
|
else:
|
||||||
with pytest.raises(ValueError):
|
with pytest.raises(ValueError):
|
||||||
spack.config.ConfigPath._validate(path)
|
spack.config.ConfigPath._validate(path)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.regression("48254")
|
||||||
|
def test_env_activation_preserves_config_scopes(mutable_mock_env_path):
|
||||||
|
"""Check that the "command_line" scope remains the highest priority scope, when we activate,
|
||||||
|
or deactivate, environments.
|
||||||
|
"""
|
||||||
|
expected_cl_scope = spack.config.CONFIG.highest()
|
||||||
|
assert expected_cl_scope.name == "command_line"
|
||||||
|
|
||||||
|
# Creating an environment pushes a new scope
|
||||||
|
ev.create("test")
|
||||||
|
with ev.read("test"):
|
||||||
|
assert spack.config.CONFIG.highest() == expected_cl_scope
|
||||||
|
|
||||||
|
# No active environment pops the scope
|
||||||
|
with ev.no_active_environment():
|
||||||
|
assert spack.config.CONFIG.highest() == expected_cl_scope
|
||||||
|
assert spack.config.CONFIG.highest() == expected_cl_scope
|
||||||
|
|
||||||
|
# Switch the environment to another one
|
||||||
|
ev.create("test-2")
|
||||||
|
with ev.read("test-2"):
|
||||||
|
assert spack.config.CONFIG.highest() == expected_cl_scope
|
||||||
|
assert spack.config.CONFIG.highest() == expected_cl_scope
|
||||||
|
|
||||||
|
assert spack.config.CONFIG.highest() == expected_cl_scope
|
||||||
|
Loading…
Reference in New Issue
Block a user