Настоящее сравнение двух `set:`-версий происходит в `rpmdsCompareEVR()` при
проверке совместимости зависимостей. Если обе версии начинаются с `set:`, код
вызывает `rpmsetcmp()`; если `set:` имеет только одна сторона, зависимости не
пересекаются. Следовательно, `rpmquery` полезен для извлечения корпуса строк,
но не является CLI для непосредственного сравнения двух наборов.
## Как `rpmquery` используется при сборке самого ALT RPM
В`alt/rpm.spec` ветки p11 после первой сборки выполняется:
```sh
rpmquery -a --provides | fgrep '= set:'| sort >P
rpmquery -a --requires | fgrep '= set:'| sort >R
join -o 1.3,2.3 P R | shuf >setcmp-data
time ./setcmp <setcmp-data >/dev/null
```
Смысл конвейера:
1. Из локальной базы сборочного окружения собираются все set-Provides и
set-Requires.
2. Строка поиска `= set:` захватывает как Provides с `= set:`, так и Requires с
`>= set:`, потому что вторая строка тоже содержит подстроку `= set:`.
3. После сортировки `join` соединяет файлы по первому полю — имени capability.
4.`-o 1.3,2.3` оставляет только третьи поля: set провайдера и set требования.
5. Полученные реальные пары подаются в `tools/setcmp` для замера реализации
`rpmsetcmp()` и профиль-управляемой пересборки `lib/set.c`.
В обновлённом минимальном контейнере p11 точный конвейер дал:
```text
P: 75 строк
R: 109 строк, из них 13 полных дублей
setcmp-data: 109 пар
```
Эти числа описывают только состав минимального контейнера, а не весь p11 или
Sisyphus. Также конвейер spec не сохраняет имя capability и пакет-владелец;
для исследовательского корпуса удобнее TSV-форматы выше.
Современная замена устаревающего `fgrep` без изменения смысла:
```sh
grep -F '= set:'
```
## Практические ограничения
-`rpmquery -a` означает все **установленные** пакеты, а не весь репозиторий.
-`--whatprovides` и `--whatrequires` ищут заголовки по имени capability; они
не принимают полноценное выражение зависимости как запрос сравнения.
- Несколько установленных версий или провайдеров могут дать несколько строк.
- Set-строки крупных библиотек очень длинные; лучше писать полный вывод в файл,
а в терминале показывать только статистику или начало строки.
- Для скриптов следует фиксировать `LC_ALL=C` и использовать `--queryformat`.
-`--requires`/`--provides` отражают метаданные RPM, а не текущее содержимое ELF
на диске. Для восстановления исходных символов нужны `nm`, `readelf` и
генераторы автозависимостей rpm-build.
- При запросе другой системы безопаснее явно использовать `--root`; `--dbpath`
меняет только путь к БД и требует внимательности к относительным путям.
- ALT предоставляет `--nowait-lock` как popt-алиас, отключающий ожидание
блокировки БД. Его стоит применять только когда отказ предпочтительнее
ожидания, а не как способ обходить активную транзакцию RPM/APT.
## Источники
1. [Документация платформы ALT 10.1: утилита RPM](https://docs.altlinux.org/ru-RU/platform/10.1/html/alt-platform/utilita_komandnoj_stroki_rpm.html) — RPM работает с файлами, пакетами, зависимостями и собственной БД, но не знает о репозиториях.
2. [Настройка списка репозиториев APT в ALT](https://docs.altlinux.org/ru-RU/platform/10.1/html/alt-platform/nastrojka_spiska_repozitoriev_apt.html).
3. [Пакет `rpm` в p11](https://packages.altlinux.org/en/p11/srpms/rpm/) и [specfile](https://packages.altlinux.org/en/p11/srpms/rpm/specfiles/).
4. [RDB: текущий бинарный пакет `rpm` для p11/x86_64](https://rdb.altlinux.org/api/site/pkghash_by_binary_name?branch=p11&name=rpm&arch=x86_64).
5. [`rpmqv.c`](https://git.altlinux.org/gears/r/rpm.git?p=rpm.git;a=blob;f=rpmqv.c;hb=7e71ed3da438289d916f1cccc9c0a83e594455dc) — выбор режима Query по имени `rpmquery`/`rpmq`.
7. [`lib/query.c`](https://git.altlinux.org/gears/r/rpm.git?p=rpm.git;a=blob;f=lib/query.c;hb=7e71ed3da438289d916f1cccc9c0a83e594455dc) — индексы для `--whatprovides`, запросы файлов и формат `%{nvra}` по умолчанию.
8. [`lib/rpmds.c`](https://git.altlinux.org/gears/r/rpm.git?p=rpm.git;a=blob;f=lib/rpmds.c;hb=7e71ed3da438289d916f1cccc9c0a83e594455dc) — вызов `rpmsetcmp()` при сравнении двух set-версий.
9. [`alt/rpm.spec`](https://git.altlinux.org/gears/r/rpm.git?p=rpm.git;a=blob;f=alt/rpm.spec;hb=7e71ed3da438289d916f1cccc9c0a83e594455dc) — построение `setcmp-data` через `rpmquery`.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.