126 lines
7.2 KiB
Markdown
126 lines
7.2 KiB
Markdown
# Сравнение set-зависимостей Sisyphus с `newset.c`
|
||
|
||
Скрипт [`scripts/compare_sisyphus_set_versions.sh`](../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`:
|
||
|
||
```sh
|
||
bash scripts/compare_sisyphus_set_versions.sh \
|
||
--package strace \
|
||
--report strace-set-report.tsv
|
||
```
|
||
|
||
Несколько пакетов:
|
||
|
||
```sh
|
||
bash scripts/compare_sisyphus_set_versions.sh \
|
||
--package strace \
|
||
--package libdw \
|
||
--report sample-set-report.tsv
|
||
```
|
||
|
||
Либо первые десять записей индекса:
|
||
|
||
```sh
|
||
bash scripts/compare_sisyphus_set_versions.sh \
|
||
--limit 10 \
|
||
--report sample-set-report.tsv
|
||
```
|
||
|
||
Без `--all`, `--limit` или `--package` скрипт завершится до обращения к
|
||
репозиторию. Это защищает от случайного полного запуска.
|
||
|
||
## Полный запуск
|
||
|
||
Команда предусмотрена, но в ходе разработки не запускалась:
|
||
|
||
```sh
|
||
bash scripts/compare_sisyphus_set_versions.sh \
|
||
--all \
|
||
--report sisyphus-set-report.tsv
|
||
```
|
||
|
||
Продолжение после прерывания:
|
||
|
||
```sh
|
||
bash scripts/compare_sisyphus_set_versions.sh \
|
||
--all \
|
||
--resume \
|
||
--report sisyphus-set-report.tsv
|
||
```
|
||
|
||
`--resume` пропускает только уже завершённую комбинацию
|
||
`package/architecture/version`; обновившийся пакет будет обработан заново.
|
||
Завершённость подтверждается маркером `complete=1` в полной 11-польной строке
|
||
`SUMMARY`, поэтому оборванная при записи строка не считается результатом.
|
||
|
||
Во время работы отчёт можно наблюдать отдельно:
|
||
|
||
```sh
|
||
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`.
|