[devel] файловые зависимости на раскрытые альтернативы

Alexey Tourbin =?iso-8859-1?q?at_=CE=C1_altlinux=2Eru?=
Вт Авг 19 17:27:26 MSD 2008


On Tue, Aug 19, 2008 at 04:10:57PM +0300, Michael Shigorin wrote:
> On Tue, Aug 19, 2008 at 05:06:49PM +0400, Alexey Tourbin wrote:
> > Каждый компонент пути пробивается на предмет альтернатив -- см.
> > /usr/lib/rpm/find-package
> 
> readlink путь | grep ^/etc/alternatives
> ?

Да, только идея доведена до логического конца.
*Каждый* компонент пути пробивается на предмет альтернатив.

/usr/lib/rpm/find-package
   154		# Is it an alternative?  Path components can be alternatives, too.
   155		local p="$rep" alt_break= alt xalt xrep
   156		xrep=$(readlink -vm "$rep")
   157		while [ -n "$p" ]; do
   158			# Check each path component whether it is an alternative.
вот он этот readlink:
   159			if [ -L "$p" ] && readlink -v "$p" |grep -qs '^/etc/alternatives/'; then
   160				alt=$(CanonPath "$p")
   161				Verbose "$f: $rep -> $p -> $alt (alternative)"
   162				printf '%s\n' "$alt"
   163				# Now we have to decide if this alternative should eventually
   164				# prevent final $rep dependency resolution.
   165				xalt=$(readlink -vm "$p")
   166				case "$xrep" in
   167					"$xalt")
   168						# alternative and $rep are more or less the same
   169						alt_break=1 ;;
   170					"$xalt"/*)
   171						# $rep is under alternative dir, too bad
   172						Info "$f: alternative $alt prevents $rep dependency resolution"
   173						alt_break=1 ;;
   174				esac
   175			fi
   176			p=${p%/*}
   177		done
   178		[ -z "$alt_break" ] || return 0
   179		unset p alt_break alt xalt xrep ||:

Код выглядит правильно как святой отец папа римский, однако же,
сукин сын, подвержен тайным прегрешениям.

Вот пример того, что он может работать правильно.

$ ls -l /usr/share/design-current/gnome/splash/gnome-splash.png
-rw-r--r-- 1 root root 76260 Oct  4  2002 /usr/share/design-current/gnome/splash/gnome-splash.png
$ sh -c '. /usr/lib/rpm/find-package; FindPackage /some/symlink /usr/share/design-current/gnome/splash/gnome-splash.png'
/usr/share/design-current
sh: /some/symlink: alternative /usr/share/design-current prevents /usr/share/design-current/gnome/splash/gnome-splash.png dependency resolution
$ 

Появилась, как и требовалось, зависимость на альтернативный каталог
/usr/share/design-current.

А вот пример, что он может сбиться с истинного пути -- достаточно вместо
/usr/share/design-current/gnome/splash/gnome-splash.png
использовать путь
/usr/share/foo/bar/../../design-current/gnome/splash/gnome-splash.png

$ sh -c '. /usr/lib/rpm/find-package; FindPackage /some/symlink /usr/share/foo/bar/../../design-current/gnome/splash/gnome-splash.png'
design-graphics-sisyphus
$

Опа, при "неудачном" указании пути зависимость раскрылась в текущую
альтернативу.
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя     : =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Тип     : application/pgp-signature
Размер  : 197 байтов
Описание: =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Url     : <http://lists.altlinux.org/pipermail/devel/attachments/20080819/db50ab03/attachment-0002.bin>


Подробная информация о списке рассылки Devel