[devel] alternatives.prov
Alexey Tourbin
=?iso-8859-1?q?at_=CE=C1_altlinux=2Eru?=
Ср Мар 28 21:30:44 MSD 2007
При сборке git-1.5.1 с kernel.org с моим rpm-build (бранч mod) у пакета
git-core появился unmet на /usr/bin/emacs. Выяснилось, что новый скрипт
/usr/bin/git-mergetool вытаскивает много лишних зависимостей на всякие
утилиты типа vimdiff, kdiff3 и до кучи emacs. Наиболее правильным
решением тут будет просто отключить поиск зависимостей в
/usr/bin/git-mergetool, но образование unmet'а на /usr/bin/emacs
требует отедльного рассмотрения.
Дело в том, что /usr/bin/emacs никто не предоставляет как зависимость,
и файл /usr/bin/emacs тоже не принадлежт ни одному пакету, а висит на
альтернативах. В связи с этим новый rpm-build проставляет голую
зависимость на /usr/bin/emacs, и я считаю, что это правильно.
Проблема тут в том, что maintainer пакета emacs22 забыл добавить
в некоторые пакеты Provides: /usr/bin/emacs. Не он один забывает это
сделать, напр. /usr/bin/javac тоже висит на альтернативах и никем не
прдоставляется. Полагаю, что этим список потенциальных анметов не
исчерпывается.
Чтобы решить эту проблему, я решил добавить специальный provides метод
в пакет alternatives. Он добавляет в provides все альтернативы которые
начинаются с /usr/bin/ и /usr/sbin/.
Ниже приведены некоторые подробности. Есть ли недостатки у этого
подхода? Может образоваться некоторое (небольшое) количество "мусорных"
provides, типа /usr/bin/autoconf-default или /usr/bin/i586-alt-linux-gcc.
С другой стороны, в принципе предусмотрено отключение любого prov метода.
commit 28c294aeb30f638727477724b1f3cf3328855d7e
Author: Alexey Tourbin <at на altlinux>
Date: Wed Mar 28 14:58:54 2007 +0400
alternatives.prov: check that alternative target is acutally available
$ rpm -qf /etc/alternatives/packages.d/xemacs
xemacsen-0.4-alt1
$ cat /etc/alternatives/packages.d/xemacs
/usr/bin/xemacs /usr/bin/xemacs-x11 80
/usr/bin/xemacs /usr/bin/xemacs-nox 70
/usr/bin/xemacs /usr/bin/xemacs-mule 60
/usr/bin/xemacs /usr/bin/xemacs-mule-nextaw 50
/usr/bin/xemacs /usr/bin/xemacs-nomule 40
/usr/bin/xemacs /usr/bin/xemacs-nomule-nextaw 30
/usr/bin/xemacs /usr/bin/xemacs-nox-mule 20
/usr/bin/xemacs /usr/bin/xemacs-nox-nomule 10
$ ls /usr/bin/xemacs*
zsh: no matches found: /usr/bin/xemacs*
$
In this case, we should NOT provide /usr/bin/xemacs.
diff --git a/alternatives/alternatives.prov b/alternatives/alternatives.prov
index e7e7e58..ccba5d5 100755
--- a/alternatives/alternatives.prov
+++ b/alternatives/alternatives.prov
@@ -5,7 +5,18 @@
AlternativesProv()
{
local f="$1"; shift
- awk '$1 ~ /^\/usr\/s?bin\// {print $1}' "$f"
+ local link bin rest
+ while read -r link bin rest; do
+ case "${link-}" in
+ /usr/bin/*|/usr/sbin/*)
+ ;;
+ *)
+ continue ;;
+ esac
+ if [ -x "${RPM_BUILD_ROOT-}$bin" ]; then
+ echo "$link"
+ fi
+ done <"$f"
}
ArgvFileAction AlternativesProv "$@"
commit e51b5a69a2f3a2bc92abc16462e3137366ce995e
Author: Alexey Tourbin <at на altlinux>
Date: Wed Mar 28 14:23:42 2007 +0400
added alternatives.prov and alternatives.prov.files, for new rpm-build
/usr/bin/emacs is not provided by any package:
$ rpm -q --whatprovides /usr/bin/emacs
warning: no package provides /usr/bin/emacs
$
Now consider shell script which invokes emacs. Depending on
/usr/lib/rpm/find-package peculiarities, there are two possible outcomes:
1) dependency on emacs is lost;
2) /usr/bin/emacs unmet dependency is generated.
I think that both variants are not quite acceptable.
Note that the root of the problem is that /usr/bin/emacs is not provided
by any package. Also note that /usr/bin/emacs is really an alternative:
$ ls -l /usr/bin/emacs
lrwxrwxrwx 1 root root 38 Jul 5 2006 /usr/bin/emacs -> /etc/alternatives/links/|usr|bin|emacs
$
The idea is that we can process the alternatives/packages.d/ file
and automatically provide paths under /usr/bin and /usr/sbin.
$ grep /usr/bin/ /etc/alternatives/packages.d/emacs22-nox
/usr/bin/emacs22 /usr/bin/emacs22-nox 10
/usr/bin/emacs /usr/bin/emacs22-nox 10
$ alternatives/alternatives.prov /etc/alternatives/packages.d/emacs22-nox
/usr/bin/emacs22
/usr/bin/emacs
$
Also note that there are a few other similar cases:
$ rpm -q --whatprovides /usr/bin/javac
warning: no package provides /usr/bin/javac
$ rpm -q --whatprovides `realpath /usr/bin/javac`
j2se1.5-sun-devel-1.5.0_11-alt1
$
diff --git a/alternatives.spec b/alternatives.spec
index ef2f759..327de0d 100644
--- a/alternatives.spec
+++ b/alternatives.spec
@@ -62,6 +62,9 @@ cat >$RPM_BUILD_ROOT%_sysconfdir/rpm/macros.d/%name<<EOF
%%preun_remove_alts %%preun_remove_alternatives
EOF
+install -pD -m755 alternatives.prov %buildroot%_rpmlibdir/alternatives.prov
+install -pD -m755 alternatives.prov.files %buildroot%_rpmlibdir/alternatives.prov.files
+
%post
%_bindir/%name-upgrade
%_bindir/%name-update
@@ -75,6 +78,8 @@ chmod 644 /etc/alternatives/packages.d/* 2>/dev/null ||:
%_sbindir/*
%_datadir/%name
%_man1dir/*
+%_rpmlibdir/alternatives.prov
+%_rpmlibdir/alternatives.prov.files
%changelog
* Thu Feb 01 2007 Stanislav Ievlev <inger на altlinux> 0.3-alt1
diff --git a/alternatives/alternatives.prov b/alternatives/alternatives.prov
new file mode 100755
index 0000000..e7e7e58
--- /dev/null
+++ b/alternatives/alternatives.prov
@@ -0,0 +1,11 @@
+#!/bin/sh -efu
+
+. /usr/lib/rpm/functions
+
+AlternativesProv()
+{
+ local f="$1"; shift
+ awk '$1 ~ /^\/usr\/s?bin\// {print $1}' "$f"
+}
+
+ArgvFileAction AlternativesProv "$@"
diff --git a/alternatives/alternatives.prov.files b/alternatives/alternatives.prov.files
new file mode 100755
index 0000000..7b98b83
--- /dev/null
+++ b/alternatives/alternatives.prov.files
@@ -0,0 +1,5 @@
+#!/bin/sh -efu
+while IFS=$'\t' read -r f t; do
+ [ -z "${f##${RPM_BUILD_ROOT-}/etc/alternatives/packages.d/*}" ] &&
+ [ -z "${t##* text*}" ] && echo "$f" ||:
+done
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя : =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Тип : application/pgp-signature
Размер : 189 байтов
Описание: =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Url : <http://lists.altlinux.org/pipermail/devel/attachments/20070328/3888b72b/attachment-0001.bin>
Подробная информация о списке рассылки Devel