aboutsummaryrefslogtreecommitdiff
path: root/internal/plan/chain.go
Commit message (Collapse)AuthorAgeFilesLines
* a symlink in the sorted directory no longer redirects a stepLukasz Kasprzak2 days1-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | Placeholders were already stopped from sending a file out of the directory a rule named. A symlink is a name too, and the directory krino sorts is by the threat model's own premise a place the internet writes into: a link named after a rule's destination sent moves and copies anywhere, and under (on-conflict overwrite) trashed a file OUTSIDE the sorted directory - while the plan showed the in-tree text and the run reported success. A step whose destination passes through a symlink at or below the directory being sorted now fails. A destination the configuration names outside it - ~/docs on another disk - is the user's own arrangement and is followed as before; both cases have a test. End to end, the review's scenario (Out -> ~/secret, overwrite): before: 1 applied, the user's file replaced and trashed after: 0 applied 1 failed, the file untouched, nothing trashed Two bookkeeping bugs in MkdirAllTracked went with it: a dangling symlink read as a missing directory and was then recorded as one krino had created - undo would have unlinked a link krino never made - and a directory created by someone else between the check and the mkdir was recorded the same way.
* the suffix search continues instead of starting again at _1Lukasz Kasprzak2 days1-5/+5
| | | | | | | | | | | | | | | Every file renamed onto one name probed stem_1, stem_2, ... from the beginning, so N files cost N^2/2 Exists calls - a test here counts 1890 of them for 60 files. The search now continues from the highest suffix already tried for that stem. Within one plan that is the same answer: the taken set only grows while a plan is built and the disk is not being written to, so a suffix taken once stays taken. Proved rather than argued - with same_1 and same_3 already on disk and same_2 free, both versions put a file in the gap, and the two plans are byte-identical. 1500 files renamed to one name: 2.63s -> 0.05s
* the module path is git.labunix.xyz/krinoLukasz Kasprzak2 days1-3/+3
| | | | | | | | | | | So that go install can find it. cgit serves no go-import meta tag, so nginx answers a ?go-get=1 request for /NAME with one pointing at https://git.labunix.xyz/NAME.git; the alternative was carrying a .git suffix through every import line forever. One sed over the imports, both go.mod files, and the dependency gate's whitelist. Nothing else depends on the path. go install works from the next tag, the first release whose go.mod carries it.
* an earlier directory's applied results stay claimed for later onesLukasz Kasprzak5 days1-0/+6
|
* literal braces are text, not placeholders, for containment and walk exclusionLukasz Kasprzak5 days1-11/+7
|
* plan 9: overwrite never trashes a directory or another scanned fileLukasz Kasprzak5 days1-0/+8
|
* plan 9: placeholders stay inside the directory the rule namesLukasz Kasprzak5 days1-14/+36
|
* plan 8: placeholders cannot rename to dot names or climb out with ..Lukasz Kasprzak5 days1-0/+22
|
* krino: duplicates are found, never deletedLukasz Kasprzak5 days1-0/+8
| | | | | | | | | A rule combining (duplicate) with a delete action is refused at load, and a file that is a duplicate under any duplicate scope its directory uses gets no delete step from any rule: the plan shows it skipped and the chain continues. A failed duplicate check blocks the delete too. Tests cover (matched), another rule's own condition, a test evaluation skipped, two scopes and a failed check, each checking every copy is still on disk.
* krino: planning — chains, placeholders, conflicts, JSONLukasz Kasprzak7 days1-0/+222