chore: sync hardening — cp -P, честные ошибки PR, точный парс managed, reuse lint #2
No reviewers
Labels
No labels
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
shikos/.forgejo!2
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "task/sync-hardening"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
task/sync-hardening — отчёт
Три точечных укрепления
sync/template-sync.sh+ шагreuse lintвsmoke.yml. Семантика синка не менялась: managed-список читается из шаблона,.syncignoreдетей уважается, PR-ы открываются как раньше. Бриф удалён последним коммитом — контракт отработан.Что легло и почему
cp→cp -P— симлинки едут симлинками. Проверено локально: GNUcp -Pсимлинки поверх существующего обычного файла корректно заменяет файл симлинкой;[ -f … ]разыменовывает, симлинка с живой целью проходит фильтр. Известная особенностьcmp -s(разыменовывает обе стороны) оставлена как есть — по брифу.|| trueубран; код HTTP захватывается через-w '%{http_code}', тело — в файл. Разбор:201→ «PR → repo»;409с теломpull request already exists→ «PR уже открыт → repo»; всё остальное (включая транспортные ошибки curl, код000) → явная ошибка в stderr с кодом и телом,FAILED=1. Выход — накопленный: в конце прогонаexit 1, если были отказы. Довод (утверждён на шаге 0): прогон обходит всех детей, отказ API на одном не должен лишать волны остальных здоровых; красный прогон в конце всё равно сигналит. Токен в вывод не попадает: он в заголовке, URL чистый.managed:— awk вместо жадного grep по всему файлу: блок начинается строкойmanaged:(допущен хвостовой комментарий), кончается на следующем ключе верхнего уровня или EOF; строки-комментарии внутри блока пропускаются. Инлайн-комментарии у элементов не обрабатываются — их нет, и старый grep их тоже не резал: менялись только границы блока, паритет семантики. Новых зависимостей нет (bash+awk).reuse lintвsmoke.yml— на каждый пуш. Установка шагом workflow:apt-get install python3-venv→ venv →pip install reuse==6.2.0в venv. Venv вместо системного pip — из-за PEP 668 на bookworm; пин виден прямо в шаге. Образshikos/ciне предполагается: шаг работает на дефолтном образе раннера (data.forgejo.org/oci/node:lts, Debian 12 bookworm — выяснено по логу smoke-прогона #28).template-sync— не тронут (решение основателя).Сверка шага 0 — как разрешились
routers/api/v1/repo/pull.go) — единственный 409-случай вCreatePullRequest; тело{"message":"pull request already exists for these targets [...]"}. Различение: код 409 + подстрока в теле. Расхождений с брифом нет.runs-on: dockerбезcontainer:=data.forgejo.org/oci/node:lts— подтверждено логом живого прогона; отсюда способ установки reuse.cp -Pповерх обычного файла — проверено локально до кода.Приёмка (механическая)
bash -n sync/template-sync.sh— чисто.managed:проверен исполнением фрагмента, выдернутого из самого скрипта: на текущем.sync.ymlшаблона — байт-в-байт тот же набор из 17 путей, что у старого grep; с подмешанным посторонним списком (other:\n - foreign/path) — набор не меняется (старый grep постороннее подхватывал).reuse lintна HEAD — зелёный. Примечание: на промежуточных коммитах ветки lint красный из-за самого брифаdocs/tasks/sync-hardening.md(одноразовый файл без SPDX-шапки, добавлен до этой задачи); после его удаления последним коммитом дерево зелёное — CI гоняет HEAD пуша, так что smoke зелёный.sync/template-sync.sh+.forgejo/workflows/smoke.yml+ удаление брифа. Ничего больше.Адверсарное ревью диффа (находки построчного ревью)
До коммита дифф прошёл многоагентное ревью (3 линзы: bash-корректность под
set -euo pipefail, соответствие брифу, реалии CI; каждая находка — через трёх независимых опровергателей с исполнением фрагментов).managed:на любой строке с нулевым отступом — комментарий с нулевым отступом внутри блока молча отрезал хвост списка, а элементы с нулевым отступом (managed:+- a.txt— валидный YAML) давали пустой набор: прогон печаталmanaged:, рапортовал всем репоcleanи выходил с 0 — тихое подавление дрейфа, вразрез с темой честных ошибок. Латентно (текущий манифест парсится верно), но исправлено в рамках п. 3: правило элемента перенесено раньше терминатора, комментарии/пустые строки любого отступа — пропуск. Регрессионные случаи добавлены в локальную проверку, все зелёные; критерий «посторонний список не меняет набор» сохранён.shikos/ci): находок нет.Наблюдения
LICENSES/LicenseRef-PolyForm-Strict-1.0.0.txtв манифест) —cp -Pтам предусловие.Отклонения от брифа
Нет.
Сверено против брифа (
docs/tasks/sync-hardening.md@caf0562) и вольта. APPROVED.Scope — все четыре пункта на месте, механика проверена по диффу:
cp -P— точечно, одна строка; разыменование фильтра[ -f ]учтено в отчёте, особенностьcmp -sсохранена по брифу.201/409+ «pull request already exists» / прочее (включая транспортный000) — тело в stderr, накопленныйexit 1в конце прогона. Токен в вывод не попадает. Дизайн накопленного выхода — по слову-го шага 0.managed:: правило элемента стоит раньше терминатора — flush-left элементы не рвут блок и не дают пустой набор; комментарии и пустые строки любого отступа — пропуск; посторонний топ-уровневый ключ закрывает блок. Критерий брифа («посторонний список не меняет набор») выполняется. Паритет со старым grep по хвостовым комментариям элементов принят как задокументированный.smoke.yml: строго добавка шага; пинreuse==6.2.0, venv против PEP 668, ноль опоры на образshikos/ci— независимость от параллельной задачи соблюдена. Зелёный smoke #186 на HEAD подтверждён вызовом.Non-goals соблюдены: форс-пуш нетронут, стражи содержимого не введены,
rust-ci.yml/template-sync.ymlне тронуты, исключение.forgejoна месте. Дифф — ровно два файла; бриф схлопнулся добавлением+удалением и в полёте не правился: буква заморозки соблюдена — чище прецедента ci-image#9, красный lint промежуточных коммитов принят вместо правки контракта.Для основателя, не блокирует: (1) отчёт ссылается на го шага 0 (накопленный выход вместо немедленного) — подтверждение, что стоп и го были, за тобой; (2) наблюдение кодера про анонимное чтение репо и логов Actions — вне задачи, маршрутизируется отдельно.
Мерж — за основателем.