Add the entries that landed on next to TODO.md
check / check (push) Waiting to run

Catches `TODO.md` up with `next`. The `README.md` entry takes the text
that landed, word for word. The entry of this rewrite takes the date
2026-11-02. The entries of #146
and #147 are added in their
place, newest first, in short sentences, with every fact, date and link
kept. Nothing else changes.

Model: fable-5-1
This commit is contained in:
2026-11-02 22:16:39 +00:00
parent da9b397b21
commit e895d9d39e
+18 -2
View File
@@ -32,7 +32,7 @@ are known.
- `TODO.md` rewritten from scratch by the same rules as `README.md`, sentence by
sentence. Every completed step is kept, with its date and its issue or branch.
The policy-compliance checklist of 2026-07-22 is folded into its step
(2026-10-26, https://git.eeqj.de/sneak/sfdupes/issues/135)
(2026-11-02, https://git.eeqj.de/sneak/sfdupes/issues/135)
- `README.md` rewritten from scratch, sentence by sentence, as a newcomer reads
it. It leads with what the program is and how to use it. A reference section
@@ -40,7 +40,23 @@ are known.
Every statement was checked against the code on `next`. Five comments in
`main_test.go` cite "Settings", where their rules now live. One comment each
in `scan_test.go`, `trees_test.go` and `exclude_test.go` cites what the README
now says (2026-10-26, https://git.eeqj.de/sneak/sfdupes/issues/135)
now says (2026-11-02, https://git.eeqj.de/sneak/sfdupes/issues/135)
- Each record holds `disk_size`, the bytes the file takes on disk. That is its
allocated blocks, `st_blocks` × 512, from the `lstat` call the walk already
makes. `trees` prints a `disk_size` column after `size`. It is the sum over
the `dupe` copy's files. On a compressed or sparse file `disk_size` differs
from `size`. A rescan updates the `disk_size` of an unchanged file whose size
on disk changed, without reading the file (2026-10-27,
https://git.eeqj.de/sneak/sfdupes/issues/147)
- The database keeps the number of records and the sum of their sizes in the one
row of a `totals` table. Three triggers on `files` keep that row current.
`info` reads that row. So do `scan`'s `load` phase and the `read` phases of
`report` and `trees`, for their totals. No count reads every record any more.
The triggers make each write to `files` slower. `scan` keeps SQLite's
temporary data in memory. That wins back part of that time (2026-10-27,
https://git.eeqj.de/sneak/sfdupes/issues/146)
- an operand at or inside a directory named `.zfs` is never scanned, whether
given alone or under another operand. `scan` warns about it, counts it as