Release v0.5.1#78
Conversation
Patch release rolling up the post-0.5.0 fixes: - #69 Atomic state-file writes (closes #36) - #71 Atomic write for cli/setup.py interactive config (closes #70) - #72 README per-installer and per-OS download-breakdown badges - #73 Recycle-bin status probed per share (closes #37) - #77 Per-path serial for multi-path getinfo + delete (closes #68) #77 in particular fixes a v0.5.0 silent-no-op regression on delete_files with multi-path arrays — caller would see "[+] Deleted N item(s)" but no paths were actually deleted on real DSM 7.x. Files touched per project release procedure: - pyproject.toml: 0.5.0 → 0.5.1 - server.json: synced via scripts/sync-server-json.py - uv.lock: refreshed via `uv lock` - CHANGELOG.md: ## Unreleased renamed to ## 0.5.1 (2026-05-01), fresh empty Unreleased added above Local verification on release/v0.5.1: - uv run pytest: 550 passed, 100 deselected, 96.13% coverage - uv run ruff check src/ tests/ scripts/: clean - uv run ruff format --check src/ tests/ scripts/: clean - uv run mypy src/ scripts/: clean - python scripts/sync-server-json.py --check: in sync (0.5.1) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Codecov Report✅ All modified and coverable lines are covered by tests. 📢 Thoughts on this report? Let us know! |
cmeans
left a comment
There was a problem hiding this comment.
QA Round 1 — PASS
Release rollup PR for v0.5.1, bundling #69, #71, #72, #73, #77 — all five already QA-Approved this cycle. Diff is exactly what a clean release PR should be: 6 lines across 4 files, no feature-code changes.
Verification
| Check | Result |
|---|---|
python scripts/sync-server-json.py --check |
server.json in sync with pyproject.toml (0.5.1) |
uv run pytest |
550 passed, 100 deselected, 96.13% coverage (matches the post-#77 baseline) |
uv run ruff check src/ tests/ scripts/ |
clean |
uv run ruff format --check src/ tests/ scripts/ |
72 files already formatted |
uv run mypy src/ scripts/ |
clean (30 files, strict-mode) |
Required CI on d7343e0 |
13/13 green (vdsm completed SUCCESS) |
Diff sanity
Verified the four files contain exactly the version-bump + CHANGELOG-split mechanics, no surprise content:
pyproject.toml: single lineversion = "0.5.0"→"0.5.1".server.json: top-levelversion+packages[0].versionboth0.5.0→0.5.1(the two distinct version sites thatscripts/sync-server-json.pykeeps in lockstep).uv.lock: single lineversion = "0.5.0"→"0.5.1"on themcp-synologypackage entry.CHANGELOG.md: new## 0.5.1 (2026-05-01)heading inserted between the existing## Unreleasedand the existing### Fixedcontent. No prose moved or rewritten — every entry under## 0.5.1already lived under## Unreleasedpost-#77. Section order on disk is nowUnreleased(empty placeholder) →0.5.1 (2026-05-01)→0.5.0 (2026-04-10)→ … as expected.
publish.yml extractor sanity (manual test #7 — post-merge but pre-verifiable)
Read the awk extractor at .github/workflows/publish.yml:117-120:
$0 ~ "^## "version"( |\\()" {flag=1; next}
flag && /^## / {exit}
flagFor VERSION=0.5.1 against this CHANGELOG:
## Unreleased— pattern^## 0.5.1( |\()doesn't match (no version match),flag=0, walked past.## 0.5.1 (2026-05-01)— pattern matches the literal0.5.1 (,flag=1,next.- All
### Fixed/### Addedcontent under 0.5.1 —flag=1, lines emitted. ## 0.5.0 (2026-04-10)—flag=1and^##matches,exit.
The empty ## Unreleased placeholder is harmlessly skipped exactly as the PR body claims; the extracted block will be the 0.5.1 entries verbatim.
Notes
- All five rolled-up PRs are already QA-Approved with audit trails on each PR.
- No CHANGELOG drift, no version desync between manifest files, no test regressions, no lint/type drift.
- Manual tests 1–6 verified directly; #7 verified by reading the awk pattern against the new heading shape (post-merge tag-push behavior is then mechanical).
PR-body manual tests 1–7 all checked.
Verdict
Ready for QA Signoff. Final maintainer call.
|
Applying Ready for QA Signoff as the final act of round 1. Release rollup PR for v0.5.1 — bundles #69, #71, #72, #73, #77 (all already QA-Approved). All four files (pyproject.toml, server.json, uv.lock, CHANGELOG.md) contain exactly the version-bump + section-split mechanics; no surprise content. |
Summary
Patch release rolling up the post-0.5.0 fixes. Five PRs land in this release:
core/fs.py::atomic_write_texthelper;save_stateand_save_global_stateroute through it. Eliminates torn-write windows onstate.yaml/global.yaml.cli/setup.pyinteractive config (closes Atomic write for cli/setup.py config persistence (nice-to-have follow-up to #36) #70). Last user-visible non-atomic write site cascaded onto the same helper.cmeans/pypi-winnow-downloads(the dogfooded service).ensure_recycle_statushelper; self-correct on observation; clear-on-reauth via newAuthManager.add_on_reauth_callbackAPI. Fixes incorrect "Recycle bin is enabled" messaging on shares with#recycledisabled.getinfoanddelete(closes v0.5.0 regression: delete_files and get_file_info silently mishandle multi-path arrays #68). Critical: fixes a v0.5.0 silent-no-op regression ondelete_fileswith multi-path arrays — caller would see[+] Deleted N item(s)listing every path, but none were actually deleted on real DSM 7.x. Same root cause onget_file_info(single synthetic record with comma-joinedpath). Both tools now issue one DSM call per input path.Files touched (per CLAUDE.md release procedure)
pyproject.toml: 0.5.0 → 0.5.1server.json: synced viascripts/sync-server-json.py(top-level +packages[0].version)uv.lock: refreshed viauv lockCHANGELOG.md:## Unreleasedrenamed to## 0.5.1 (2026-05-01); fresh empty## Unreleasedadded above for the next cycleQA
Manual tests
python scripts/sync-server-json.py --check— reports "in sync (0.5.1)".uv run pytest— 550 passed, 96.13% coverage.uv run ruff check src/ tests/ scripts/— clean.uv run ruff format --check src/ tests/ scripts/— clean.uv run mypy src/ scripts/— clean.## Unreleased→## 0.5.1 (2026-05-01), plus a fresh empty## Unreleasedheading inserted above. No content was moved or rewritten — every entry under## 0.5.1already lived under## Unreleasedonmain.publish.yml. Theawkextractor on## <version>( |\()matches## 0.5.1 (2026-05-01)correctly and the new empty## Unreleasedis harmlessly walked past.Verification I already ran
python scripts/sync-server-json.py --checkuv run pytestuv run ruff check src/ tests/ scripts/uv run ruff format --check src/ tests/ scripts/uv run mypy src/ scripts/git diff --stat HEAD~1🤖 Generated with Claude Code