{"record":{"id":"4420e19b25be45b0","repo":"pypa/pip","slug":"invalid-sdist-filename-extension-must-be-tar-gz","errorCode":null,"errorMessage":"Invalid sdist filename (extension must be '.tar.gz' or '.zip'): {filename!r}","messagePattern":"Invalid sdist filename \\(extension must be '\\.tar\\.gz' or '\\.zip'\\): (.+?)","errorType":"validation","errorClass":"InvalidSdistFilename","httpStatus":null,"severity":"error","filePath":"src/pip/_vendor/packaging/utils.py","lineNumber":346,"sourceCode":"    .. versionadded:: 20.9\n\n    .. versionchanged:: 21.0\n       Added support for ``.zip`` source distributions.\n\n    .. versionchanged:: 23.2\n       Raises :class:`InvalidSdistFilename` when the version component is invalid.\n\n    .. versionchanged:: 26.3\n       Raises :class:`InvalidSdistFilename` on an empty project name.\n\n    .. _Source distribution format: https://packaging.python.org/specifications/source-distribution-format/#source-distribution-file-name\n    \"\"\"\n    if filename.endswith(\".tar.gz\"):\n        file_stem = filename[: -len(\".tar.gz\")]\n    elif filename.endswith(\".zip\"):\n        file_stem = filename[: -len(\".zip\")]\n    else:\n        raise InvalidSdistFilename(\n            f\"Invalid sdist filename (extension must be '.tar.gz' or '.zip'):\"\n            f\" {filename!r}\"\n        )\n\n    # We are requiring a PEP 440 version, which cannot contain dashes,\n    # so we split on the last dash.\n    name_part, sep, version_part = file_stem.rpartition(\"-\")\n    if not sep:\n        raise InvalidSdistFilename(f\"Invalid sdist filename: {filename!r}\")\n    if not name_part:\n        raise InvalidSdistFilename(\n            f\"Invalid sdist filename (empty project name): {filename!r}\"\n        )\n\n    name = canonicalize_name(name_part)\n\n    try:\n        version = Version(version_part)","sourceCodeStart":328,"sourceCodeEnd":364,"githubUrl":"https://github.com/pypa/pip/blob/f399c3718970b1b0e2478dac5296eb62679a9b86/src/pip/_vendor/packaging/utils.py#L328-L364","documentation":"Raised by parse_sdist_filename() when the filename does not end with '.tar.gz' or '.zip' (utils.py:341-349). The source distribution format only permits these two extensions. The exception class is InvalidSdistFilename (a ValueError subclass).","triggerScenarios":"Calling parse_sdist_filename() with a wheel filename, a '.tar.bz2' file, a '.7z' file, or any filename without a recognized sdist extension.","commonSituations":"Passing a wheel filename to the sdist parser, encountering a modern source archive format (.tar.bz2, .tar.zst) that the parser does not support, or a typo in the extension.","solutions":["Ensure the filename ends with '.tar.gz' or '.zip'.","If the file is a wheel (.whl), use parse_wheel_filename() instead.","Re-package the sdist in a supported format if it uses .tar.bz2 or another archive type."],"exampleFix":"// before\nparse_sdist_filename('foo-1.0.tar.bz2')\n// after\nparse_sdist_filename('foo-1.0.tar.gz')","handlingStrategy":"validation","validationCode":"from packaging.utils import parse_sdist_filename, InvalidSdistFilename\n\ndef safe_parse_sdist(filename: str):\n    if not (filename.endswith(\".tar.gz\") or filename.endswith(\".zip\")):\n        raise ValueError(f\"Not an sdist file: {filename!r}\")\n    return parse_sdist_filename(filename)","typeGuard":"def is_sdist_filename(filename: str) -> bool:\n    return isinstance(filename, str) and (\n        filename.endswith(\".tar.gz\") or filename.endswith(\".zip\")\n    )","tryCatchPattern":"from packaging.utils import InvalidSdistFilename\n\ntry:\n    name, ver = parse_sdist_filename(filename)\nexcept InvalidSdistFilename as e:\n    logger.warning(\"Skipping non-sdist file %s: %s\", filename, e)","preventionTips":["Filter files by '.tar.gz' or '.zip' extension before parsing","Route '.whl' files to parse_wheel_filename()","Re-package unsupported archive formats (.tar.bz2, .7z) into .tar.gz"],"tags":["sdist","filename","packaging"],"backgroundTag":null,"analyzedSha":"f399c3718970b1b0e2478dac5296eb62679a9b86","analyzedAt":"2026-08-08T23:01:42.227Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}