Bug 49544

Summary: find-package generates mismatched R: in merged-usr environment
Product: Sisyphus Reporter: Arseny Maslennikov <arseny>
Component: rpm-buildAssignee: placeholder <placeholder>
Status: CLOSED FIXED QA Contact: qa-sisyphus
Severity: normal    
Priority: P5 CC: arseny, glebfm, imz, ldv, obirvalger, placeholder, vt
Version: unstable   
Hardware: all   
OS: Linux   
Bug Depends on:    
Bug Blocks: 49547    
Attachments:
Description Flags
экспериментальный патч, с которым работает none

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.