From 8f3b025b5502120c99c483b619ae83d2ead07c7f Mon Sep 17 00:00:00 2001 From: Andrew W Elble Date: Thu, 16 Dec 2021 05:54:35 -0500 Subject: MANPATH needs a trailing ':' to utilize system defaults (#21682) otherwise spack breaks using system man pages by default. Co-authored-by: Harmen Stoppels --- lib/spack/spack/test/cmd/load.py | 19 +++++++++++++++++++ lib/spack/spack/util/environment.py | 4 +++- .../repos/builtin.mock/packages/mpileaks/package.py | 1 + 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/lib/spack/spack/test/cmd/load.py b/lib/spack/spack/test/cmd/load.py index ef014418c7..51867b548c 100644 --- a/lib/spack/spack/test/cmd/load.py +++ b/lib/spack/spack/test/cmd/load.py @@ -3,6 +3,7 @@ # # SPDX-License-Identifier: (Apache-2.0 OR MIT) import os +import re import pytest @@ -16,6 +17,24 @@ install = SpackCommand('install') location = SpackCommand('location') +def test_manpath_trailing_colon(install_mockery, mock_fetch, mock_archive, + mock_packages, working_env): + """Test that the commands generated by load add the MANPATH prefix + inspections. Also test that Spack correctly preserves the default/existing + manpath search path via a trailing colon""" + install('mpileaks') + + sh_out = load('--sh', '--only', 'package', 'mpileaks') + lines = sh_out.split('\n') + assert any(re.match(r'export MANPATH=.*:;', ln) for ln in lines) + + os.environ['MANPATH'] = '/tmp/man:' + + sh_out = load('--sh', '--only', 'package', 'mpileaks') + lines = sh_out.split('\n') + assert any(re.match(r'export MANPATH=.*:/tmp/man:;', ln) for ln in lines) + + def test_load(install_mockery, mock_fetch, mock_archive, mock_packages): """Test that the commands generated by load add the specified prefix inspections. Also test that Spack records loaded specs by hash in the diff --git a/lib/spack/spack/util/environment.py b/lib/spack/spack/util/environment.py index a0a6c4a3aa..f0457c27b8 100644 --- a/lib/spack/spack/util/environment.py +++ b/lib/spack/spack/util/environment.py @@ -611,7 +611,6 @@ class EnvironmentModifications(object): def shell_modifications(self, shell='sh', explicit=False, env=None): """Return shell code to apply the modifications and clears the list.""" modifications = self.group_by_name() - new_env = os.environ.copy() if env is None: env = os.environ @@ -622,6 +621,9 @@ class EnvironmentModifications(object): for x in actions: x.execute(new_env) + if 'MANPATH' in new_env and not new_env.get('MANPATH').endswith(':'): + new_env['MANPATH'] += ':' + cmds = '' for name in sorted(set(modifications)): diff --git a/var/spack/repos/builtin.mock/packages/mpileaks/package.py b/var/spack/repos/builtin.mock/packages/mpileaks/package.py index e0bff0673b..36c073ccf0 100644 --- a/var/spack/repos/builtin.mock/packages/mpileaks/package.py +++ b/var/spack/repos/builtin.mock/packages/mpileaks/package.py @@ -28,6 +28,7 @@ class Mpileaks(Package): def install(self, spec, prefix): touch(prefix.mpileaks) + mkdirp(prefix.man) def setup_environment(self, senv, renv): renv.set('FOOBAR', self.name) -- cgit v1.2.3-70-g09d2