[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

[PATCH] fix #627179 (multistrap misses some source packages)



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;

Attachment: pgpMy1csfTTVy.pgp
Description: PGP signature


Reply to: