Volkov: добавить Sprinter Commander
Реализовать двухпанельный Commander от платформенного PoC до этапов P6-P20: EMM-каталог, сортировку и выбор, операции с файлами и деревьями, транзакционное копирование, метаданные, политику конфликтов и предварительную проверку свободного места. Добавить проектную документацию, HDD/MAME-сценарии и проверенные артефакты. Расширить libc операцией bank_write_page, исправлением режима O_RDONLY и связанными регрессионными проверками.
This commit is contained in:
@@ -0,0 +1,101 @@
|
||||
# Sprinter Commander: рекурсивный group F8 0.2/P17
|
||||
|
||||
Дата: 10 сентября 2026 года.
|
||||
|
||||
Статус: `PASS` в MAME 0.288 / BIOS 3.06 / DSS 1.71.57 на HDD `D:`.
|
||||
|
||||
## Контракт
|
||||
|
||||
Если в панели есть выбранные записи, F8 показывает одно подтверждение для
|
||||
всей группы. После подтверждения:
|
||||
|
||||
1. выбранные обычные файлы верхнего уровня удаляются в порядке панели;
|
||||
2. выбранные каталоги становятся корнями одного BFS-job;
|
||||
3. содержимое каталогов перечисляется через `F_FIRST/F_NEXT`, файлы удаляются
|
||||
по мере обхода, а найденные подкаталоги добавляются в очередь;
|
||||
4. после полного scan очередь проходится в обратном порядке, поэтому каждый
|
||||
дочерний каталог удаляется раньше родителя;
|
||||
5. исходный CWD восстанавливается, динамическая EMM-страница освобождается,
|
||||
активная панель перечитывается.
|
||||
|
||||
Очередь та же, что у recursive F5: одна динамическая 16-КБ страница, 1008
|
||||
узлов по 16 байт, максимальная глубина 32. В W2 дерево не хранится. `Esc`
|
||||
проверяется между шагами; уже выполненные удаления при ошибке или отмене не
|
||||
откатываются, что явно отражается в статусе.
|
||||
|
||||
При отсутствии группового выбора однообъектный F8 сохраняет прежний контракт:
|
||||
файл удаляется, а каталог должен быть пустым.
|
||||
|
||||
## Проверка
|
||||
|
||||
Fixture содержит два выбранных дерева и выбранный файл, а также невыбранные
|
||||
`KEEPDIR/SAFE.BIN` и `KEEP.TXT`. Первое дерево имеет пустой каталог, четыре
|
||||
файла размеров 0/1/16/4097 и цепочку глубиной 12. Несколько файлов в одном
|
||||
каталоге отдельно проверяют продолжение `F_NEXT` после `unlink` текущей
|
||||
записи.
|
||||
|
||||
Сценарий сначала отменяет общее подтверждение и убеждается, что выбор и
|
||||
панель не изменились, затем подтверждает удаление. После выхода содержимое
|
||||
CHD извлекается и проверяется побайтно:
|
||||
|
||||
```text
|
||||
PASS: selected file and two directory trees deleted; KEEP preserved.
|
||||
```
|
||||
|
||||
Отдельный runtime-cancel fixture выбирает `TOP.BIN` и дерево из 180
|
||||
подкаталогов. `TOP.BIN` удаляется до начала обхода, затем Lua подаёт `Esc` во
|
||||
время заполнения очереди. После отмены дерево остаётся доступным, завершённое
|
||||
удаление не откатывается, `KEEP.TXT` не меняется:
|
||||
|
||||
```text
|
||||
PASS: runtime cancel kept remaining tree; completed TOP delete remains.
|
||||
```
|
||||
|
||||
Чтобы `Esc` не ждал завершения длинной серии `F_NEXT`, delete-итератор
|
||||
возвращает управление вызывающему коду после каждого добавленного каталога.
|
||||
|
||||
Контрольные кадры:
|
||||
|
||||
- [исходное дерево](../artifacts/mame-p17/tree-delete/before.png);
|
||||
- [два каталога и файл выбраны](../artifacts/mame-p17/tree-delete/selected-file-and-trees.png);
|
||||
- [общее подтверждение](../artifacts/mame-p17/tree-delete/group-confirm.png);
|
||||
- [отмена до mutation сохранила группу](../artifacts/mame-p17/tree-delete/cancel-preserves.png);
|
||||
- [после удаления остались только KEEP-объекты](../artifacts/mame-p17/tree-delete/deleted-keep-preserved.png);
|
||||
- [чистый возврат в DSS](../artifacts/mame-p17/tree-delete/clean-dss-return.png).
|
||||
|
||||
Runtime-cancel:
|
||||
|
||||
- [выбранное дерево и верхнеуровневый файл](../artifacts/mame-p17/tree-delete-cancel/selected-before-cancel.png);
|
||||
- [подтверждение](../artifacts/mame-p17/tree-delete-cancel/group-confirm.png);
|
||||
- [частичный результат после Esc](../artifacts/mame-p17/tree-delete-cancel/runtime-cancelled.png);
|
||||
- [чистый возврат в DSS](../artifacts/mame-p17/tree-delete-cancel/clean-dss-return.png).
|
||||
|
||||
## Компоновка
|
||||
|
||||
P17 остаётся в двух банках и не увеличивает образ EXE: каждый дополнительный
|
||||
банк добавил бы 16 КБ независимо от фактического заполнения. Текущая сборка
|
||||
`--memory big --safe --max-allocs 3000`:
|
||||
|
||||
```text
|
||||
_CODE 9503; DATA 3524; heap 1821
|
||||
BANK1 10562/16384; BANK2 15904/16384
|
||||
SPRCMD.EXE 43080
|
||||
```
|
||||
|
||||
В BANK2 остаётся 480 байт, поэтому следующий функциональный этап потребует
|
||||
осмысленной перекладки модулей в BANK3. Межбанковый аудит чист.
|
||||
|
||||
## Воспроизведение
|
||||
|
||||
```sh
|
||||
make hdd-p17-tree-delete ALLOCS=3000
|
||||
tests/run_mame_hdd.sh build/hdd/p17_tree_delete.chd \
|
||||
tests/mame_p17_tree_delete.lua artifacts/mame-p17/local 58
|
||||
tests/check_p17_tree_delete_hdd.sh build/hdd/p17_tree_delete.chd
|
||||
|
||||
make hdd-p17-tree-delete-cancel ALLOCS=3000
|
||||
tests/run_mame_hdd.sh build/hdd/p17_tree_delete_cancel.chd \
|
||||
tests/mame_p17_tree_delete_cancel.lua artifacts/mame-p17/cancel-local 50
|
||||
tests/check_p17_tree_delete_cancel_hdd.sh \
|
||||
build/hdd/p17_tree_delete_cancel.chd
|
||||
```
|
||||
Reference in New Issue
Block a user