Files
Sprinter-SDCC/applications/Volkov/docs/p17-tree-delete-results.md
T
snark13 8e389c03f8 Volkov: добавить Sprinter Commander
Реализовать двухпанельный Commander от платформенного PoC до этапов P6-P20: EMM-каталог, сортировку и выбор, операции с файлами и деревьями, транзакционное копирование, метаданные, политику конфликтов и предварительную проверку свободного места.

Добавить проектную документацию, HDD/MAME-сценарии и проверенные артефакты. Расширить libc операцией bank_write_page, исправлением режима O_RDONLY и связанными регрессионными проверками.
2026-09-10 10:45:30 +03:00

6.0 KiB

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 извлекается и проверяется побайтно:

PASS: selected file and two directory trees deleted; KEEP preserved.

Отдельный runtime-cancel fixture выбирает TOP.BIN и дерево из 180 подкаталогов. TOP.BIN удаляется до начала обхода, затем Lua подаёт Esc во время заполнения очереди. После отмены дерево остаётся доступным, завершённое удаление не откатывается, KEEP.TXT не меняется:

PASS: runtime cancel kept remaining tree; completed TOP delete remains.

Чтобы Esc не ждал завершения длинной серии F_NEXT, delete-итератор возвращает управление вызывающему коду после каждого добавленного каталога.

Контрольные кадры:

Runtime-cancel:

Компоновка

P17 остаётся в двух банках и не увеличивает образ EXE: каждый дополнительный банк добавил бы 16 КБ независимо от фактического заполнения. Текущая сборка --memory big --safe --max-allocs 3000:

_CODE 9503; DATA 3524; heap 1821
BANK1 10562/16384; BANK2 15904/16384
SPRCMD.EXE 43080

В BANK2 остаётся 480 байт, поэтому следующий функциональный этап потребует осмысленной перекладки модулей в BANK3. Межбанковый аудит чист.

Воспроизведение

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