Summary: | find-package generates mismatched R: in merged-usr environment | ||||||
---|---|---|---|---|---|---|---|
Product: | Sisyphus | Reporter: | Arseny Maslennikov <arseny> | ||||
Component: | rpm-build | Assignee: | 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
Arseny Maslennikov
2024-02-28 11:56:59 MSK
Created attachment 15617 [details]
экспериментальный патч, с которым работает
Любопытно, что проблема не проявляется, если в пакет rpm (scripts/functions берутся оттуда) внести приложенное сюда изменение.
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. (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 * 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. |