diff --git a/docs/news.rst b/docs/news.rst index 31710fa3..fa942d98 100644 --- a/docs/news.rst +++ b/docs/news.rst @@ -1,6 +1,11 @@ Release Notes ============= +**UNRELEASED** + +- Fixed ``wheel convert`` unnecessarily upgrading compatible core metadata versions + (`#643 `_) + **0.47.0 (2026-04-22)** - Added the ``wheel info`` subcommand to display metadata about wheel files without diff --git a/src/wheel/_commands/convert.py b/src/wheel/_commands/convert.py index cafd12c8..567cb7d1 100644 --- a/src/wheel/_commands/convert.py +++ b/src/wheel/_commands/convert.py @@ -66,6 +66,7 @@ def convert_requires(requires: str, metadata: Message) -> None: def convert_pkg_info(pkginfo: str, metadata: Message) -> None: parsed_message = Parser().parsestr(pkginfo) + metadata_version = parsed_message.get("Metadata-Version", "1.0") for key, value in parsed_message.items(): key_lower = key.lower() if value == "UNKNOWN": @@ -92,7 +93,23 @@ def convert_pkg_info(pkginfo: str, metadata: Message) -> None: else: metadata.add_header(key, value) - metadata.replace_header("Metadata-Version", "2.4") + metadata.replace_header( + "Metadata-Version", + _compatible_metadata_version(metadata_version), + ) + + +def _compatible_metadata_version(metadata_version: str) -> str: + try: + major_str, minor_str = metadata_version.split(".", 1) + major_minor = (int(major_str), int(minor_str)) + except ValueError: + return "1.2" + + if major_minor < (1, 2): + return "1.2" + + return metadata_version def normalize(name: str) -> str: diff --git a/tests/commands/test_convert.py b/tests/commands/test_convert.py index 73ed81ef..dcf1846c 100644 --- a/tests/commands/test_convert.py +++ b/tests/commands/test_convert.py @@ -42,7 +42,7 @@ """ EXPECTED_METADATA = """\ -Metadata-Version: 2.4 +Metadata-Version: 2.1 Name: Sampledist Version: 1.0.0 Author: Alex Grönholm @@ -289,3 +289,15 @@ def test_convert_pkg_info_with_one_line_description() -> None: convert_pkg_info(pkginfo, message) assert message.get_all("Name") == ["Sampledist"] assert message.get_payload() == "My cool package\n\n\n" + + +def test_convert_pkg_info_uses_lowest_compatible_metadata_version() -> None: + pkginfo = """\ +Metadata-Version: 1.1 +Name: Sampledist +Version: 1.0.0 +Home-page: https://example.com +""" + message = Message() + convert_pkg_info(pkginfo, message) + assert message["Metadata-Version"] == "1.2"