ALT Linux Team development discussions
 help / color / mirror / Atom feed
* [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