This mail went to 408901 instead of 408091.

----- Forwarded message from Roger Leigh <[EMAIL PROTECTED]> -----

From: Roger Leigh <[EMAIL PROTECTED]>
To: Lucas Nussbaum <[EMAIL PROTECTED]>
Cc: Goswin von Brederlow <[EMAIL PROTECTED]>,
        Kurt Roeckx <[EMAIL PROTECTED]>, [EMAIL PROTECTED]
Date: Sat, 3 Feb 2007 22:21:58 +0000
Subject: Re: Bug#400112: [PROPOSAL] forbid source/binary package name conflicts

On Tue, Jan 23, 2007 at 01:57:19PM +0100, Lucas Nussbaum wrote:
> On 19/01/07 at 12:47 +0100, Goswin von Brederlow wrote:
> > Kurt Roeckx <[EMAIL PROTECTED]> writes:
> > 
> > > On Thu, Jan 18, 2007 at 03:12:12PM +0100, Goswin von Brederlow wrote:
> > >> 
> > >> In the initial report you mentioned that sbuild has a problem with
> > >> confusing names like this. Afaik sbuild solely works on source package
> > >> name and version and that is always unique. Where do you get a
> > >> conflict?
> > >
> > > It uses apt-cache to check for available versions, which as you show
> > > gives both results. And sbuild's behaviour depends on the order
> > > apt-cache returns those.
> > 
> > Reading the source sbuild is prepared to parse multiple returns from
> > apt-cache just fine. But it ignores the package name and only uses the
> > version to keep them apart.
> > 
> > So a case that would screw up sbuild would have to look something like
> > this:
> > 
> > Package: foo
> > Binary: bar, foo
> > Version: 1.2-3
> > 
> > Package: bar
> > Binary: bar
> > Version: 1.2-3
> > 
> > Too bad apt-cache doesn't have a --only-source option. Sbuild has to
> > use package name and version.
> > 
> > Something like this (untested):
> > 
> > Line 424...
> > 
> >                           while( <PIPE> ) {
> > +                                 $package = $1 if 
> > /^Package:\s+(\S+)\s*$/mi;
> >                                   $ver = $1 if /^Version:\s+(\S+)\s*$/mi;
> >                                   $tfile = $1 if 
> > /^Files:\s*\n((\s+.*\s*\n)+)/mi;
> >                           }
> > -                          if (defined $ver && defined $tfile) {
> > +                          if (defined $package && defined $ver && defined 
> > $tfile) {
> > -                                  @{$entries{$ver}} = map { (split( /\s+/, 
> > $_ ))[3] }
> > +                                  @{$entries{"$package $ver"}} = map { 
> > (split( /\s+/, $_ ))[3] }
> >                                           split( "\n", $tfile );
> >                           } else {
> >                                   print PLOG "apt-cache returned no 
> > information about $pkg source\n";
> >                                   print PLOG "Are there any deb-src lines 
> > in your /etc/apt/sources.list?\n";
> >                                   return ("ERROR");
> >                           }
> >                   }
> >                         close( PIPE );
> >                         if ($?) {
> >                                 print PLOG "$conf::apt_cache failed\n";
> >                                 return ("ERROR");
> >                         }
> > 
> > -                        if (!defined($entries{$version})) {
> > +                        if (!defined($entries{"$pkg $version"})) {

I have attached a tested version of this patch which fixes a bug in the
while loop.  This applies to the current SVN version of sbuild:

  svn://svn.debian.org/svn/buildd-tools/trunk/sbuild

but will also apply to the testing/unstable version.

> > But I don't yet see a problem here. The apt-cache check is purely
> > informational. As long as it finds an entry with the right version it
> > is happy and the "apt-get --only-source source" below that will always
> > do the right thing. So the worst you get is that the "Can't find
> > source" message is skipped and apt-get fails.
> > 
> > Or not?
> 
> No, the problem is that sbuild only keeps the *last* version it sees
> (see the while (<PIPE>) loop above). Anyway, that part is clearly an sbuild
> problem. See that log, after asking sbuild to build qd 2.1.200-1:

> Build started at 20070103-0339
> ******************************************************************************
> Checking available source versions...
> Checking available source versions...
> Can't find source for qd_2.1.200-1
> (only different version(s) 1.0.0-rc2-5 found)

  % sbuild -s -A qd_2.1.200-1

works for me, but I can't build kfolding:

  % sbuild -s -A kfolding_1.0.0-rc2-5

  Automatic build of kfolding_1.0.0-rc2-5 on hardknott by sbuild/powerpc 0.52
  Build started at 20070203-2218
  ******************************************************************************
  Checking available source versions...
  apt-cache returned no information about kfolding source
  Are there any deb-src lines in your /etc/apt/sources.list?
  ******************************************************************************
  Finished at 20070203-2218
  Build needed 00:00:00, 0k disk space

This is without the above patch applied.  After applying the patch, I
get:

  Automatic build of kfolding_1.0.0-rc2-5 on hardknott by sbuild/powerpc 0.52
  Build started at 20070203-2219
  ******************************************************************************
  Checking available source versions...
  Checking available source versions...
  Can't find source for kfolding_1.0.0-rc2-5
  ******************************************************************************
  Finished at 20070203-2219
  Build needed 00:00:00, 0k disk space

This fixes the while loop problem, but I've not yet figured out what's
still failing.


Regards,
Roger

-- 
  .''`.  Roger Leigh
 : :' :  Debian GNU/Linux             http://people.debian.org/~rleigh/
 `. `'   Printing on GNU/Linux?       http://gutenprint.sourceforge.net/
   `-    GPG Public Key: 0x25BFB848   Please GPG sign your mail.

Index: sbuild
===================================================================
--- sbuild      (revision 1075)
+++ sbuild      (working copy)
@@ -419,29 +419,32 @@
                                print PLOG "Can't open pipe to apt-cache: $!\n";
                                return ("ERROR");
                        }
-                       { local($/) = "";
-                         my $ver;
-                         my $tfile;
-                         while( <PIPE> ) {
-                                 $ver = $1 if /^Version:\s+(\S+)\s*$/mi;
-                                 $tfile = $1 if 
/^Files:\s*\n((\s+.*\s*\n)+)/mi;
-                         }
-                         if (defined $ver && defined $tfile) {
-                                 @{$entries{$ver}} = map { (split( /\s+/, $_ 
))[3] }
-                                         split( "\n", $tfile );
-                         } else {
-                                 print PLOG "apt-cache returned no information 
about $pkg source\n";
-                                 print PLOG "Are there any deb-src lines in 
your /etc/apt/sources.list?\n";
-                                 return ("ERROR");
-                         }
-                 }
-                       close( PIPE );
-                       if ($?) {
-                               print PLOG "$conf::apt_cache failed\n";
-                               return ("ERROR");
+                       {
+                               local($/) = "";
+                               my $ver;
+                               my $tfile;
+                               my $package;
+                               while( <PIPE> ) {
+                                       $package = $1 if 
/^Package:\s+(\S+)\s*$/mi;
+                                       $ver = $1 if /^Version:\s+(\S+)\s*$/mi;
+                                       $tfile = $1 if 
/^Files:\s*\n((\s+.*\s*\n)+)/mi;
+                                       if (defined $ver && defined $tfile && 
defined $package) {
+                                               @{$entries{"$package $ver"}} = 
map { (split( /\s+/, $_ ))[3] }
+                                                       split( "\n", $tfile );
+                                       } else {
+                                               print PLOG "apt-cache returned 
no information about $pkg source\n";
+                                               print PLOG "Are there any 
deb-src lines in your /etc/apt/sources.list?\n";
+                                               return ("ERROR");
+                                       }
+                               }
+
+                               close( PIPE );
+                               if ($?) {
+                                       print PLOG "$conf::apt_cache failed\n";
+                                       return ("ERROR");
+                               }
                        }
-                               
-                       if (!defined($entries{$version})) {
+                       if (!defined($entries{"$pkg $version"})) {
                                if (!$retried) {
                                        # try to update apt's cache if nothing 
found
                                        run_apt_command("$conf::apt_get", 
"update >/dev/null", "root", 0);




----- End forwarded message -----

-- 
| Lucas Nussbaum
| [EMAIL PROTECTED]   http://www.lucas-nussbaum.net/ |
| jabber: [EMAIL PROTECTED]             GPG: 1024D/023B3F4F |


-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to