Releases: DazzleTools/dazzlesum
Release list
v1.4.4 - Silent Mode Works: True Exit Codes + Fully Green Suite
Release v1.4.4
dazzlesum v1.4.4
Cross-platform file checksum utility: per-folder .shasum manifests, shadow directories, and (since 1.4.0) true incremental updates -- rehash only what changed, even across synced machines.
The 1.4.x line so far
1.4 is the incremental-update line. dazzlesum update went from dead code to a real incremental engine: a disposable per-machine state cache records each file's (size, mtime) at last hash, so a rescan of an unchanged collection is stat-bound instead of rehash-bound. On a real 2.5-million-file library, the bootstrap that projected 7.5 hours now covers the same ground in ~25 minutes (v1.4.3's batched cache writes measured 105x on the write path), and steady-state sweeps skip even the manifest reads for unchanged folders. Change detection is sync-safe by design -- stat equality against recorded state, so content arriving with older origin mtimes (e.g. Resilio) is still caught -- and external change detectors (git hooks, filesystem watchers) can drive scoped updates via --dirs-from.
What's New in v1.4.4
A correctness release for the verbosity system: silent mode now exists, and its exit codes tell the truth.
-qqqqqq/--verbosity=-6was unreachable (an off-by-one clamp capped at -5), so "silent" runs still printed the banner and grand totals. It is now genuinely silent.- Worse, the aggregate exit code was computed as a side effect of displaying grand totals -- silent mode skipped the display and always exited 0, even with failures. Exit codes are now finalized unconditionally: silent mode is exit-codes-only, not exit-code-less.
- The verbosity ladder is now monotonic: raising verbosity can no longer remove information (levels -3/-2 keep -4's forced status lines; extras-only directories appear at -1 as documented and hide at -2).
--squelchcategories absent from a level's defaults were silently ignored (e.g.--squelch EXTRA_SUMMARY); explicit categories now always apply. Found by this release's human test checklist.- Test suite fully green (126 passed) for the first time since v1.3.6.
Version History (1.4.x)
| Version | Key Change |
|---|---|
| v1.4.4 | Current -- silent mode works: reachable, truthful exit codes, monotonic verbosity ladder |
| v1.4.3 | 105x cache write path (batched commits, schema v2, steady-state fast path) |
| v1.4.2 | git-repokit-common subtree; shared version tooling |
| v1.4.1 | -V flag; single-source version cleanup (setup.py removed) |
| v1.4.0 | Incremental update mode; exclude-traversal + junction fixes; first PyPI release |
Installation
pip install -U dazzlesumOr clone and pip install -e ., or copy dazzlesum.py standalone (single file, stdlib only).
Platform Support
| Platform | Status |
|---|---|
| Windows 10 / 11 | Tested (2.5M-file library) |
| Linux / macOS / BSD | Pure stdlib; CI-tested on Linux |
Full Changelog: v1.4.2...v1.4.4
v1.4.2 - RepoKit Tooling Integration + Version Flag Fixes
Release v1.4.2
Rollup of v1.4.1 and v1.4.2.
What's Changed
✨ New Features
-Vshort form for--version(v1.4.1)- git-repokit-common integrated as a subtree at
scripts/repokit-common/— shared DazzleTools tooling:sync-versions.pyversion management, git hooks (pre-commit/post-commit/pre-push),gh_issue_full.py, and more. Update anytime withgit subtree pull --prefix=scripts/repokit-common repokit-common main --squash(v1.4.2) [tool.repokit-common]configuration inpyproject.tomlwiringversion-sourcetodazzlesum.py(v1.4.2)
🐛 Bug Fixes
--versionprinted a stale hook-stamped build string on machines without the git hooks installed (could show 1.3.6 while the package was 1.4.0); it now derives from the semantic version components. Consistency is enforced by a CI-level test rather than runtime fallback code (v1.4.1)
🧰 Maintenance
- Removed
setup.py: fully superseded bypyproject.toml's dynamic version — eliminates the last duplicate version parser and metadata block (v1.4.1) - Version stamping now flows through repokit-common's
sync-versions.py; build strings carry branch, build count, current date, and parent hash (the previous hand-rolled hook reused stale date/hash fields) (v1.4.2) - Retired hand-rolled
scripts/install-hooks.shandscripts/hooks/in favor of the subtree's hook system (v1.4.2) - Version-format test assertions updated for the new stamp shape
📝 Documentation
- README badge order: PyPI version and release date lead, CI follows
🔄 Breaking Changes
- None
Installation
pip install dazzlesumOr clone and pip install -e ., or copy dazzlesum.py standalone (single file, stdlib only).
Full Changelog: v1.4.0...v1.4.2
v1.4.0 - Incremental Update Mode + First PyPI Release
Release v1.4.0
What's Changed
✨ New Features
- Incremental update mode:
dazzlesum updatenow rehashes only changed files instead of silently performing a full create (theupdate_modeparameter was previously dead code). On a library-scale tree, an unchanged rescan is stat-bound: minutes instead of hours. - Per-machine state cache: one SQLite file (
.dazzle-cache.sqlite) at the shadow root records each file's (size, mtime) at last hash. Disposable accelerator — the.shasummanifests remain the only durable record. Never sync or commit it. - Resilio-safe change detection: comparison is stat equality against recorded state, not "is mtime newer" — content synced in carrying older origin mtimes is still detected.
update --dirs-from FILE|-: external change detectors (git hooks, filesystem watchers) can nominate suspect folders; anything that prints folder names can drive an incremental update.update --bootstrap hash|trust: adopt an existing manifest tree with full re-verification or by seeding the cache without rehashing.update --paranoidandupdate --keep-missing; per-run stats report (unchanged / rehashed / added / removed / rewritten / failed).dazzlesum --detailed-help updatetopic.
🐛 Bug Fixes
--excludepatterns now prune directory traversal, not just file matching. Previously the walker descended into excluded directories (.git,.private,.sync, …) and checksummed their contents (v1.3.6 fixed this for the progress counter but not the walk itself).- Windows junction detection no longer spawns a
dir /ALsubprocess per non-junction directory (~60 ms per folder — hours at scale), and directories reached through a junction ancestor are no longer misclassified as junctions (which silently skipped whole trees). --dirs-frominput is BOM-tolerant (PowerShell pipes prepend a UTF-8 BOM to stdin; Windows editors add one to files).
📝 Documentation
- README: refreshed badge row (live PyPI version, release date, platform); documented the standalone no-install path (copy
dazzlesum.py, run directly); canonicalized URLs on the DazzleTools org. - Human test checklist for the feature at
tests/checklists/v1.4.0__Feature__incremental-update-mode.md, including the executed-run record.
🧰 Maintenance
.shasumwrites are atomic (temp + rename); update rewrites a manifest only when its content actually changed, keeping unchanged manifests byte-identical.- PyPI publishing workflow: publishing a GitHub Release triggers an automatic upload via trusted publishing (OIDC, no stored tokens); manual dispatch and local
twine uploadremain available.scripts/check_dist_no_leak.pyblocks any artifact containingprivate/paths or local state files. - 30 new automated tests (update semantics incl. the older-mtime sync case, BOM regressions, junction detection with a real NTFS junction, traversal pruning at both call sites).
🔄 Breaking Changes
- None.
updatesemantics changed from "silent full create" to true incremental — strictly what the command always documented.
Installation
Install from PyPI
pip install dazzlesumOr clone and install
git clone https://github.com/DazzleTools/dazzlesum.git
cd dazzlesum
pip install -e .Or standalone
Copy dazzlesum.py anywhere and run it directly — single file, stdlib only.
Full Changelog: v1.3.6...v1.4.0
v1.3.6 - Final Monolithic Release
Dazzlesum v1.3.6 — Final Monolithic Release
Cross-platform checksum tool for data integrity verification. Generates .shasum files per directory or monolithic checksum files for entire trees, with shadow directory support, 11-level verbosity, and native OS tool integration.
Note: This is the final release of dazzlesum as a single-file script. Future versions will be restructured as a proper PyPI package with
python -m dazzlesuminvocation.
What's New in v1.3.6
Verify --exclude/--include Support
verify now accepts --exclude and --include flags, matching create command behavior. Essential for directories with content that was never checksummed:
# Skip .sync directory during verification
dazzlesum verify -r --exclude .sync /path/to/dataShadow Directory Path Fix
Fixed a bug where shadow-dir verification resolved filenames against the source root instead of the current directory being verified. This caused 100% false "missing" failures on any non-root directory. Discovered during real-world pilot testing on a 615-file research library.
Progress Monitoring
- Directory counting stage now reports progress every 100 directories for large trees
- "Scanning directory tree... found X dirs, Y files" summary before processing
- MB/s throughput and data volume displayed in the progress bar
- files/sec metric in grand totals summary
Windows Compatibility
- Replaced all Unicode box-drawing and progress bar characters with ASCII equivalents (prevents crashes on Windows codepage 437/1252)
- Added
encoding='utf-8', errors='replace'to all 7 subprocess calls (handles non-ASCII filenames) - Fixed setup.py encoding for Windows pip installations
- Scripts now auto-detect
python3vspython(Windows Store python3 stub lacks pip modules)
Other Fixes
- Directory counting respects
--excludepatterns (excluded dirs were inflating progress totals) - Exit code calculation uses aggregate results for recursive operations
- Interactive monolithic file overwrite handling with
--yesflag for automation - Cross-platform atomic file replacement (Windows backup-swap pattern)
- Context-aware auto-detection (create vs verify based on directory contents)
- Removed 187 lines of dead code (deprecated command dispatch functions)
Installation
# Clone and use directly (current approach)
git clone https://github.com/DazzleTools/dazzlesum.git
python dazzlesum/dazzlesum.py create -r /path/to/data
# Or install via pip
pip install -e ./dazzlesum
dazzlesum create -r /path/to/dataVersion History (1.3.x)
| Version | Key Change |
|---|---|
| v1.3.6 | Current -- Verify fixes, progress monitoring, Windows compatibility |
| v1.3.5 | Exit code fixes, CI/CD alignment, development workflow |
| v1.3.4 | Monolithic overwrite handling, dead code removal |
| v1.3.3 | Major feature release: 11-level verbosity, squelch system, shadow directories, auto-detection |
Platform Support
| Platform | Status |
|---|---|
| Windows 10/11 | Tested (primary development platform) |
| Linux | Expected to work (CI tested) |
| macOS | Expected to work |
| Python 3.7+ | Required |
Test Results
- 77 unit tests passing
- 21 one-off diagnostic tests passing
- Pre-push validation: flake8 clean, all tests pass in strict mode