Package: devscripts
Version: 2.9.20
Severity: wishlist
Tags: patch
X-Premature-Optimization: true

Presently dd-list calls apt-cache once for each package name given,
but apt-cache can accept a large number of packages for each call.
Find attached a patch to implement this.  If need be, it would be easy
to add "xargs" if the commandline if the E2BIG limit is reached.  This
only yields about a 10% speedup (apt-cache is much slower than fork),
not nearly as much as I expected, but now I know a little more perl :)

--- /usr/bin/dd-list    2006-05-17 02:28:18.000000000 -0400
+++ /tmp/dd-list        2006-07-02 18:49:29.000000000 -0400
@@ -6,6 +6,8 @@
 # Based on a python implementation by Lars Wirzenius.
 # Copyright 2005 Lars Wirzenius, Joey Hess
 #
+# Premature optimization, Justin Pryzby, 2006.
+#
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
 # the Free Software Foundation; either version 2 of the License, or
@@ -25,30 +27,32 @@
 
 my $version='2.9.20';
 
-sub get_developers_given_package {
-       my $package_name=shift;
+sub get_developers {
+       my %ret;
        
        my $developer;
-       my $source_name;
+       my $source;
        my $uploaders;
        my @uploaders;
-       open (F, "apt-cache showsrc '$package_name' |");
+       open (F, "apt-cache showsrc @_ |");
        while (<F>) {
                chomp;
-               if (/^Maintainer: (.*)/) {
+               if (/^$/ && !defined $ret{$source}) {
+                       push @{$ret{$source}}, ($developer, @uploaders);
+               } elsif (/^Package: (.*)/) {
+                       $source=$1;
+                       $developer=undef;
+                       @uploaders=undef;
+               } elsif (/^Maintainer: (.*)/) {
                        $developer=$1;
-               }
-               elsif (/^Uploaders: (.*)/) {
+               } elsif (/^Uploaders: (.*)/) {
                        $uploaders=$1;
                        @uploaders = split /\s*,\s*/, $uploaders;
-                       
-               }
-               elsif (/^Package: (.*)/) {
-                       $source_name=$1;
                }
        }
+
        close F;
-       return ($developer, [EMAIL PROTECTED], $source_name);
+       return %ret;
 }
 
 sub parse_developer {
@@ -57,11 +61,9 @@
        my ($name, $domain)=$developer=~/^(.*)\s+<.*@(.*)>\s*$/i;
        if (defined $domain && $domain ne 'lists.debian.org') {
                return join " ", reverse split " ", $name;
-       }
-       elsif (defined $name) {
+       } elsif (defined $name) {
                return $name;
-       }
-       else {
+       } else {
                return $developer;
        }
 }
@@ -113,14 +115,11 @@
 
                if (/^Package:\s+(.*)$/m) {
                        $package=$1;
-               }
-               if (/^Source:\s+(.*)$/m) {
+               } elsif (/^Source:\s+(.*)$/m) {
                        $package=$1;
-               }
-               if (/^Maintainer:\s+(.*)$/m) {
+               } elsif (/^Maintainer:\s+(.*)$/m) {
                        $maintainer=$1;
-               }
-               if (/^Uploaders:\s+(.*)$/m) {
+               } elsif (/^Uploaders:\s+(.*)$/m) {
                        $uploaders=$1;
                        @uploaders = split /\s*,\s*/, $uploaders;
                }
@@ -132,14 +131,12 @@
                                        push @{$dict{$uploader}}, "$package 
(U)";
                                }
                        }
-               }
-               else {
+               } else {
                        print STDERR "E: parse error in stanza $.\n";
                        $errors=1;
                }
        }
-}
-else {
+} else {
        my @package_names;
        if ($use_stdin) {
                while (<>) {
@@ -148,24 +145,26 @@
                        s/\s+$//;
                        push @package_names, split ' ', $_;
                }
-       }
-       else {
+       } else {
                @[EMAIL PROTECTED];
        }
 
-       foreach my $package_name (@package_names) {
-               my ($developer, $uploaders, 
$source_name)=get_developers_given_package($package_name);
-               if (defined $developer) {
-                       push @{$dict{$developer}}, $source_name;
-                       if ($show_uploaders && @$uploaders) {
-                               foreach my $uploader (@$uploaders) {
-                                       push @{$dict{$uploader}}, "$source_name 
(U)";
-                               }
-                       }
-               }
-               else {
-                       print STDERR "E: Unknown package: $package_name\n";
+       my %developers=get_developers(@package_names);
+       foreach my $p (keys %developers) {
+               my $main=$developers{$p}[0];
+
+               if ($main=~/^$/) {
+                       print STDERR "E: Unknown package: $p\n";
                        $errors=1;
+                       next;
+               }
+
+               push @{$dict{$main}}, $p;
+
+               if ($show_uploaders && defined $developers{$p}[1]) {
+                       foreach my $uploader ($developers{$p}[1]) {
+                               push @{$dict{$uploader}}, "$p (U)";
+                       }
                }
        }
 }


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

Reply via email to