From e895d9d39e4607a5db988be2897503c492084850 Mon Sep 17 00:00:00 2001 From: sneak Date: Mon, 2 Nov 2026 22:16:39 +0000 Subject: [PATCH] Add the entries that landed on next to TODO.md 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 https://git.eeqj.de/sneak/sfdupes/issues/146 and https://git.eeqj.de/sneak/sfdupes/issues/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 --- TODO.md | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/TODO.md b/TODO.md index 56fc1e7..19e271f 100644 --- a/TODO.md +++ b/TODO.md @@ -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