Fix release versioning: keep tree ruff-clean, fail fast on dirty tag builds

The tagged v0.10.6 CI build produced wheels versioned
0.10.7.dev0+g503ce8e49.d20261004: setup.py was not ruff-format-clean, so
release.py's own 'ruff format .' step rewrote it, dirtying the checkout
before setuptools_scm ran. PyPI then rejected the local version segment
with HTTP 400.

- ruff-format setup.py
- release.py: on a v*-tagged HEAD, fail before building if the version
  is not a clean release, printing the dirty files
- add .gitattributes (eol=lf) so Windows checkouts can't dirty the tree
  via normalize_line_endings either
This commit is contained in:
LeoVasanko committed 2026-10-04 18:15:07 +00:00
1 parent 503ce8e491
commit 3ff145a0f0
4 files changed
+33 -2

No files matched your search

+27
View File
@@ -347,6 +347,33 @@ def main():
return 1
is_release = is_release_version(version)
# On a tagged commit the version must be a clean release (e.g. 0.10.6).
# A dev/dirty version means the steps above rewrote a tracked file (or the
# checkout was dirty); PyPI rejects such versions, so fail before building.
head_tags = subprocess.run(
["git", "tag", "--points-at", "HEAD", "--list", "v*"],
capture_output=True,
text=True,
check=False,
).stdout.split()
if head_tags and not is_release:
print(
f"✗ HEAD is tagged ({', '.join(head_tags)}) but the version resolved "
f"to {version}, not a clean release.",
file=sys.stderr,
)
dirty = subprocess.run(
["git", "status", "--porcelain"],
capture_output=True,
text=True,
check=False,
).stdout
if dirty.strip():
print("Working copy is dirty:", file=sys.stderr)
print(dirty, file=sys.stderr, end="")
print("Commit the changes, re-tag, and run again.", file=sys.stderr)
return 1
# Main header for the packaging process
print(f"\n{'=' * 70}")
print(