my $tmaint = defined($maintainer{$pkg}) ? $maintainer{$pkg} : '(unknown)';
my $tsrc = defined($pkgsrc{$pkg}) ? $pkgsrc{$pkg} : '(unknown)';
- $descriptivehead .= "Maintainer for $pkg is\n".
- '<a href="'.mainturl($tmaint).'">'.htmlsanit($tmaint).'</a>';
+ $descriptivehead .=
+ htmlmaintlinks(sub { $_[0] == 1 ? "Maintainer for $pkg is\n"
+ : "Maintainers for $pkg are\n" },
+ $tmaint);
$descriptivehead .= ";\nSource for $pkg is\n".
'<a href="'.srcurl($tsrc)."\">$tsrc</a>" if ($tsrc ne "(unknown)");
$descriptivehead .= ".\n<br>";
use DB_File;
use Fcntl qw/O_RDONLY/;
+use Mail::Address;
$config_path = '/etc/debbugs';
$lib_path = '/usr/lib/debbugs';
require "$lib_path/errorlib";
return map lc, split /[ \t?,()]+/, $pkgs;
}
+my %_parsedaddrs;
+sub getparsedaddrs {
+ my $addr = shift;
+ return () unless defined $addr;
+ return @{$_parsedaddrs{$addr}} if exists $_parsedaddrs{$addr};
+ @{$_parsedaddrs{$addr}} = Mail::Address->parse($addr);
+ return @{$_parsedaddrs{$addr}};
+}
+
# Generate a comma-separated list of HTML links to each package given in
# $pkgs. $pkgs may be empty, in which case an empty string is returned, or
# it may be a comma-separated list of package names.
) . ";\n";
}
+# Generate a comma-separated list of HTML links to each maintainer given in
+# $maints, which should be a comma-separated list of RFC822 addresses.
+sub htmlmaintlinks {
+ my ($prefixfunc, $maints) = @_;
+ if (defined $maints and $maints ne '') {
+ my @maintaddrs = getparsedaddrs($maints);
+ my $prefix = (ref $prefixfunc) ? $prefixfunc->(scalar @maintaddrs)
+ : $prefixfunc;
+ return $prefix .
+ join ', ', map { sprintf '<a href="%s">%s</a>',
+ mainturl($_->address),
+ htmlsanit($_->format) || '(unknown)'
+ } @maintaddrs;
+ } else {
+ my $prefix = (ref $prefixfunc) ? $prefixfunc->(1) : $prefixfunc;
+ return sprintf '%s<a href="%s">(unknown)</a>', $prefix, mainturl('');
+ }
+}
+
sub htmlindexentry {
my $ref = shift;
my %status = %{getbugstatus($ref)};
$note .= "reports filed under the different binary package names.</p>\n";
foreach my $pkg (keys %count) {
$sortkey{$pkg} = lc $pkg;
- $htmldescrip{$pkg} = sprintf('<a href="%s">%s</a> '
- . '(maintainer: <a href="%s">%s</a>)',
+ $htmldescrip{$pkg} = sprintf('<a href="%s">%s</a> (%s)',
pkgurl($pkg),
htmlsanit($pkg),
- mainturl($maintainers{$pkg}),
- htmlsanit($maintainers{$pkg} || "(unknown)"));
+ htmlmaintlinks(sub { $_[0] == 1 ? 'maintainer: '
+ : 'maintainers: ' },
+ $maintainers{$pkg}));
}
} elsif ($indexon eq "src") {
$tag = "source package";
$note = "";
foreach my $src (keys %count) {
$sortkey{$src} = lc $src;
- $htmldescrip{$src} = sprintf('<a href="%s">%s</a> '
- . '(maintainer: <a href="%s">%s</a>)',
+ $htmldescrip{$src} = sprintf('<a href="%s">%s</a> (%s)',
srcurl($src),
htmlsanit($src),
- mainturl($maintainers{$src}),
- htmlsanit($maintainers{$src} || "(unknown)"));
+ htmlmaintlinks(sub { $_[0] == 1 ? 'maintainer: '
+ : 'maintainers: ' },
+ $maintainers{$src}));
}
} elsif ($indexon eq "maint") {
$tag = "maintainer";
- %count = countbugs(sub {my %d=@_;
+ my %email2maint = ();
+ %count = countbugs(sub {my %d=@_;
return map {
- emailfromrfc822($maintainers{$_}) || ()
+ my @me = getparsedaddrs($maintainers{$_});
+ foreach my $addr (@me) {
+ $email2maint{$addr->address} = $addr->format
+ unless exists $email2maint{$addr->address};
+ }
+ map { $_->address } @me;
} splitpackages($d{"pkg"});
- });
+ });
$note = "<p>Note that maintainers may use different Maintainer fields for\n";
$note .= "different packages, so there may be other reports filed under\n";
$note .= "different addresses.</p>\n";
- my %email2maint = ();
- for my $x (values %maintainers) {
- my $y = emailfromrfc822($x);
- $email2maint{$y} = $x unless (defined $email2maint{$y});
- }
foreach my $maint (keys %count) {
$sortkey{$maint} = lc $email2maint{$maint} || "(unknown)";
- $htmldescrip{$maint} = sprintf('<a href="%s">%s</a>',
- mainturl($maint),
- htmlsanit($email2maint{$maint}) || "(unknown)")
+ $htmldescrip{$maint} = htmlmaintlinks('', $email2maint{$maint});
}
} elsif ($indexon eq "submitter") {
$tag = "submitter";
} elsif (defined $maint) {
my %maintainers = %{getmaintainers()};
$title = "maintainer $maint";
- my @pkgs = ();
- foreach my $p (keys %maintainers) {
- my $me = $maintainers{$p};
- $me =~ s/\s*\(.*\)\s*//;
- $me = $1 if ($me =~ m/<(.*)>/);
- push @pkgs, $p if ($me eq $maint);
- }
if ($maint eq "") {
@bugs = @{getbugs(sub {my %d=@_; my $me;
foreach my $try (splitpackages($d{"pkg"})) {
- ($me = $maintainers{$try} || "")
- =~ s/\s*\(.*\)\s*//;
- $me = $1 if ($me =~ m/<(.*)>/);
- return 1 if $me eq $maint;
+ my @me = getparsedaddrs($maintainers{$try});
+ return 1 if grep { $_->address eq $maint } @me;
}
return 0;
})};
} else {
+ my @pkgs = ();
+ foreach my $p (keys %maintainers) {
+ my @me = getparsedaddrs($maintainers{$p});
+ push @pkgs, $p if grep { $_->address eq $maint } @me;
+ }
@bugs = @{getbugs(sub {my %d=@_; my $me;
foreach my $try (splitpackages($d{"pkg"})) {
- ($me = $maintainers{$try} || "")
- =~ s/\s*\(.*\)\s*//;
- $me = $1 if ($me =~ m/<(.*)>/);
- return 1 if $me eq $maint;
+ my @me = getparsedaddrs($maintainers{$try});
+ return 1 if grep { $_->address eq $maint } @me;
}
return 0;
}, 'package', @pkgs)};
$title = "encoded maintainer $maintenc";
@bugs = @{getbugs(sub {my %d=@_;
foreach my $try (splitpackages($d{"pkg"})) {
- return 1 if
- maintencoded($maintainers{$try} || "") eq
- $maintenc;
+ my @me = getparsedaddrs($maintainers{$try});
+ return 1 if grep {
+ maintencoded($_->address) eq $maintenc
+ } @me;
}
return 0;
})};
my %maintainers = %{getmaintainers()};
my $maint = $pkg ? $maintainers{$pkg} : $maintainers{$src} ? $maintainers{$src} : undef;
if (defined $maint) {
- print "<p>Maintainer for " . ( defined($pkg) ? $pkg : "source package $src" ) . " is <a href=\""
- . mainturl($maint) . "\">"
- . htmlsanit($maint) . "</a>.</p>\n";
+ print '<p>';
+ my $showpkg = (defined $pkg) ? $pkg : "source package $src";
+ print htmlmaintlinks(sub { $_[0] == 1 ? "Maintainer for $showpkg is "
+ : "Maintainers for $showpkg are "
+ },
+ $maint);
+ print ".</p>\n";
}
if (defined $maint or @bugs) {
my %pkgsrc = %{getpkgsrc()};
* Colin Watson:
- Add (slightly) fancy CGI decoding of message/* MIME types.
+ - CGI scripts now support multiple maintainers for a single package.
-- Colin Watson <cjwatson@debian.org> Fri, 20 Jun 2003 18:57:25 +0100