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
- Use a PEP 440 compliant version string in the project.
- 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.
- 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
- Use PEP 440 versions.
- Avoid dashes in sdist project names (they confuse the splitter).
- Derive version from project metadata, not filenames.
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
- Invalid wheel filename (invalid version): {filename}
- Invalid sdist filename (extension must be '.tar.gz' or '.zip
- Invalid sdist filename: {filename}
- Invalid version: '{version}'
- Invalid specifier: '{spec}'
AI-assisted analysis of nodejs/node@1b2de5e052 (2026-08-13).
Data as JSON: /api/errors/2bedd4d19d5cb7ef.
Report an issue: GitHub.