diff --git a/news/13790.bugfix.rst b/news/13790.bugfix.rst new file mode 100644 index 00000000000..ee86424f168 --- /dev/null +++ b/news/13790.bugfix.rst @@ -0,0 +1 @@ +Improve the error message from ``pip config set`` when ``PIP_CONFIG_FILE`` points to a non-regular file (e.g. ``/dev/null``). diff --git a/src/pip/_internal/configuration.py b/src/pip/_internal/configuration.py index e164653bbc2..0816de012cc 100644 --- a/src/pip/_internal/configuration.py +++ b/src/pip/_internal/configuration.py @@ -378,9 +378,16 @@ def _get_parser_to_modify(self) -> tuple[str, RawConfigParser]: assert self.load_only parsers = self._parsers[self.load_only] if not parsers: - # This should not happen if everything works correctly. + env_config_file = os.environ.get("PIP_CONFIG_FILE") + if env_config_file and not os.path.isfile(env_config_file): + raise ConfigurationError( + "Cannot modify pip configuration: " + "PIP_CONFIG_FILE is not a regular file: " + f"{env_config_file}" + ) + raise ConfigurationError( - "Fatal Internal error [id=2]. Please report as a bug." + "Cannot modify pip configuration: no configuration file is available." ) # Use the highest priority parser. diff --git a/tests/functional/test_configuration.py b/tests/functional/test_configuration.py index b235212477a..3c8b8c6670e 100644 --- a/tests/functional/test_configuration.py +++ b/tests/functional/test_configuration.py @@ -216,6 +216,22 @@ def test_config_separated( result.stdout, ) + def test_config_set_with_pip_config_file_devnull_shows_human_error( + self, script: PipTestEnvironment + ) -> None: + script.environ["PIP_CONFIG_FILE"] = os.devnull + + result = script.pip( + "config", + "set", + "global.index-url", + "https://example.com/", + expect_error=True, + ) + assert "Fatal Internal error [id=2]" not in result.stderr + assert "PIP_CONFIG_FILE" in result.stderr + assert "not a regular file" in result.stderr + @pytest.mark.network def test_editable_mode_default_config( self, script: PipTestEnvironment, data: TestData