8e389c03f8
Реализовать двухпанельный Commander от платформенного PoC до этапов P6-P20: EMM-каталог, сортировку и выбор, операции с файлами и деревьями, транзакционное копирование, метаданные, политику конфликтов и предварительную проверку свободного места. Добавить проектную документацию, HDD/MAME-сценарии и проверенные артефакты. Расширить libc операцией bank_write_page, исправлением режима O_RDONLY и связанными регрессионными проверками.
79 lines
4.5 KiB
Markdown
79 lines
4.5 KiB
Markdown
# Sprinter Commander: групповое копирование файлов 0.2/P12
|
|
|
|
Дата: 9 сентября 2026 года.
|
|
|
|
Статус: `PASS` в MAME 0.288 / BIOS 3.06 / DSS 1.71.57 на HDD `D:`.
|
|
|
|
Примечание: документ фиксирует исторический срез P12, где directory roots
|
|
ещё пропускались. Начиная с P16 текущий F5 копирует их рекурсивно; fixture и
|
|
checker P12 обновлены как регрессия нового контракта, а исходные кадры ниже
|
|
оставлены для истории этапа.
|
|
|
|
## Контракт первого группового среза
|
|
|
|
Если в активной панели нет выбора, F5 сохраняет проверенное поведение
|
|
однофайлового PoC. При ненулевом выборе F5:
|
|
|
|
1. Считает выбранные обычные файлы и отдельно выбранные каталоги.
|
|
2. Последовательно копирует только файлы в порядке текущей сортировки панели.
|
|
3. Для каждого файла использует прежний crash-safe `temp -> commit` и общую
|
|
4-КБ EMM-страницу W3.
|
|
4. Проверяет Esc между блоками и файлами.
|
|
5. При cancel/error удаляет только незавершённый temp; уже завершённые файлы
|
|
сохраняются.
|
|
6. Останавливается на первой ошибке и сообщает `copied/total`, число
|
|
пропущенных каталогов и errno.
|
|
7. Перечитывает passive panel один раз после завершённых копий.
|
|
|
|
Выбранные каталоги намеренно игнорируются до появления рекурсивной job. Это
|
|
не меняет их флаг выбора и согласуется с правилом: групповые `+`, `-`, `*`
|
|
работают только над файлами.
|
|
|
|
Overwrite по-прежнему запрещён. Повторный запуск поверх уже скопированных
|
|
файлов останавливается на первом `EEXIST`; существующие targets не меняются.
|
|
|
|
## Проверка
|
|
|
|
HDD-fixture содержит выбранный вручную `ADIR` и три файла размером 10, 4097
|
|
и 0 байт. После первого F5 внешний checker подтверждает три побайтно точные
|
|
копии, отсутствие каталога и temp. Второй F5 проверяет управляемую остановку
|
|
на существующем `A.BIN`.
|
|
|
|
```text
|
|
PASS: 3 selected files copied; selected directory skipped; no temp.
|
|
```
|
|
|
|
Контрольные состояния:
|
|
|
|
- [каталог и три файла выбраны](../artifacts/mame-p12/group-copy/selected-files-and-dir.png);
|
|
- [скопировано 3/3, один каталог пропущен](../artifacts/mame-p12/group-copy/copied-and-skipped-dir.png);
|
|
- [повтор остановлен на EEXIST](../artifacts/mame-p12/group-copy/repeat-stops-eexist.png);
|
|
- [passive panel перечитана](../artifacts/mame-p12/group-copy/passive-refreshed.png);
|
|
- [штатный возврат в DSS](../artifacts/mame-p12/group-copy/clean-dss-return.png).
|
|
|
|
## Компоновка и размер
|
|
|
|
Конфигурация `--memory big --safe --max-allocs 3000`:
|
|
|
|
| Область | После P11 | После P12 | Изменение |
|
|
|---|---:|---:|---:|
|
|
| `_CODE` W2 | 9496 | 9496 | 0 |
|
|
| данные W2 | 3256 | 3256 | 0 |
|
|
| свободная куча W2 | 2096 | 2096 | 0 |
|
|
| BANK1 | 6477 | 6477 | 0 |
|
|
| BANK2 | 10942 | 12256 | +1314 |
|
|
| `SPRCMD.EXE` | 43073 | 43073 | 0 |
|
|
|
|
Пробный перенос обработчика в новый BANK3 увеличивал EXE ровно на 16384
|
|
байта при 2823 байтах полезного кода. Поэтому P12 оставлен в BANK2: там ещё
|
|
4128 байт запаса, а размер файла не вырос. Межбанковый аудит чист.
|
|
|
|
## Воспроизведение
|
|
|
|
```sh
|
|
make hdd-p12-group-copy ALLOCS=3000
|
|
tests/run_mame_hdd.sh build/hdd/p12_group_copy.chd \
|
|
tests/mame_p12_group_copy.lua artifacts/mame-p12/local 57
|
|
tests/check_p12_group_copy_hdd.sh build/hdd/p12_group_copy.chd
|
|
```
|