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]