nodejs/node · error · InvalidSdistFilename

Invalid sdist filename (invalid version): {filename}

Error message

Invalid sdist filename (invalid version): {filename}

What it means

InvalidSdistFilename raised when the version component (after the last dash) fails to parse as a PEP 440 Version; the inner InvalidVersion is chained via 'from e'.

Source

Thrown at tools/gyp/pylib/packaging/utils.py:168

        file_stem = filename[: -len(".zip")]
    else:
        raise InvalidSdistFilename(
            f"Invalid sdist filename (extension must be '.tar.gz' or '.zip'):"
            f" {filename}"
        )

    # We are requiring a PEP 440 version, which cannot contain dashes,
    # so we split on the last dash.
    name_part, sep, version_part = file_stem.rpartition("-")
    if not sep:
        raise InvalidSdistFilename(f"Invalid sdist filename: {filename}")

    name = canonicalize_name(name_part)

    try:
        version = Version(version_part)
    except InvalidVersion as e:
        raise InvalidSdistFilename(
            f"Invalid sdist filename (invalid version): {filename}"
        ) from e

    return (name, version)

View on GitHub (pinned to 1b2de5e052)

Solutions

  1. Use a PEP 440 compliant version string in the project.
  2. If the project name contains a dash, note sdist filenames do not escape it - this can mislead the splitter; rely on the canonical version from project metadata instead.
  3. Inspect __cause__ (InvalidVersion) for the precise parse failure.

Example fix

# before (non-PEP-440 version)
# 'mypkg-jan2024.tar.gz'

# after
# 'mypkg-1.0.0.tar.gz'
Defensive patterns

Strategy: validation

Validate before calling

from packaging.version import Version, InvalidVersion
def sdist_version_valid(filename: str) -> bool:
    if filename.endswith('.tar.gz'):
        stem = filename[:-7]
    elif filename.endswith('.zip'):
        stem = filename[:-4]
    else:
        return False
    _, sep, ver = stem.rpartition('-')
    if not sep:
        return False
    try:
        Version(ver)
        return True
    except InvalidVersion:
        return False

Try / catch

try:
    name, ver = parse_sdist_filename(fn)
except InvalidSdistFilename as e:
    cause = e.__cause__  # InvalidVersion
    # fix version string, rebuild

Prevention

When it happens

Trigger: An sdist whose version segment is non-PEP-440 (e.g. 'mypkg-latest.tar.gz', 'mypkg-1.0.beta.extra.tar.gz' with disallowed syntax).

Common situations: Custom version strings, date-based versions not in PEP 440 form, or filenames where the dash-split put part of the name into the version slot (e.g. a name containing a dash, since sdist names do not escape dashes the way wheel names do).

Related errors


AI-assisted analysis of nodejs/node@1b2de5e052 (2026-08-13). Data as JSON: /api/errors/2bedd4d19d5cb7ef. Report an issue: GitHub.