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:
39
TODO.md
39
TODO.md
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user