Hi, the attached patch (mostly) fixes bug #627179 [1]. Patch is against multistrap SVN head [2].
The patch misses one occurence of the bug, when multistrap looks at var/lib/dpkg/status looking for Source: headers only (ignoring Version: and Package:). Fixing that feels like beyond my perl skills, and I'm not sure that this whole part is required anyways (it's redandant with checking the downloaded .debs). For now I put a big Todo: comment on top. That said, for me the patch fixes the problem with missing sources for the multistrap.conf I test with. The patch also fixes another bug, not yet reported: multistrap could have fetched source packages versions that differ from the binary package versions. cheers, David [1] http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=627179 [2] http://www.emdebian.org/svn/current/host/trunk/multistrap/trunk -- GnuPG public key: http://dvdkhlng.users.sourceforge.net/dk.gpg Fingerprint: B17A DC95 D293 657B 4205 D016 7DEF 5323 C174 7D40
Index: multistrap =================================================================== --- multistrap (revision 8004) +++ multistrap (working copy) @@ -465,6 +465,28 @@ } } +sub get_corresponding_dsc { + my $debfile = shift; + my $ver=`LC_ALL=C dpkg -f $debfile Version`; + my $pkg=`LC_ALL=C dpkg -f $debfile Package`; + my $src=`LC_ALL=C dpkg -f $debfile Source`; + + chomp ($ver); + chomp ($pkg); + chomp ($src); + + if ($src =~ / \((.*)\)/) { + # source nanme contains an explicit version number in parens. use it. + $ver = $1; + $src =~ s/ \(.*\)//; + } elsif ($src eq "") { + # no 'Source:' line. use package name instead. + $src = $pkg + } + + return "${src}=${ver}"; +} + sub force_unpack { my (@limits) = @_; my %unpack=(); @@ -521,13 +543,9 @@ printf (_g("Using directory %s for unpacking operations\n"), $dir); foreach $deb (sort @archives) { printf (_g("I: Extracting %s...\n"), $deb); - my $ver=`LC_ALL=C dpkg -f ./${cachedir}archives/$deb Version`; my $pkg=`LC_ALL=C dpkg -f ./${cachedir}archives/$deb Package`; - my $src=`LC_ALL=C dpkg -f ./${cachedir}archives/$deb Source`; my $multi=`LC_ALL=C dpkg -f ./${cachedir}archives/$deb Multi-Arch`; - chomp ($ver); chomp ($pkg); - chomp ($src); chomp ($multi); if (($multi eq "foreign") or ($multi eq "allowed")) { $multi = ''; @@ -548,7 +566,7 @@ warn ("$msg\n"); $multi = ''; } - $src =~ s/ \(.*\)//; + my $src = get_corresponding_dsc "./${cachedir}archives/${deb}"; push @dsclist, $src; mkdir ("./tmp"); my $tmpdir = `mktemp -p ./tmp -d -t multistrap.XXXXXX`; @@ -760,7 +778,7 @@ next if (-d $file); next unless ($file =~ /\.deb$/); if (defined $sourcedir) { - my $srcname = `LC_ALL dpkg -f ${dir}${cachedir}archives/$file Source`; + my $srcname = get_corresponding_dsc "${dir}${cachedir}archives/$file"; chomp ($srcname); push @dsclist, $srcname; system ("mv ${dir}${cachedir}archives/$file $sourcedir/$file"); @@ -775,6 +793,12 @@ open (STATUS, "${dir}${dpkgdir}status"); my @lines=<STATUS>; close (STATUS); + # Todo: this is (still) broken: need to look at Package:, + # Version: and Source: to determine the correct .dsc name. + # look at get_corresponding_dsc() for details. Note + # however, that this code is somewhat redundant, since + # .dsc names are already determined from downloaded .deb + # files. foreach my $line (@lines) { if ($line =~ /^Source: (.*)$/) { my $c = $1;
pgp5Abi3WOkd2.pgp
Description: PGP signature