Prevent "spack external find" to error out on wrong permissions (#38755)

fixes #38733
This commit is contained in:
Massimiliano Culpo 2023-07-07 12:05:32 +02:00 committed by Harmen Stoppels
parent 69fe0a5518
commit f4cf4e468a
2 changed files with 36 additions and 4 deletions

View File

@ -112,10 +112,15 @@ def path_to_dict(search_paths):
# Reverse order of search directories so that a lib in the first # Reverse order of search directories so that a lib in the first
# entry overrides later entries # entry overrides later entries
for search_path in reversed(search_paths): for search_path in reversed(search_paths):
for lib in os.listdir(search_path): try:
lib_path = os.path.join(search_path, lib) for lib in os.listdir(search_path):
if llnl.util.filesystem.is_readable_file(lib_path): lib_path = os.path.join(search_path, lib)
path_to_lib[lib_path] = lib if llnl.util.filesystem.is_readable_file(lib_path):
path_to_lib[lib_path] = lib
except OSError as e:
msg = f"cannot scan '{search_path}' for external software: {str(e)}"
llnl.util.tty.debug(msg)
return path_to_lib return path_to_lib

View File

@ -396,3 +396,30 @@ def test_use_tags_for_detection(command_args, mock_executable, mutable_config, m
assert "The following specs have been" in output assert "The following specs have been" in output
assert "cmake" in output assert "cmake" in output
assert "openssl" not in output assert "openssl" not in output
@pytest.mark.regression("38733")
@pytest.mark.skipif(sys.platform == "win32", reason="the test uses bash scripts")
def test_failures_in_scanning_do_not_result_in_an_error(
mock_executable, monkeypatch, mutable_config
):
"""Tests that scanning paths with wrong permissions, won't cause `external find` to error."""
cmake_exe1 = mock_executable(
"cmake", output="echo cmake version 3.19.1", subdir=("first", "bin")
)
cmake_exe2 = mock_executable(
"cmake", output="echo cmake version 3.23.3", subdir=("second", "bin")
)
# Remove access from the first directory executable
cmake_exe1.parent.chmod(0o600)
value = os.pathsep.join([str(cmake_exe1.parent), str(cmake_exe2.parent)])
monkeypatch.setenv("PATH", value)
output = external("find", "cmake")
assert external.returncode == 0
assert "The following specs have been" in output
assert "cmake" in output
assert "3.23.3" in output
assert "3.19.1" not in output