nodejs/node · error · InvalidSdistFilename

Invalid sdist filename: {filename}

Error message

Invalid sdist filename: {filename}

What it means

InvalidSdistFilename raised when, after stripping the extension, rpartition('-') finds no dash at all - meaning the stem cannot be split into name and version. PEP 440 versions cannot contain dashes, so a single dash is expected to separate name from version.

Source

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

    return (name, version, build, tags)


def parse_sdist_filename(filename: str) -> Tuple[NormalizedName, Version]:
    if filename.endswith(".tar.gz"):
        file_stem = filename[: -len(".tar.gz")]
    elif filename.endswith(".zip"):
        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. Ensure sdist filenames follow the 'name-version.tar.gz' convention.
  2. Regenerate the sdist with a PEP 517 backend that names files correctly.
  3. Validate the presence of a dash-separated version before parsing.

Example fix

# before
# 'mypkg.tar.gz'

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

Strategy: validation

Validate before calling

def sdist_has_version(filename: str) -> bool:
    if filename.endswith('.tar.gz'):
        stem = filename[:-len('.tar.gz')]
    elif filename.endswith('.zip'):
        stem = filename[:-len('.zip')]
    else:
        return False
    return '-' in stem

Try / catch

try:
    name, ver = parse_sdist_filename(fn)
except InvalidSdistFilename as e:
    if 'Invalid sdist filename:' in str(e):
        pass  # filename lacks name-version structure; skip or rename

Prevention

When it happens

Trigger: An sdist filename like 'mypkg.tar.gz' (no version), or a stem with no dash separator between name and version.

Common situations: Malformed sdist names from non-standard build tools, or files renamed to drop the version component.

Related errors


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