Specify persistent SQLite scan database in README; plan in TODO.md

scan will maintain a persistent database of file signatures
(default /var/lib/sfdupes/db.sqlite, overridable via
SFDUPES_DATABASE) that survives between runs; rescans hash only new
or changed files (mtime/size) and remove records for vanished files,
so scan can be cronned daily. report and trees will read the
database instead of a scan stream.
This commit is contained in:
2026-07-24 02:54:08 +07:00
parent 90c9ef3546
commit e0d578a707
2 changed files with 228 additions and 102 deletions

39
TODO.md
View File

@@ -14,8 +14,41 @@
# Next Step
- convert Makefile targets to scripts-to-rule-them-all `script/`
entrypoints like the other managed repos
- persistent scan database (branch `persistent-database`): `scan`
maintains a SQLite database that survives between runs so it can be
cronned daily; `report` and `trees` read the database instead of a
scan stream. Database path defaults to `/var/lib/sfdupes/db.sqlite`,
overridable via `SFDUPES_DATABASE`. Plan:
- [x] update `README.md` (the authoritative spec) for the database:
new Database section, revised `scan`/`report`/`trees` modes,
dependency list (`modernc.org/sqlite`, pure Go, cgo stays
disabled), exit codes, smoke test with incremental steps
- [ ] add `modernc.org/sqlite` (hash-pinned via `go.sum`)
- [ ] `db.go`: path resolution (`SFDUPES_DATABASE` env, default
`/var/lib/sfdupes/db.sqlite`), open/create with WAL +
busy-timeout pragmas and `PRAGMA user_version` schema check,
`files` table (path BLOB primary key, size, mtime, head,
tail), load-all-rows, and single-transaction apply of
upserts/deletes
- [ ] `scan.go`: resolve operands to absolute paths; diff stat
results against loaded rows (reuse hashes when size matches
and mtime is not newer); hash only new/changed files; delete
rows under the scanned operands not successfully processed;
leave rows outside the operands untouched; new summary line
(added/updated/removed/unchanged/skipped); "update" progress
pass for the database write
- [ ] `report.go`/`trees.go`: read records from the database (no
positional args, no stream parsing); drop the NUL-stream
parser and malformed-record handling
- [ ] `main.go`: updated usage strings; `report`/`trees` take no
args (usage error otherwise)
- [ ] tests: db open/env-override/schema tests; incremental scan
tests (add, mtime update, delete, unchanged-hash-reuse,
out-of-scope rows untouched, error paths); rework pipeline
test to go through the database; keep walk/stat/hash/grouping
unit tests
- [ ] `.gitignore`: local `*.sqlite` artifacts
- [ ] `make check`, `make docker`, and the README smoke test pass
# Completed Steps
@@ -33,6 +66,8 @@
# Future Steps
- convert Makefile targets to scripts-to-rule-them-all `script/`
entrypoints like the other managed repos
- possible later features (explicitly out of scope per README):
full-content verification of candidates, removal-script helpers