* [devel] symlinks.req: semi-unmets @ 2007-08-06 22:20 Alexey Tourbin 2007-08-06 23:34 ` Alexey Tourbin ` (2 more replies) 0 siblings, 3 replies; 6+ messages in thread From: Alexey Tourbin @ 2007-08-06 22:20 UTC (permalink / raw) To: ALT Devel discussion list [-- Attachment #1: Type: text/plain, Size: 2068 bytes --] On Mon, Aug 06, 2007 at 03:08:04PM +0400, Alexey Tourbin wrote: > On Sat, Aug 04, 2007 at 01:41:56AM +0400, Dmitry V. Levin wrote: > > Свою долю критики за неожиданные зависимости ты ещё получишь, не стоит > > беспокоиться. > > Кстати, только что обнаружил пример необходимости symlinks.req. [...] > То есть не хватает зависимости на consolehelper. Правда, не факт > что symlinks.req сможет проставить именно зависимость на > consolehelper, т.к. find-package работает по очень урезанному > contents_index. В худшем случае появится "полу-unmet" на > /usr/lib/consolehelper/helper. Вот что теперь вылезает на openssl: $ rpm -qpR libssl6-0.9.8d-alt3.athlon.rpm |grep /usr/share/ /usr/share/ca-certificates/ca-bundle.crt $ rpm -qlvp libssl6-0.9.8d-alt3.athlon.rpm |grep /usr/share/ca- lrwxrwxrwx 1 root root 48 Aug 7 01:42 /var/lib/ssl/cert.pem -> ../../../usr/share/ca-certificates/ca-bundle.crt $ Это тот самый symlinks.req, которые добавляет зависимости на битые симлинки. The following packages have unmet dependencies: libssl6: Depends: /usr/share/ca-certificates/ca-bundle.crt but it is not installable ЗАОСТРЯЮ ПРОБЛЕМУ "ПОЛУ-АНМЕТОВ". Это проблема проявляется тогда, когда зависимость имеет вид /ПУТЬ, но у соответствующего пакета не стоит Provides: /ПУТЬ. На уровне rpm это не является unmet'ом: если при установке пакета с такой зависимостью имеется какой-либо другой пакет с файлом /ПУТЬ, то для rpm это "канает". С другой стороны, apt видит такую зависимость именно как unmet. Вообще-то у апта к каждому пакету есть файловые листы, и он использует их для разрешения такого рода зависимостей. Но при изготовлении репозитария аптовые листы у нас насильно "оптимизируются". Два простых варианта решения это проблемы: 1) Генерировать более полный content_index для hasher, чтобы любой путь более гарантированно трансформировался в название пакета (насколько более полный/гарантированно?). 2) Восстановить файловые листы для апт. Насколько потяжелеет pkglist.classic.bz2? [-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --] ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [devel] symlinks.req: semi-unmets 2007-08-06 22:20 [devel] symlinks.req: semi-unmets Alexey Tourbin @ 2007-08-06 23:34 ` Alexey Tourbin 2007-08-10 8:21 ` Alexey Tourbin 2007-08-11 16:26 ` Alexey Tourbin 2007-08-11 19:07 ` Alexey Tourbin 2 siblings, 1 reply; 6+ messages in thread From: Alexey Tourbin @ 2007-08-06 23:34 UTC (permalink / raw) To: ALT Devel discussion list [-- Attachment #1: Type: text/plain, Size: 1839 bytes --] On Tue, Aug 07, 2007 at 02:20:48AM +0400, Alexey Tourbin wrote: > ЗАОСТРЯЮ ПРОБЛЕМУ "ПОЛУ-АНМЕТОВ". > > > Это проблема проявляется тогда, когда зависимость имеет вид /ПУТЬ, > но у соответствующего пакета не стоит Provides: /ПУТЬ. На уровне > rpm это не является unmet'ом: если при установке пакета с такой > зависимостью имеется какой-либо другой пакет с файлом /ПУТЬ, > то для rpm это "канает". > > С другой стороны, apt видит такую зависимость именно как unmet. > Вообще-то у апта к каждому пакету есть файловые листы, и он использует > их для разрешения такого рода зависимостей. Но при изготовлении > репозитария аптовые листы у нас насильно "оптимизируются". > > Два простых варианта решения это проблемы: > > 1) Генерировать более полный content_index для hasher, чтобы любой путь > более гарантированно трансформировался в название пакета (насколько > более полный/гарантированно?). > > 2) Восстановить файловые листы для апт. Насколько потяжелеет > pkglist.classic.bz2? Если мыслей нет, то утро вечера мудренее. Пока есть только идея захачить hsh-sh-cache-contents-functions, чтобы он изготовлял contents_index_all.gz. Кстати, там есть ошибочка, из-за которой дупы могут не отлавливаться. $ grep /sbin/ifup build/cache/contents/contents_index_bin /sbin/ifup etcnet /sbin/ifup net-scripts $ Это потому что net-scripts из i586 а etcnet из noarch. --- /usr/bin/hsh-sh-cache-contents-functions- 2007-06-16 13:11:39 +0000 +++ /usr/bin/hsh-sh-cache-contents-functions 2007-08-06 23:29:22 +0000 @@ -195,6 +195,8 @@ create_contents() Fatal 'Failed to create contents index.' fi + sort -u -o "$contents" "$contents" + if ! LC_COLLATE=C prepare_contents "$tmpdir" >"$contents_index_bin"; then rm -rf "$tmpdir" Fatal 'Failed to prepare contents index.' [-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --] ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [devel] symlinks.req: semi-unmets 2007-08-06 23:34 ` Alexey Tourbin @ 2007-08-10 8:21 ` Alexey Tourbin 0 siblings, 0 replies; 6+ messages in thread From: Alexey Tourbin @ 2007-08-10 8:21 UTC (permalink / raw) To: ALT Devel discussion list [-- Attachment #1: Type: text/plain, Size: 2332 bytes --] On Tue, Aug 07, 2007 at 03:34:49AM +0400, Alexey Tourbin wrote: > On Tue, Aug 07, 2007 at 02:20:48AM +0400, Alexey Tourbin wrote: > > ЗАОСТРЯЮ ПРОБЛЕМУ "ПОЛУ-АНМЕТОВ". > > > > > > Это проблема проявляется тогда, когда зависимость имеет вид /ПУТЬ, > > но у соответствующего пакета не стоит Provides: /ПУТЬ. На уровне > > rpm это не является unmet'ом: если при установке пакета с такой > > зависимостью имеется какой-либо другой пакет с файлом /ПУТЬ, > > то для rpm это "канает". > > > > С другой стороны, apt видит такую зависимость именно как unmet. > > Вообще-то у апта к каждому пакету есть файловые листы, и он использует > > их для разрешения такого рода зависимостей. Но при изготовлении > > репозитария аптовые листы у нас насильно "оптимизируются". > > > > Два простых варианта решения это проблемы: > > > > 1) Генерировать более полный content_index для hasher, чтобы любой путь > > более гарантированно трансформировался в название пакета (насколько > > более полный/гарантированно?). > > > > 2) Восстановить файловые листы для апт. Насколько потяжелеет > > pkglist.classic.bz2? > > Если мыслей нет, то утро вечера мудренее. Пока есть только идея > захачить hsh-sh-cache-contents-functions, чтобы он изготовлял > contents_index_all.gz. Предварительная реализация и тестирование contents_index_all.gz выявило вот какую проблему. При сборке startup: shell.req: /usr/src/tmp/startup-buildroot/etc/rc.d/init.d/clock: checking contents_index_all for /etc/init.d/functions shell.req: /usr/src/tmp/startup-buildroot/etc/rc.d/init.d/clock: /etc/init.d/functions -> service (via rpmdb) Здесь проблема в том, что вместо ". /etc/rc.d/init.d/functions" там используется ". /etc/init.d/functions", и поиск сначала обламывается по contens_index_bin, потому что "нельзя понять", что /etc/init.d это симлинк на /etc/rc.d/init.d. Потом, соответственно, запускается "дорогой" поиск по contents_index_all, и опять обламывается. В конечном счёте происходит fallback на текущий rpmdb, который и дает результат. Если бы поиск по rpmdb ничего не дал, то получился бы "полу-анмет" на /etc/init.d/functions. В общем, идея contents_index довольно примитивна, она в принципе не учитывает симлинки при разрешении путей. А менее примитивные идеи с неизбежностью будут более сложными... [-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --] ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [devel] symlinks.req: semi-unmets 2007-08-06 22:20 [devel] symlinks.req: semi-unmets Alexey Tourbin 2007-08-06 23:34 ` Alexey Tourbin @ 2007-08-11 16:26 ` Alexey Tourbin 2007-08-11 19:07 ` Alexey Tourbin 2 siblings, 0 replies; 6+ messages in thread From: Alexey Tourbin @ 2007-08-11 16:26 UTC (permalink / raw) To: ALT Devel discussion list [-- Attachment #1.1: Type: text/plain, Size: 2515 bytes --] On Tue, Aug 07, 2007 at 02:20:48AM +0400, Alexey Tourbin wrote: > On Mon, Aug 06, 2007 at 03:08:04PM +0400, Alexey Tourbin wrote: > ЗАОСТРЯЮ ПРОБЛЕМУ "ПОЛУ-АНМЕТОВ". > > > Это проблема проявляется тогда, когда зависимость имеет вид /ПУТЬ, > но у соответствующего пакета не стоит Provides: /ПУТЬ. На уровне > rpm это не является unmet'ом: если при установке пакета с такой > зависимостью имеется какой-либо другой пакет с файлом /ПУТЬ, > то для rpm это "канает". > > С другой стороны, apt видит такую зависимость именно как unmet. > Вообще-то у апта к каждому пакету есть файловые листы, и он использует > их для разрешения такого рода зависимостей. Но при изготовлении > репозитария аптовые листы у нас насильно "оптимизируются". > > Два простых варианта решения это проблемы: > > 1) Генерировать более полный content_index для hasher, чтобы любой путь > более гарантированно трансформировался в название пакета (насколько > более полный/гарантированно?). > > 2) Восстановить файловые листы для апт. Насколько потяжелеет > pkglist.classic.bz2? Я немного захачил апт, но это всё равно как следует не работает, см. ниже. commit 30e27b0f1c74b4f67354a6035fae3e210131bca1 Author: Alexey Tourbin <at@altlinux> Date: Sat Aug 11 20:01:05 2007 +0400 apt-0.5.15lorg2-alt-genpkglist-reqfiles.patch genpkglist strips file lists by default (without --bloat option). It keeps only some "useful files" by using a few ad hoc patterns. This can break file-level dependencies. Consider pkgA requires /usr/lib/foo1/bar, and pkgB owns this file without explicitly providing it. Now if genpkglist strips /usr/lib/foo1/bar from pkgB file list, this is going to be an unmet dependency. This patch changes genpkglist behaviour, so that, when genpkglist is invoked without --bloat option, it first finds all file-level dependencies (something like "rpm -qaR |grep ^/"). This requires a separate pass. The list of file-level dependencies is saved into "reqfiles" global variable. And on the second (normal) pass, the function usefulFile() is modified to check the "reqfiles" variable; that is, it should keep a file in the file list if it's been required by some package in the repo. (Unfortunately, this patch does not solve all of the problems I want it to solve; we have separate repos for i586 and noarch -- inter-repo file-level dependencies cannot be resolved this way.) [-- Attachment #1.2: apt-0.5.15lorg2-alt-genpkglist-reqfiles.patch --] [-- Type: text/plain, Size: 3224 bytes --] --- apt-0.5.15lorg2/tools/genpkglist.cc- 2007-08-11 15:10:54 +0400 +++ apt-0.5.15lorg2/tools/genpkglist.cc 2007-08-11 19:36:03 +0400 @@ -18,6 +18,8 @@ #include <map> #include <iostream> +#include <tr1/unordered_set> + #include <apt-pkg/error.h> #include <apt-pkg/tagfile.h> #include <apt-pkg/configuration.h> @@ -77,20 +79,30 @@ typedef struct { string url; } UpdateInfo; +static std::tr1::unordered_set<std::string> reqfiles; -static inline int usefullFile(char *a) +static int usefulFile(const char *dir, const char *basename) { - int l = strlen(a); - - if (strstr(a, "bin") || strstr(a, "/etc") || strncmp(a, "/lib", 4) == 0) - return 1; - - if (l < 3) - return 0; + if (strstr(dir, "bin/")) + return 1; + if (strstr(dir, "/etc/")) + return 1; - if (strcmp(a + l - 3, ".so") == 0 - || strstr(a, ".so.")) - return 1; + const char *pos = strstr(basename, ".so"); + if (pos > basename) { + int c = pos[3]; + if (c == '.' || c == '\0') + return 1; + } + + if (reqfiles.size() > 0) { + char fullname[strlen(dir) + strlen(basename) + 1]; + strcpy(fullname, dir); + strcat(fullname, basename); + if (reqfiles.find(fullname) != reqfiles.end()) + return 2; + } + return 0; } @@ -133,9 +145,8 @@ static void copyStrippedFileList(Header { int ok = 0; - ok = usefullFile(basenames[i]); - if (!ok) - ok = usefullFile(dirnames[dirindexes[i]]); + ok = usefulFile(dirnames[dirindexes[i]], basenames[i]); + // if (ok > 1) cerr << "useful file: " << dirnames[dirindexes[i]] << basenames[i] <<endl; if (!ok) { int k = i; @@ -599,6 +610,40 @@ int main(int argc, char ** argv) int isSource; #endif + if (!fullFileList) { + // first pass: initialize reqfiles + for (entry_cur = 0; entry_cur < entry_no; entry_cur++) { + fd = fdOpen(dirEntries[entry_cur]->d_name, O_RDONLY, 0666); + if (!fd) + continue; + int rc; + Header h; +#if RPM_VERSION >= 0x040100 + rc = rpmReadPackageFile(ts, fd, dirEntries[entry_cur]->d_name, &h); + if (rc == RPMRC_OK || rc == RPMRC_NOTTRUSTED || rc == RPMRC_NOKEY) { +#else + rc = rpmReadPackageHeader(fd, &h, &isSource, NULL, NULL); + if (rc == 0) { +#endif + int reqtype; + const char **requires; + int nreq; + rc = headerGetEntry(h, RPMTAG_REQUIRENAME, &reqtype, (void**)&requires, &nreq); + if (rc == 1 && reqtype == RPM_STRING_ARRAY_TYPE) { + int i; + for (i = 0; i < nreq; i++) { + const char *req = requires[i]; + if (*req == '/') { + // cerr << dirEntries[entry_cur]->d_name << " requires " << req << endl; + reqfiles.insert(req); + } + } + } + headerFree(h); + } + Fclose(fd); + } + } for (entry_cur = 0; entry_cur < entry_no; entry_cur++) { struct stat sb; [-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --] ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [devel] symlinks.req: semi-unmets 2007-08-06 22:20 [devel] symlinks.req: semi-unmets Alexey Tourbin 2007-08-06 23:34 ` Alexey Tourbin 2007-08-11 16:26 ` Alexey Tourbin @ 2007-08-11 19:07 ` Alexey Tourbin 2007-08-13 10:12 ` Alexey Tourbin 2 siblings, 1 reply; 6+ messages in thread From: Alexey Tourbin @ 2007-08-11 19:07 UTC (permalink / raw) To: ALT Devel discussion list [-- Attachment #1: Type: text/plain, Size: 923 bytes --] On Tue, Aug 07, 2007 at 02:20:48AM +0400, Alexey Tourbin wrote: > $ rpm -qpR libssl6-0.9.8d-alt3.athlon.rpm |grep /usr/share/ > /usr/share/ca-certificates/ca-bundle.crt > $ rpm -qlvp libssl6-0.9.8d-alt3.athlon.rpm |grep /usr/share/ca- > lrwxrwxrwx 1 root root 48 Aug 7 01:42 /var/lib/ssl/cert.pem -> ../../../usr/share/ca-certificates/ca-bundle.crt > $ Захачка genpkglist (apt-utils, см. соседнее письмо) решает проблему с файловой зависмостью libssl6 -> /usr/share/ca-certificates/ca-bundle.crt -> ca-certificates ЕСЛИ пакеты libssl6 и ca-certificates находятся в одном репозитарии (например, как в RPMS.hasher). Но в сизифе они находятся в РАЗНЫХ репозитариях (соотв. i586 и noarch). Поэтому захачка genpkglist в данном случае ничего не даст. Проклятие какое-то, уже несколько мини-проблем обдумал и решил, но в целом это так и не закрывает окончательно проблему полу-анметов. [-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --] ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [devel] symlinks.req: semi-unmets 2007-08-11 19:07 ` Alexey Tourbin @ 2007-08-13 10:12 ` Alexey Tourbin 0 siblings, 0 replies; 6+ messages in thread From: Alexey Tourbin @ 2007-08-13 10:12 UTC (permalink / raw) To: ALT Devel discussion list [-- Attachment #1: Type: text/plain, Size: 472 bytes --] Мои письма в devel приходят с задержкой. Received: from master.altlinux.org (master.altlinux.org [62.118.250.235]) by lists.altlinux.org (Postfix) with ESMTP id BB5EA5963202 for <devel@lists.altlinux>; Mon, 13 Aug 2007 12:24:18 +0400 (MSD) Received: from solemn.turbinal (localhost.localdomain [127.0.0.1]) by master.altlinux.org (Postfix) with ESMTP id 01A95E41E4 for <devel@lists.altlinux>; Sat, 11 Aug 2007 23:07:19 +0400 (MSD) [-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --] ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2007-08-13 10:12 UTC | newest] Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2007-08-06 22:20 [devel] symlinks.req: semi-unmets Alexey Tourbin 2007-08-06 23:34 ` Alexey Tourbin 2007-08-10 8:21 ` Alexey Tourbin 2007-08-11 16:26 ` Alexey Tourbin 2007-08-11 19:07 ` Alexey Tourbin 2007-08-13 10:12 ` Alexey Tourbin
ALT Linux Team development discussions This inbox may be cloned and mirrored by anyone: git clone --mirror http://lore.altlinux.org/devel/0 devel/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 devel devel/ http://lore.altlinux.org/devel \ devel@altlinux.org devel@altlinux.ru devel@lists.altlinux.org devel@lists.altlinux.ru devel@linux.iplabs.ru mandrake-russian@linuxteam.iplabs.ru sisyphus@linuxteam.iplabs.ru public-inbox-index devel Example config snippet for mirrors. Newsgroup available over NNTP: nntp://lore.altlinux.org/org.altlinux.lists.devel AGPL code for this site: git clone https://public-inbox.org/public-inbox.git