В etersoft-build-utils 3.3.1-alt1 (коммит d223e6c от 07.02.2026, «rpmgs: use 'ours' merge strategy for .gear/tags-based packages») в rpmgs, функция update_master_branch_to(), для репозиториев с каталогом .gear/tags обычный мердж апстримного тега был заменён на `git merge -s ours $tag`. В 3.3.3-alt1 (коммит bd83b59 от 29.06.2026) стратегия убрана. Проблема в долгоживущих последствиях, которые остались и после исправления: 1. `merge -s ours` создаёт мердж-коммит, дерево которого идентично ветке мейнтейнера — содержимое апстрима отбрасывается, но апстримные коммиты становятся предками ветки и считаются git «уже смерженными» навсегда. 2. После возврата к обычному мерджу (3.3.3+) git вычисляет дельту от merge-base, в который эти теги уже входят, и применяет только инкремент между последними тегами. Все изменения апстрима за период до ours-мерджей в дерево ветки не попадают никогда — молча, без конфликтов и предупреждений. 3. В результате дерево ветки — несогласованная смесь старой базы и свежих дельт. Пример: в python3-module-pykickstart после обновлений 3.74→3.77 код из r3.77 импортирует символ F45, добавленный в version.py ещё в r3.74 и отброшенный ours-мерджем: checkout ветки нерабочий (ImportError, тесты падают). Сами пакеты при этом собираются корректно, т.к. тарболл в .gear/rules берётся из апстримного тега (tar: r@version@:.), и проблема незаметна при сборке. 4. Репозитории, где тарболл собирается из дерева ветки (tar: . и т.п.), в период с 28.03.2026 по 01.07.2026 могли выпустить пакеты со старым кодом под новой версией — это стоит проверить отдельно. Детектор поражённых репозиториев (пустой ours-мердж: дерево результата совпадает с первым родителем, хотя второй родитель отличался): for m in $(git log --merges --format=%H); do git diff --quiet $m^1 $m && ! git diff --quiet $m^1 $m^2 && \ git log -1 --format='%h %ad %s' --date=short $m done Починка поражённого репозитория (переписывание истории не требуется): одним коммитом привести дерево к содержимому последнего апстримного тега: git read-tree --reset -u <апстримный_тег> git checkout HEAD -- .gear git commit -m "Restore tree content from upstream tag (ours-merge skew fix)" У себя обнаружил 23 поражённых репозитория из 73 (ours-мерджи в период 18.05–30.06.2026). Вероятно, проблема затронула и других мейнтейнеров, пользовавшихся rpmgs 3.3.1–3.3.2 с git-merge-стилем обновления. Предложения: - анонсировать в devel@lists.altlinux.org, чтобы мейнтейнеры проверили свои репозитории детектором выше; - рассмотреть добавление в rpmgs защиты: предупреждение, если мердж апстримного тега не изменил дерево (git diff --quiet HEAD^1 HEAD после мерджа) — на случай подобных регрессий в будущем.
Created attachment 22353 [details] gear-ours-merge-audit.sh: audit gear repos for empty ours-merges (first-parent, periods, tar:/diff: rules) Спасибо за подробный разбор и детектор. Хронология в etersoft-build-utils (rpmgs, update_master_branch_to): - d223e6c (2026-02-07) — 'ours' для пакетов с .gear/tags; - bd83b59 (2026-06-29) — убрано; - 2e21b42 (2026-07-29) — 'ours' снова, для пакетов с архивом из тега версии (tar: ...@version@); - af5e7ff (2026-08-21) — 'ours' убран окончательно, обычный merge тега. То есть опасных периода два: 2026-02-07..2026-06-29 и 2026-07-29..2026-08-21. Защита на будущее: rpmgs после merge апстримного тега предупреждает, если дерево не изменилось, а тег отличается (git diff --quiet HEAD^1 HEAD && ! git diff --quiet HEAD^1 HEAD^2) — коммит 2f752bc, войдёт в следующий релиз. Важное дополнение к п.4: поражены не только репозитории с tar: . — если архив берётся из тега, но есть правило diff: @version@:. . (патч "тег -> ветка"), то потерянные апстримные изменения откатываются в собранном пакете через этот патч. Так было с i2pd (2.59.0-alt1, 2.60.0-alt1) и ccache 4.11.3-alt1. Детектор стоит ограничивать ветками мейнтейнера (git log --merges --first-parent), иначе он ловит внутренние merge апстрима. Прикладываю скрипт аудита gear-ours-merge-audit.sh: клонирует репозитории из /gears (shallow, при необходимости углубляет), берёт коммит апстримного тега из .gear/tags, учитывает только merge в указанные периоды, определяет источник архива по правилам tar:/diff: и для подозрительных показывает расхождение дерева с тегом. Список своих пакетов можно получить так: eget -O- 'https://rdb.altlinux.org/api/site/maintainer_packages?branch=sisyphus&maintainer_nickname=NICK' Ограничение: правило tar: с подкаталогом ветки считается "архивом из дерева", такие срабатывания нужно смотреть вручную. Результат по моим пакетам (1611 src, из них 1275 с gear-репозиториями): - 11 репозиториев с пустыми merge в эти периоды; - в 5 из них (createrepo_c, gnucash-docs, libsolv, py2pack, python3-module-backrefs) архив из тега и без diff: — собранные пакеты корректны, искажено только дерево ветки; - ccache 4.11.3-alt1 выходил со старым кодом (через патч), исправлено в 4.13.6-alt1; - i2pd 2.59.0/2.60.0 — патч откатывал апстримные изменения (в 2.60.0 — 8 файлов, в т.ч. вернул удалённые апстримом reseed-сертификаты), исправляется в 2.61.0-alt1 восстановлением дерева из тега; - остальные срабатывания — намеренные пустые merge служебных веток. Баг закрою после выпуска etersoft-build-utils с предупреждением.
etersoft-build-utils-3.3.9-alt1 -> sisyphus: Wed Oct 07 2026 Vitaly Lipatov <lav@altlinux.ru> 3.3.9-alt1 - rpmrb: add -U option to build without uploading to girar - rpmgs: warn if merging an upstream tag left the tree unchanged (ALT bug 60117) - gitask: show who must approve EPERM subtasks, rework ls colors - gitask: ls: show approval status before each package - gitask: add 'groups' command to show acl groups of a user - fix(web): use browser User-Agent for downloads - rpmgs: ignore upstream vendor directory