- предел длины компонента (255 байт) проверяется в BuildLinks до первой операции с ФС: ни каталога, ни ссылки при отказе не создаётся - причина пустого предпросмотра считается на показе (ReviewData.PreviewError) и печатается в панели действий и в карточке Telegram: у задачи без записанной причины взять её больше неоткуда
48 lines
3.6 KiB
Markdown
48 lines
3.6 KiB
Markdown
## Why
|
||
|
||
Название бывает длиннее, чем файловая система разрешает назвать файл. Сегодня
|
||
раскладка узнаёт об этом от ядра, уже начав работу: задача падает в `failed`, а
|
||
владелец видит вместо карточки ревью английскую строку `file name too long`.
|
||
Состояние `failed` терминальное — починить случай нечем, хотя чинится он одной
|
||
подсказкой на ревью, ровно как занятый целевой путь.
|
||
|
||
## What Changes
|
||
|
||
- Раскладка проверяет длину имени **до** первой операции с файловой системой:
|
||
каждый компонент целевого пути (папка тайтла, папка сезона, имя файла) обязан
|
||
помещаться в предел, который держат распространённые файловые системы Linux.
|
||
- Не помещается — раскладка отказывается целиком, не создав ни одного каталога и
|
||
ни одной ссылки, и задача уходит в `review` со своей причиной («имя не
|
||
помещается»), а не в `failed` с текстом системной ошибки.
|
||
- Владелец правит название подсказкой на ревью и применяет заново — путь тот же,
|
||
что при коллизии цели.
|
||
|
||
## Capabilities
|
||
|
||
### New Capabilities
|
||
|
||
Новых нет.
|
||
|
||
### Modified Capabilities
|
||
|
||
- `file-layout`: новое требование о непомещающемся целевом имени — проверка до
|
||
файловых операций, отказ целиком, уход в `review` с доменной причиной.
|
||
- `review`: панель действий при пустом предпросмотре печатает записанную причину
|
||
вместо общего «Подтверди источник». Пустой предпросмотр наступает от коллизии,
|
||
от непомещающегося имени и от невалидного плана — текст один на всех и в трёх
|
||
случаях из четырёх неверен.
|
||
|
||
## Impact
|
||
|
||
- `internal/layout` — проверка длины компонентов в `BuildLinks` (чистая функция,
|
||
до `mkdir`/`link`) и своя доменная ошибка вместо системной.
|
||
- `internal/worker` — ветка перевода задачи в `review` по этой ошибке, рядом с
|
||
веткой коллизии цели; свой код причины для корреляции.
|
||
- Веб-UI и Telegram — панель действий и карточка ревью называют причину, по
|
||
которой плана нет; причина считается на показе, поэтому относится к текущему
|
||
плану. Ревью показало, что взять её из записанного поля недостаточно: на самом
|
||
частом входе оно пусто.
|
||
- `internal/httpapi` — трансляция новой доменной ошибки в конфликт, а не в сбой
|
||
сервера; `internal/tgbot` — своя ветка ответа, как у коллизии.
|
||
- Внешних зависимостей, схемы БД и конфига изменение не трогает.
|