Support repeated keys in --config-settings

This commit is contained in:
Maxwell G 2023-05-30 13:36:42 -05:00
commit a9868b4795
No known key found for this signature in database
GPG key ID: F79E4E25E8C661F8
2 changed files with 87 additions and 1 deletions

View file

@ -0,0 +1,76 @@
From d498b3997167865a42f4c663eac518cae3a0daeb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Filipe=20La=C3=ADns?= <lains@riseup.net>
Date: Fri, 17 Mar 2023 21:23:19 +0000
Subject: [PATCH] Support passing the same key multiple times in
--config-settings (#11853)
(cherry picked from commit 1268487cbab1b2ffab881b5961c0476e655b6c88)
---
news/11681.feature.rst | 4 ++++
src/pip/_internal/cli/cmdoptions.py | 8 +++++++-
tests/unit/test_pyproject_config.py | 15 ++++++++++++---
3 files changed, 23 insertions(+), 4 deletions(-)
create mode 100644 news/11681.feature.rst
diff --git a/news/11681.feature.rst b/news/11681.feature.rst
new file mode 100644
index 000000000..a0d918b19
--- /dev/null
+++ b/news/11681.feature.rst
@@ -0,0 +1,4 @@
+The ``--config-settings``/``-C`` option now supports using the same key multiple
+times. When the same key is specified multiple times, all values are passed to
+the build backend as a list, as opposed to the previous behavior where pip would
+only pass the last value is the same key was used multiple times.
diff --git a/src/pip/_internal/cli/cmdoptions.py b/src/pip/_internal/cli/cmdoptions.py
index b4e2560de..4179f98a5 100644
--- a/src/pip/_internal/cli/cmdoptions.py
+++ b/src/pip/_internal/cli/cmdoptions.py
@@ -803,7 +803,13 @@ def _handle_config_settings(
if dest is None:
dest = {}
setattr(parser.values, option.dest, dest)
- dest[key] = val
+ if key in dest:
+ if isinstance(dest[key], list):
+ dest[key].append(val)
+ else:
+ dest[key] = [dest[key], val]
+ else:
+ dest[key] = val
config_settings: Callable[..., Option] = partial(
diff --git a/tests/unit/test_pyproject_config.py b/tests/unit/test_pyproject_config.py
index 9937f3880..c7e469560 100644
--- a/tests/unit/test_pyproject_config.py
+++ b/tests/unit/test_pyproject_config.py
@@ -1,3 +1,5 @@
+from typing import Dict, List
+
import pytest
from pip._internal.commands import create_command
@@ -36,9 +38,16 @@ def test_set_config_empty_value() -> None:
assert options.config_settings == {"x": ""}
-def test_replace_config_value() -> None:
+@pytest.mark.parametrize(
+ ("passed", "expected"),
+ [
+ (["x=hello", "x=world"], {"x": ["hello", "world"]}),
+ (["x=hello", "x=world", "x=other"], {"x": ["hello", "world", "other"]}),
+ ],
+)
+def test_multiple_config_values(passed: List[str], expected: Dict[str, str]) -> None:
i = create_command("install")
options, _ = i.parse_args(
- ["xxx", "--config-settings", "x=hello", "--config-settings", "x=world"]
+ ["xxx", *(f"--config-settings={option}" for option in passed)]
)
- assert options.config_settings == {"x": "world"}
+ assert options.config_settings == expected
--
2.40.1

View file

@ -21,7 +21,7 @@
Name: python-%{srcname}
Version: %{base_version}%{?prerel:~%{prerel}}
Release: 2%{?dist}
Release: 3%{?dist}
Summary: A tool for installing and managing Python packages
# We bundle a lot of libraries with pip, which itself is under MIT license.
@ -90,6 +90,13 @@ Patch: nowarn-pip._internal.main.patch
# Upstream issue: https://github.com/pypa/packaging/issues/368
Patch: no-version-warning.patch
# Support passing the same key multiple times in --config-settings
# This is needed for pyproject-rpm-macros to have consistent behavior across
# Fedora releases.
# Based on:
# https://github.com/pypa/pip/commit/1268487cbab1b2ffab881b5961c0476e655b6c88
Patch: Support-passing-the-same-key-multiple-times-in-confi.patch
# Downstream only patch
# Users might have local installations of pip from using
# `pip install --user --upgrade pip` on older/newer versions.
@ -390,6 +397,9 @@ pytest_k='not completion'
%{python_wheel_dir}/%{python_wheel_name}
%changelog
* Tue May 30 2023 Maxwell G <maxwell@gtmx.me> - 22.3.1-3
- Backport patch to support passing the same key multiple times in --config-settings
* Fri Jan 20 2023 Fedora Release Engineering <releng@fedoraproject.org> - 22.3.1-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild