The following commit has been merged in the master branch:
commit cdc65e24bb5ddc5f8393d6a01be88a987e645fed
Author: James McCoy <[email protected]>
Date:   Thu Oct 27 21:12:19 2011 -0400

    dd-list: Parse sources files directly instead of invoking apt-cache.
    
    Closes: #376595
    Signed-off-by: James McCoy <[email protected]>

diff --git a/debian/changelog b/debian/changelog
index b7ea90a..1620a3a 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -28,6 +28,8 @@ devscripts (2.11.2) UNRELEASED; urgency=low
     + Correctly handle maintainer names which have a comma.  (Closes: #646562)
     + Sort results by full-name instead of trying to parse the names.
       (Closes: #638602)
+    + Parse sources files directly instead of invoking apt-cache.  (Closes:
+      #376595)
 
   [ Stefano Rivera ]
   * debchange: Add precise as a recognised Ubuntu distro.
diff --git a/scripts/dd-list.pl b/scripts/dd-list.pl
index f25dc25..f6d19f0 100755
--- a/scripts/dd-list.pl
+++ b/scripts/dd-list.pl
@@ -3,6 +3,7 @@
 # dd-list: Generate a list of maintainers of packages.
 #
 # Written by Joey Hess <[email protected]>
+# Modifications by James McCoy <[email protected]>
 # Based on a python implementation by Lars Wirzenius.
 # Copyright 2005 Lars Wirzenius, Joey Hess
 #
@@ -20,36 +21,11 @@
 # along with this program. If not, see <http://www.gnu.org/licenses/>.
 
 use strict;
+use FileHandle;
 use Getopt::Long qw(:config gnu_getopt);
 
 my $version='###VERSION###';
 
-sub get_developers_given_package {
-       my ($package_name,$print_binary) = @_;
-
-       my $developer;
-       my $print_name;
-       my $uploaders;
-       my @uploaders;
-       open (F, "apt-cache showsrc '$package_name' |");
-       while (<F>) {
-               chomp;
-               if (/^Maintainer:\s+(.*)/) {
-                       $developer=$1;
-               }
-               elsif (/^Uploaders:\s+(.*)/) {
-                       $uploaders=$1;
-                       @uploaders = split /(?<=>)\s*,\s*/, $uploaders;
-
-               }
-               elsif (/^Package:\s+(.*)/) {
-                       $print_name = $print_binary ? $package_name : $1 ;
-               }
-       }
-       close F;
-       return ($developer, \@uploaders, $print_name);
-}
-
 sub sort_developers {
     return map { $_->[0] }
           sort { $a->[1] cmp $b->[1] }
@@ -78,7 +54,7 @@ Usage: dd-list [options] [package ...]
 
     -b, --print-binary
         If binary package names are given as input, print these names
-       in the output instead of corresponding source packages.
+        in the output instead of corresponding source packages.
 
     -V, --version
         Print version (it\'s $version by the way).
@@ -89,92 +65,104 @@ my $use_stdin=0;
 my $use_dctrl=0;
 my $show_uploaders=1;
 my $print_binary=0;
-if (! GetOptions(
-       "help" => sub { help(); exit },
-       "stdin|i" => \$use_stdin,
-       "dctrl|d" => \$use_dctrl,
-       "uploaders|u!" => \$show_uploaders,
-       "print-binary|b" => \$print_binary,
-       "version" => sub { print "dd-list version $version\n" })) {
-       exit(1);
-}
+GetOptions(
+    "help" => sub { help(); exit },
+    "stdin|i" => \$use_stdin,
+    "dctrl|d" => \$use_dctrl,
+    "uploaders|u!" => \$show_uploaders,
+    "print-binary|b" => \$print_binary,
+    "version" => sub { print "dd-list version $version\n" })
+or do {
+    help();
+    exit(1);
+};
 
 my %dict;
 my $errors=0;
+my %package_name;
 
-if ($use_dctrl) {
-       local $/="\n\n";
-       while (<>) {
-               my ($package, $maintainer, $uploaders, @uploaders);
-
-               if (/^Package:\s+(.*)$/m) {
-                       $package=$1;
-               }
-               if (/^Source:\s+(.*)$/m && ! $print_binary ) {
-                       $package=$1;
-               }
-               if (/^Maintainer:\s+(.*)$/m) {
-                       $maintainer=$1;
-               }
-               if (/^Uploaders:\s+(.*)$/m) {
-                       $uploaders=$1;
-                       @uploaders = split /(?<=>)\s*,\s*/, $uploaders;
-               }
+sub parsefh
+{
+    my ($fh, $fname, $check_package) = @_;
+    local $/="\n\n";
+    while (<$fh>) {
+       my ($package, $maintainer, $uploaders, @uploaders);
 
-               if (defined $maintainer && defined $package) {
-                       push @{$dict{$maintainer}}, $package;
-                       if ($show_uploaders && defined $uploaders) {
-                               foreach my $uploader (@uploaders) {
-                                       push @{$dict{$uploader}}, "$package 
(U)";
-                               }
-                       }
-               }
-               else {
-                       print STDERR "E: parse error in stanza $.\n";
-                       $errors=1;
-               }
+       if (/^Package:\s+(.*)$/m) {
+           $package=$1;
        }
-}
-else {
-       my @package_names;
-       if ($use_stdin) {
-               while (<>) {
-                       chomp;
-                       s/^\s+//;
-                       s/\s+$//;
-                       push @package_names, split ' ', $_;
+       if (/^Source:\s+(.*)$/m && ! $print_binary ) {
+           $package=$1;
+       }
+       if (/^Maintainer:\s+(.*)$/m) {
+           $maintainer=$1;
+       }
+       if (/^Uploaders:\s+(.*)$/m) {
+           $uploaders=$1;
+           @uploaders = split /(?<=>)\s*,\s*/, $uploaders;
+       }
+
+       if (defined $maintainer && defined $package) {
+           if ($check_package && !exists $package_name{$package}) {
+               next;
+           }
+           push @{$dict{$maintainer}}, $package;
+           if ($show_uploaders && defined $uploaders) {
+               foreach my $uploader (@uploaders) {
+                   push @{$dict{$uploader}}, "$package (U)";
                }
+           }
        }
        else {
-               @package_names=@ARGV;
+           warn "E: parse error in stanza $. of $fname\n";
+           $errors=1;
        }
+    }
+}
 
-       foreach my $package_name (@package_names) {
-               my ($developer, $uploaders, 
$print_name)=get_developers_given_package($package_name,$print_binary);
-               if (defined $developer) {
-                       push @{$dict{$developer}}, $print_name;
-                       if ($show_uploaders && @$uploaders) {
-                               foreach my $uploader (@$uploaders) {
-                                       push @{$dict{$uploader}}, "$print_name 
(U)";
-                               }
-                       }
-               }
-               else {
-                       print STDERR "E: Unknown package: $package_name\n";
-                       $errors=1;
-               }
+if ($use_dctrl) {
+    parsefh(\*STDIN, 'STDIN');
+}
+else {
+    if ($use_stdin) {
+       while (<STDIN>) {
+           chomp;
+           s/^\s+//;
+           s/\s+$//;
+           map { $package_name{lc($_)} = 1 } split ' ', $_;
        }
+    }
+    else {
+       map { $package_name{lc($_)} = 1 } @ARGV;
+    }
+
+    foreach my $source (glob('/var/lib/apt/lists/*_source_Sources')) {
+       my $fh = FileHandle->new("<$source");
+       unless (defined $fh) {
+           warn "E: Couldn't open $fh\n";
+           $errors = 1;
+           next;
+       }
+       parsefh($fh, $source, 1);
+       $fh->close;
+    }
 }
 
 foreach my $developer (sort_developers(keys %dict)) {
-       print "$developer\n";
-       my %seen;
-       foreach my $package (sort @{$dict{$developer}}) {
-               next if $seen{$package};
-               $seen{$package}=1;
-               print "   $package\n";
-       }
-       print "\n";
+    print "$developer\n";
+    my %seen;
+    foreach my $package (sort @{$dict{$developer}}) {
+       $package_name{$package}--;
+       next if $seen{$package};
+       $seen{$package}=1;
+       print "   $package\n";
+    }
+    print "\n";
+}
+
+foreach my $package (grep { $package_name{$_} > 0 } keys %package_name) {
+    warn "E: Unknown package: $package\n";
+    $errors = 1;
 }
 
 exit($errors);

-- 
Git repository for devscripts


-- 
To unsubscribe, send mail to [email protected].

Reply via email to