Volkov: добавить Sprinter Commander
Реализовать двухпанельный Commander от платформенного PoC до этапов P6-P20: EMM-каталог, сортировку и выбор, операции с файлами и деревьями, транзакционное копирование, метаданные, политику конфликтов и предварительную проверку свободного места. Добавить проектную документацию, HDD/MAME-сценарии и проверенные артефакты. Расширить libc операцией bank_write_page, исправлением режима O_RDONLY и связанными регрессионными проверками.
This commit is contained in:
@@ -0,0 +1,78 @@
|
||||
# Sprinter Commander: групповое удаление файлов 0.2/P13
|
||||
|
||||
Дата: 9 сентября 2026 года.
|
||||
|
||||
Статус: `PASS` в MAME 0.288 / BIOS 3.06 / DSS 1.71.57 на HDD `D:`.
|
||||
|
||||
Это исторический контракт P13. Начиная с P17 выбранные каталоги не
|
||||
пропускаются, а удаляются рекурсивно после одного общего подтверждения; новый
|
||||
контракт и актуальные артефакты описаны в
|
||||
[p17-tree-delete-results.md](p17-tree-delete-results.md). Текущий P13 fixture
|
||||
оставлен как регрессия file-only группы.
|
||||
|
||||
## Контракт первого группового среза F8
|
||||
|
||||
Если в активной панели есть выбранные записи, F8:
|
||||
|
||||
1. Считает выбранные обычные файлы и выбранные каталоги отдельно.
|
||||
2. Если выбранных файлов нет, не открывает подтверждение и сообщает, что
|
||||
рекурсивное удаление каталогов ещё не реализовано.
|
||||
3. Показывает одно подтверждение для всей группы файлов.
|
||||
4. После подтверждения проходит EMM-store в порядке панели и удаляет только
|
||||
выбранные записи без `FA_DIREC`.
|
||||
5. Останавливается на первой ошибке. Уже удалённые файлы не восстанавливаются;
|
||||
итог сообщает `deleted/total`, число пропущенных каталогов и errno.
|
||||
6. После хотя бы одного успешного удаления перечитывает активную панель.
|
||||
|
||||
Выбранные каталоги не удаляются и не обходятся рекурсивно. Это согласуется с
|
||||
контрактом групповых `+`, `-`, `*`: групповые файловые команды отделяют файлы
|
||||
от каталогов. При отсутствии выбора сохранён однообъектный F8 из P11: файл
|
||||
удаляется через `unlink()`, пустой каталог — через `rmdir()`.
|
||||
|
||||
## Проверка
|
||||
|
||||
HDD-fixture содержит два выбранных файла, один невыбранный файл, выбранный
|
||||
пустой каталог и выбранный непустой каталог. Сценарий сначала отменяет
|
||||
групповое подтверждение, затем повторяет операцию с подтверждением. После
|
||||
refresh отдельно выбирается только каталог: F8 обязан отказать без диалога и
|
||||
без изменения носителя.
|
||||
|
||||
После чистого выхода MAME дерево извлекается из CHD и проверяется побайтно:
|
||||
|
||||
```text
|
||||
PASS: selected files deleted; selected directories and KEEP preserved.
|
||||
```
|
||||
|
||||
Контрольные состояния:
|
||||
|
||||
- [два файла и два каталога выбраны](../artifacts/mame-p13/group-delete/selected-files-and-dirs.png);
|
||||
- [одно подтверждение группы](../artifacts/mame-p13/group-delete/group-confirm.png);
|
||||
- [отмена сохранила группу](../artifacts/mame-p13/group-delete/cancel-preserves.png);
|
||||
- [файлы удалены, каталоги сохранены](../artifacts/mame-p13/group-delete/files-deleted-dirs-preserved.png);
|
||||
- [directory-only группа отклонена](../artifacts/mame-p13/group-delete/directory-only-refused.png);
|
||||
- [штатный возврат в DSS](../artifacts/mame-p13/group-delete/clean-dss-return.png).
|
||||
|
||||
## Компоновка и размер
|
||||
|
||||
Конфигурация `--memory big --safe --max-allocs 3000`:
|
||||
|
||||
| Область | После P12 | После P13 | Изменение |
|
||||
|---|---:|---:|---:|
|
||||
| `_CODE` W2 | 9496 | 9496 | 0 |
|
||||
| данные W2 | 3256 | 3256 | 0 |
|
||||
| свободная куча W2 | 2096 | 2096 | 0 |
|
||||
| BANK1 | 6477 | 6477 | 0 |
|
||||
| BANK2 | 12256 | 13267 | +1011 |
|
||||
| `SPRCMD.EXE` | 43073 | 43073 | 0 |
|
||||
|
||||
В BANK2 остаётся 3117 байт. HOME и размер EXE не выросли; межбанковый аудит
|
||||
чист.
|
||||
|
||||
## Воспроизведение
|
||||
|
||||
```sh
|
||||
make hdd-p13-group-delete ALLOCS=3000
|
||||
tests/run_mame_hdd.sh build/hdd/p13_group_delete.chd \
|
||||
tests/mame_p13_group_delete.lua artifacts/mame-p13/local 58
|
||||
tests/check_p13_group_delete_hdd.sh build/hdd/p13_group_delete.chd
|
||||
```
|
||||
Reference in New Issue
Block a user