Bug 49544 - find-package generates mismatched R: in merged-usr environment
Summary: find-package generates mismatched R: in merged-usr environment
Status: CLOSED FIXED
Alias: None
Product: Sisyphus
Classification: Development
Component: rpm-build (show other bugs)
Version: unstable
Hardware: all Linux
: P5 normal
Assignee: placeholder@altlinux.org
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks: 49547
  Show dependency tree
 
Reported: 2024-02-28 11:56 MSK by Arseny Maslennikov
Modified: 2024-03-27 20:32 MSK (History)
7 users (show)

See Also:


Attachments
экспериментальный патч, с которым работает (786 bytes, patch)
2024-02-28 12:00 MSK, Arseny Maslennikov
no flags Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Arseny Maslennikov 2024-02-28 11:56:59 MSK
https://git.altlinux.org/tasks/339399/logs/events.3.1.log

	x86_64: NEW unmet dependencies detected:
 cryptsetup#2.6.1-alt1:sisyphus+339399.1300.3.1@1706643605        /usr/sbin/blkid
 dbus#1.14.10-alt1:sisyphus+339399.1500.3.1@1706643710            /usr/sbin/chkconfig
 dhcp-client#1:4.4.3.P1-alt2:sisyphus+339399.1600.3.1@1706643793  /usr/sbin/start-stop-daemon
 dhcp-server#1:4.4.3.P1-alt2:sisyphus+339399.1600.3.1@1706643793  /usr/bin/shell-config
 systemd#1:254.7-alt1:sisyphus+339399.2700.3.1@1706644609         /usr/bin/kmod
 systemd#1:254.7-alt1:sisyphus+339399.2700.3.1@1706644609         /usr/bin/rm
 systemd#1:254.7-alt1:sisyphus+339399.2700.3.1@1706644609         /usr/bin/run-parts
 systemd#1:254.7-alt1:sisyphus+339399.2700.3.1@1706644609         /usr/sbin/ldconfig
 systemd#1:254.7-alt1:sisyphus+339399.2700.3.1@1706644609         /usr/sbin/systemd-repart

Когда я локально воспроизвёл ситуацию из этого задания, у меня эти пакеты в чрут смогли установиться (т. е. зависимости там удовлетворились).
Comment 1 Arseny Maslennikov 2024-02-28 12:00:44 MSK
Created attachment 15617 [details]
экспериментальный патч, с которым работает

Любопытно, что проблема не проявляется, если в пакет rpm (scripts/functions берутся оттуда) внести приложенное сюда изменение.
Comment 2 Arseny Maslennikov 2024-03-13 11:30:37 MSK
https://packages.altlinux.org/en/tasks/327286/

Предлагаю вот такое решение проблемы (там есть подзадание с rpm-build). Смысл тот же: если в процессе разбора и каноникализации пути нужно пройти по /bin или /sbin, они игнорируются (как будто это не симлинки). Таким образом, /sbin/chkconfig каноникализуется^W переходит в /sbin/chkconfig, а не в /usr/sbin/chkconfig, что соответствует существующим Provides: в пакетах.

Например, если:
— /a/b — это ссылка на каталог ddd/p/q,
— /a/ddd/p/q/c — это ссылка на /a/x (не на /a/c),
— /a/ddd/p/q/k — это ссылка на /a/k,
— и мы игнорируем /a/b,
то мы из пути /a/b/k получим тот же /a/b/k, а из /a/b/c/d/e не получим: вылезет ENOENT, ибо по /a/ddd/p/q/c ничего нет.

В предыдущей реализации использовалась команда `readlink -vm`, но ни readlink(1), ни realpath(1) нельзя заставить не проходить по ссылкам в некоторых компонентах пути, поэтому там "realpath с особенностями" на C.
Comment 3 Arseny Maslennikov 2024-03-13 11:33:26 MSK
(In reply to Arseny Maslennikov from comment #2)
> https://packages.altlinux.org/en/tasks/327286/
> 
> Предлагаю вот такое решение проблемы (там есть подзадание с rpm-build).
> Смысл тот же: если в процессе разбора и каноникализации пути нужно пройти по
> /bin или /sbin, они игнорируются (как будто это не симлинки). Таким образом,
> /sbin/chkconfig каноникализуется^W переходит в /sbin/chkconfig, а не в
> /usr/sbin/chkconfig, что соответствует существующим Provides: в пакетах.
> 
> Например, если:
> — /a/b — это ссылка на каталог ddd/p/q,
> — /a/ddd/p/q/c — это ссылка на /a/x (не на /a/c),
> — /a/ddd/p/q/k — это ссылка на /a/k,
> — и мы игнорируем /a/b,
> то мы из пути /a/b/k получим тот же /a/b/k, а из /a/b/c/d/e не получим:
> вылезет ENOENT, ибо по /a/ddd/p/q/c ничего нет.

Т. е. это то же самое, что было, но с ignore-листами. Кроме того, поведение отличается вот в каком случае:

было:
  [root@horse ~]# /bin/sh -ec '. /usr/lib/rpm/functions; CanonPath /etc/init.d/.'
  /etc/init.d
  [root@horse ~]# /bin/sh -ec '. /usr/lib/rpm/functions; CanonPath /etc/init.d/'
  /etc/init.d
  [root@horse ~]# /bin/sh -ec '. /usr/lib/rpm/functions; CanonPath /etc/init.d'
  /etc/init.d

стало:
  [builder@localhost ~]$ /bin/sh -ec '. /usr/lib/rpm/rpmb-functions; CanonPath /etc/init.d/.'
  /etc/rc.d/init.d
  [builder@localhost ~]$ /bin/sh -ec '. /usr/lib/rpm/rpmb-functions; CanonPath /etc/init.d/'
  /etc/rc.d/init.d
  [builder@localhost ~]$ /bin/sh -ec '. /usr/lib/rpm/rpmb-functions; CanonPath /etc/init.d'
  /etc/init.d
Comment 4 Arseny Maslennikov 2024-03-27 20:32:50 MSK
* Tue Mar 26 2024 Arseny Maslennikov <arseny@altlinux.org> 4.0.4.198-alt1
- brp: Added brp-dupe-bin module to help fix ~20 packages for usrmerge (thx
  obirvalger@).
- tools: New tool: remappath2.
- Re-implemented CanonPath() using remappath2. This allows to skip following
  some symlinks during path component resolution, so find-requires does not
  generate dependencies on e. g. /usr/bin/sh.