Files
ARSV/Docs/more/compare-sisyphus-set-versions.md
T
2026-07-20 21:58:04 +03:00

7.2 KiB
Raw Blame History

Сравнение set-зависимостей Sisyphus с newset.c

Скрипт scripts/compare_sisyphus_set_versions.sh сравнивает set-строки из RPM-заголовка с результатом reimplement/newset.c.

Что именно сравнивается

  1. Из изолированных APT-индексов Sisyphus/x86_64 и Sisyphus/noarch берутся Package, Architecture, Version, Filename, MD5Sum, Provides и Depends/Pre-Depends.
  2. RPM скачивается непосредственно из Sisyphus/files/<arch>/RPMS и проверяется по MD5Sum из индекса.
  3. Эталонные зависимости читаются из RPM-заголовка через массивы тегов: PROVIDENAME/PROVIDEFLAGS/PROVIDEVERSION и REQUIRENAME/REQUIREFLAGS/REQUIREVERSION.
  4. Для воспроизведения зависимостей вызываются установленные вместе с rpm-build программы %_rpmlibdir/find-provides и %_rpmlibdir/find-requires с методом none,lib.
  5. В каталоге инструментов заменяется только mkset: вместо штатного mkset подставляется совместимая обвязка над newset.c. provided_symbols, ldd --bindings, eu-readelf, objdump, file и остальные средства отбора/извлечения символов остаются штатными инструментами rpm-build.

Для Requires APT получает точный уже скачанный RPM-файл как вход и скачивает его полный runtime dependency closure в пустой пользовательский RPM root. Так версия и архитектура целевого пакета не выбираются повторно по имени. APT запускается с пустым APT_CONFIG; source list, package cache, archives, lists, status и preferences перенаправлены во временный каталог, поэтому настройки, hooks и RPM-база основной системы не участвуют в разрешении зависимостей.

Перед распаковкой проверяются имена элементов cpio и цели символических ссылок. Абсолютная RPM-ссылка считается путём внутри виртуального package root: например, /usr/sbin/update-alternatives -> /bin/true безопасно переписывается в ../../bin/true, а не направляется в /bin/true основной системы. Все symlink сначала собираются из RPM-заголовков и создаются в порядке от родительских путей к дочерним; затем cpio извлекает только нессылочные элементы. Благодаря этому usrmerge-ссылки вроде /bin -> usr/bin создаются до файлов /bin/*.

Имена элементов с выходом через .. и относительные symlink, фактически выходящие из временного root, по-прежнему отклоняются. После проверки RPM-файлы распаковываются без установки. Это позволяет штатному rpm-build/ldd использовать интерпретатор и библиотеки из того же снимка Sisyphus, не изменяя систему.

Ограниченный тест

На ALT p11 с установленным rpm-build:

bash scripts/compare_sisyphus_set_versions.sh \
    --package strace \
    --report strace-set-report.tsv

Несколько пакетов:

bash scripts/compare_sisyphus_set_versions.sh \
    --package strace \
    --package libdw \
    --report sample-set-report.tsv

Либо первые десять записей индекса:

bash scripts/compare_sisyphus_set_versions.sh \
    --limit 10 \
    --report sample-set-report.tsv

Без --all, --limit или --package скрипт завершится до обращения к репозиторию. Это защищает от случайного полного запуска.

Полный запуск

Команда предусмотрена, но в ходе разработки не запускалась:

bash scripts/compare_sisyphus_set_versions.sh \
    --all \
    --report sisyphus-set-report.tsv

Продолжение после прерывания:

bash scripts/compare_sisyphus_set_versions.sh \
    --all \
    --resume \
    --report sisyphus-set-report.tsv

--resume пропускает только уже завершённую комбинацию package/architecture/version; обновившийся пакет будет обработан заново. Завершённость подтверждается маркером complete=1 в полной 11-польной строке SUMMARY, поэтому оборванная при записи строка не считается результатом.

Во время работы отчёт можно наблюдать отдельно:

tail -f sisyphus-set-report.tsv

START записывается до обработки пакета, а DEPENDENCY и SUMMARY — сразу после сравнения пакета. Поэтому файл обновляется в процессе, а не только после завершения всего обхода.

Статусы отчёта

  • match — set-строка из RPM совпала с результатом newset.c;
  • mismatch — capability и оператор совпали, set-строки различаются;
  • missing_generated — RPM содержит set-зависимость, но повторный запуск rpm-build её не сгенерировал;
  • extra_generated — повторный запуск сгенерировал зависимость, которой нет в RPM-заголовке;
  • no_set_metadata — в APT metadata пакета нет set-строк;
  • *_error — ошибка скачивания, контрольной суммы, распаковки либо генератора.

extra_generated показывается в строках DEPENDENCY и делает итоговый статус пакета равным mismatch. При анализе нужно учитывать, что бинарный RPM не содержит исходных spec-фильтров (filter_from_requires и аналогичных), поэтому часть таких расхождений может относиться не к newset.c, а к невозможности полностью воспроизвести фильтрацию исходного spec. Их число отдельно указано в поле extras=N строки SUMMARY.