aboutsummaryrefslogtreecommitdiff
path: root/internal/plan
Commit message (Collapse)AuthorAgeFilesLines
* a symlink in the sorted directory no longer redirects a stepLukasz Kasprzak2 days2-3/+10
| | | | | | | | | | | | | | | | | | | | | | | | | | 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 days4-13/+89
| | | | | | | | | | | | | | | 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 days9-17/+17
| | | | | | | | | | | 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.
* comments that explain the code, not how it was writtenLukasz Kasprzak3 days4-31/+30
| | | | | | | | | | | | | | | | | | About 340 comments cited the development process: task and plan numbers, fix waves, rulings, reviewers, and the author in the third person with a date. None of that exists outside the work itself, so to a reader it pointed at nothing. Each one now states the engineering reason it was standing in front of; where a comment was provenance and nothing else, it is gone. References to docs/design.md and docs/gui-design.md by section stay: both ship with the repository. The design documents lose their amendment diaries - CHANGELOG.md is that record - and the GUI's says plainly that the window has gone further than the document. Only comments changed. Every .go file was parsed and its code printed with comments stripped, before and after: the two hashes are identical across all 175 files.
* check refuses an empty time format; krino.conf(5) corrected from the re-auditLukasz Kasprzak4 days1-0/+3
|
* check refuses placeholders that could never expandLukasz Kasprzak4 days1-0/+14
|
* an earlier directory's applied results stay claimed for later onesLukasz Kasprzak5 days1-0/+6
|
* --json carries exclusions and matching warningsLukasz Kasprzak5 days2-13/+42
|
* literal braces are text, not placeholders, for containment and walk exclusionLukasz Kasprzak5 days5-22/+65
|
* plan 10 re-check: cut run column, damaged undo run, emptied directory ↵v0.0.7Lukasz Kasprzak5 days1-0/+5
| | | | cleanup, text turning binary, explain flags, interrupt docs
* plan 10: missing and weak tests (per-step logging, trash path, fuzz oracle, ↵Lukasz Kasprzak5 days2-8/+64
| | | | w after error)
* plan 9: undo review matches review, --min-age validated, future mtimes, rule ↵Lukasz Kasprzak5 days2-1/+31
| | | | names, conflict enum, dependency gate, absolute tool paths
* plan 9: overwrite never trashes a directory or another scanned fileLukasz Kasprzak5 days3-1/+54
|
* plan 9: placeholders stay inside the directory the rule namesLukasz Kasprzak5 days3-15/+91
|
* plan 8: enum values read from source must all be handledLukasz Kasprzak5 days1-0/+47
|
* plan 8: placeholders cannot rename to dot names or climb out with ..Lukasz Kasprzak5 days2-0/+73
|
* plan 8: fuzz decoders; fold ẞ and invalid UTF-8 correctly, refuse ↵Lukasz Kasprzak5 days1-0/+33
| | | | non-UTF-8 paths in krino new
* krino: duplicates are found, never deletedLukasz Kasprzak6 days2-0/+36
| | | | | | | | | 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 days11-0/+1297