[devel] rpmlib(...) & apt
Alexey Tourbin
=?iso-8859-1?q?at_=CE=C1_altlinux=2Eru?=
Вс Июл 20 15:34:42 MSD 2008
On Sun, Jul 20, 2008 at 03:18:48PM +0400, Alexander Bokovoy wrote:
> > Я утверждаю, что lzma ничего не сломал.
> >
> > Была только тонкость с обновлением rpm (нужно перегенерировать или
> > удалить кеш апта), но мы эту тонкость добили.
> Апгрейд сизифа месячной давности до текущего все равно приводит к
> тому, что нужно совершать пассы с --reinstall, иначе все пакеты,
> перепакованные с lzma не устанавливаются, а kept back. Причем, не
> apt-get --reinstall update, а с apt-get dist-upgrade --reinstall, а то
> и другие варианты.
Нет, ты чего-то не понял. Проблема в кеше апта, а именно, в том,
что все зависимости вида 'rpmlib(...)' на самом деле *удаляются*
вообще из кеша апта при его генерации и дальше никак не участвуют
в разрешении зависимостей. При этом удаление из кеша зависимостей
rpmlib(...) происходит на основе вызова rpmCheckRpmlibProvides()
из *текущей* библиотеки librpm (установленной в хост-системе).
apt/apt-pkg/rpm/rpmlistparser.cc:
429 if (namel[i][0] == 'r' && strncmp(namel[i], "rpmlib", 6) == 0)
430 {
431 #if RPM_VERSION >= 0x040404
432 rpmds rpmlibProv = NULL;
433 rpmds ds = rpmdsSingle(RPMTAG_PROVIDENAME,
434 namel[i], verl?verl[i]:NULL, flagl[i]);
435 rpmdsRpmlib(&rpmlibProv, NULL);
436 int res = rpmdsSearch(rpmlibProv, ds) >= 0;
437 rpmdsFree(ds);
438 rpmdsFree(rpmlibProv);
439 #elif RPM_VERSION >= 0x040100
440 rpmds ds = rpmdsSingle(RPMTAG_PROVIDENAME,
441 namel[i], verl?verl[i]:NULL, flagl[i]);
442 int res = rpmCheckRpmlibProvides(ds);
443 rpmdsFree(ds);
444 #else
445 int res = rpmCheckRpmlibProvides(namel[i], verl?verl[i]:NULL,
446 flagl[i]);
447 #endif
448 if (res) continue;
449 }
В строке 448 зависимость rpmlib(...) игнорируется, если она разрешена
относительно установленной библиотеки librpm.
После обновления librpm нужно перегенерировать (или просто удалить)
кеш апт, чтобы в новом кеше игнорировались в том числе и новые
зависимости rpmlib(...), предоставляемые новой библиотекой librpm.
> Решением это слабо можно назвать.
Любая новая фича rpm, выраженная в зависимостях вида rpmlib(...),
вызовет точно такую же проблему у апта. На самом деле я считаю это
определнной кривизной апта.
Решение же абсолютно правильное -- либо запустить "странную команду",
которая перегенерирует кеш апта, либо просто удалить кеш вручную --
rm -f /var/cache/apt/*.bin
apt/apt-pkg/pkgcachegen.cc:
600 /* This just verifies that each file in the list of index files exists,
601 has matching attributes with the cache and the cache does not have
602 any extra files. */
603 static bool CheckValidity(string CacheFile, FileIterator Start,
604 FileIterator End,MMap **OutMap = 0)
605 {
606 // No file, certainly invalid
607 if (CacheFile.empty() == true || FileExists(CacheFile) == false)
608 return false;
609
610 // CNC:2003-02-20 - When --reinstall is used during a cache building
611 // process, the algorithm is sligthly changed to
612 // order the "better" architectures before, even if
613 // they are already in the system. Thus, we rebuild
614 // the cache when it's used.
615 bool ReInstall = _config->FindB("APT::Get::ReInstall", false);
616 if (ReInstall == true)
617 return false;
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя : =?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/20080720/604d3793/attachment-0002.bin>
Подробная информация о списке рассылки Devel