[SCM] Git repository for devscripts branch, master, updated. v2.11.9-10-ga2286a5

James McCoy jamessan at debian.org
Sat Jun 30 15:07:57 UTC 2012


The following commit has been merged in the master branch:
commit a2286a56712b8da7eb10e817bd933ad981bf834f
Author: James McCoy <jamessan at debian.org>
Date:   Sat Jun 30 11:06:34 2012 -0400

    Devscripts/Package{s,Deps}: Make functions Multi-Arch aware.
    
    Closes: #664811
    Signed-off-by: James McCoy <jamessan at debian.org>

diff --git a/Devscripts/PackageDeps.pm b/Devscripts/PackageDeps.pm
index 5236d7e..c744eb0 100644
--- a/Devscripts/PackageDeps.pm
+++ b/Devscripts/PackageDeps.pm
@@ -49,8 +49,17 @@ sub new ($$)
     return $self;
 }
 
+# Internal functions
 
-# Internal function
+my $multiarch;
+
+sub multiarch ()
+{
+    if (!defined $multiarch) {
+	$multiarch = (system('dpkg --assert-multi-arch >/dev/null 2>&1') >> 8) == 0;
+    }
+    return $multiarch;
+}
 
 sub parse ($$)
 {
@@ -95,6 +104,11 @@ sub parse ($$)
 	}
 
 	$self->{$pkg} = \@deps;
+	if ($ctrl->{Architecture} ne 'all' && multiarch) {
+	    my $arch = $ctrl->{Architecture};
+	    @deps = map { "$_:$arch" } @deps;
+	    $self->{"$pkg:$arch"} = \@deps;
+	}
 	undef $ctrl;
     }
     close PACKAGE_FILE or
diff --git a/Devscripts/Packages.pm b/Devscripts/Packages.pm
index 863ceb3..90ff36d 100644
--- a/Devscripts/Packages.pm
+++ b/Devscripts/Packages.pm
@@ -61,6 +61,16 @@ the corresponding source packages as well in the list.
 
 =cut
 
+my $multiarch;
+
+sub multiarch ()
+{
+    if (!defined $multiarch) {
+	$multiarch = (system('dpkg --assert-multi-arch >/dev/null 2>&1') >> 8) == 0;
+    }
+    return $multiarch;
+}
+
 # input: a list of packages names.
 # output: list of files they contain.
 
@@ -148,69 +158,66 @@ sub FilesToPackages (@)
 
 
     my %packages=();
-    my ($curfile, $pkgfrom);
-    undef $pkgfrom;
-    $curfile = shift;
-
-    foreach (@dpkg_out) {
-	# We want to handle diversions nicely.
-	# Ignore local diversions
-	if (/^local diversion from: /) {
-	    # Do nothing
-	}
-	elsif (/^local diversion to: (.+)$/) {
-	    if ($curfile eq $1) {
-		$curfile = shift;
+    foreach my $curfile (@_) {
+	my $pkgfrom;
+	foreach my $line (@dpkg_out) {
+	    # We want to handle diversions nicely.
+	    # Ignore local diversions
+	    if ($line =~ /^local diversion from: /) {
+		# Do nothing
 	    }
-	}
-	elsif (/^diversion by (\S+) from: (.+)$/) {
-	    if ($curfile eq $2) {
-		# So the file we're looking has been diverted
-		$pkgfrom=$1;
+	    elsif ($line =~ /^local diversion to: (.+)$/) {
+		if ($curfile eq $1) {
+		    last;
+		}
 	    }
-	}
-	elsif (/^diversion by (\S+) to: (.+)$/) {
-	    if ($curfile eq $2) {
-		# So the file we're looking is a diverted file
-		# We shouldn't see it again
-		$packages{$1} = 1;
-		$curfile = shift;
+	    elsif ($line =~ /^diversion by (\S+) from: (.+)$/) {
+		if ($curfile eq $2) {
+		    # So the file we're looking has been diverted
+		    $pkgfrom=$1;
+		}
 	    }
-	}
-	elsif (/^dpkg: \Q$curfile\E not found\.$/) {
-	    $curfile = shift;
-	}
-	elsif (/^dpkg-query: no path found matching pattern \Q$curfile\E\.$/) {
-	    $curfile = shift;
-	}
-	elsif (/^(.*): \Q$curfile\E$/) {
-	    my @pkgs = split /,\s+/, $1;
-	    if (@pkgs == 1 || !grep /:/, @pkgs) {
-		# Only one package, or all Multi-Arch packages
-		map { $packages{$_} = 1 } @pkgs;
+	    elsif ($line =~ /^diversion by (\S+) to: (.+)$/) {
+		if ($curfile eq $2) {
+		    # So the file we're looking is a diverted file
+		    # We shouldn't see it again
+		    $packages{$1} = 1;
+		    last;
+		}
 	    }
-	    else {
-		# We've got a file which has been diverted by some package
-		# or is Multi-Arch and so is listed in two packages.  If it
-		# was diverted, the *diverting* package is the one with the
-		# file that was actually used.
-		my $found=0;
-		foreach my $pkg (@pkgs) {
-		    if ($pkg eq $pkgfrom) {
-			$packages{$pkgfrom} = 1;
-			$found=1;
-			last;
-		    }
+	    elsif ($line =~ /^dpkg: \Q$curfile\E not found\.$/) {
+		last;
+	    }
+	    elsif ($line =~ /^dpkg-query: no path found matching pattern \Q$curfile\E\.$/) {
+		last;
+	    }
+	    elsif ($line =~ /^(.*): \Q$curfile\E$/) {
+		my @pkgs = split /,\s+/, $1;
+		if (@pkgs == 1 || !grep /:/, @pkgs) {
+		    # Only one package, or all Multi-Arch packages
+		    map { $packages{$_} = 1 } @pkgs;
 		}
-		if (! $found) {
-		    carp("Something wicked happened to the output of dpkg -S $curfile");
+		else {
+		    # We've got a file which has been diverted by some package
+		    # or is Multi-Arch and so is listed in two packages.  If it
+		    # was diverted, the *diverting* package is the one with the
+		    # file that was actually used.
+		    my $found=0;
+		    foreach my $pkg (@pkgs) {
+			if ($pkg eq $pkgfrom) {
+			    $packages{$pkgfrom} = 1;
+			    $found=1;
+			    last;
+			}
+		    }
+		    if (! $found) {
+			carp("Something wicked happened to the output of dpkg -S $curfile");
+		    }
 		}
+		# Prepare for the next round
+		last;
 	    }
-	    # Prepare for the next round
-	    $curfile = shift;
-	    undef $pkgfrom;
 	}
-
     }
 
     return keys %packages;
@@ -232,6 +239,9 @@ sub PackagesMatch ($)
 	   && $ctrl->parse(\*STATUS, '/var/lib/dpkg/status')) {
 	if ("$ctrl" =~ m/$match/m) {
 	    my $package = $ctrl->{Package};
+	    if ($ctrl->{Architecture} ne 'all' && multiarch) {
+		$package .= ":$ctrl->{Architecture}";
+	    }
 	    push @matches, $package;
 	}
 	undef $ctrl;
@@ -264,6 +274,9 @@ sub InstalledPackages ($)
 	}
 	if (exists $ctrl->{Package}) {
 	    $matches{$ctrl->{Package}} = 1;
+	    if ($ctrl->{Architecture} ne 'all' && multiarch) {
+		$matches{"$ctrl->{Package}:$ctrl->{Architecture}"} = 1;
+	    }
 	}
 	undef $ctrl;
     }
diff --git a/debian/changelog b/debian/changelog
index 88d1212..ae1e141 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -17,8 +17,10 @@ devscripts (2.11.10) UNRELEASED; urgency=low
     + Unset wget's continue option to ensure the bug list is properly
       downloaded.  (Closes: #677229)
     + Handle rc bugs assigned to source packages.  (Closes: #576853)
-  * Devscripts/Packages.pm, Devscripts/PackageDeps.pm: Parse dpkg's status
-    file using Dpkg::Control.
+  * Devscripts/Packages.pm, Devscripts/PackageDeps.pm:
+    + Parse dpkg's status file using Dpkg::Control.
+    + Make functions Multi-Arch aware so they can handle $pkg:$arch naming.
+      (Closes: #664811)
 
  -- Benjamin Drung <bdrung at debian.org>  Sun, 17 Jun 2012 23:33:41 +0200
 

-- 
Git repository for devscripts



More information about the devscripts-devel mailing list