]> git.donarmstrong.com Git - debbugs.git/commitdiff
[project @ 2003-06-25 17:51:51 by cjwatson]
authorcjwatson <>
Thu, 26 Jun 2003 00:51:51 +0000 (16:51 -0800)
committercjwatson <>
Thu, 26 Jun 2003 00:51:51 +0000 (16:51 -0800)
CGI scripts now support multiple maintainers for a single package. I'm not
entirely sure about the htmlmaintlinks() interface, but by and large it
seems to work.

cgi/bugreport.cgi
cgi/common.pl
cgi/pkgindex.cgi
cgi/pkgreport.cgi
debian/changelog

index 22b0dacb6cad6319ee92c834cf8cb772cc63f76f..bd5c5a639bb071c6adf0136ca8c8e7edc780d785 100755 (executable)
@@ -211,8 +211,10 @@ foreach my $pkg (@tpacks) {
     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>";
index e42f6e01686528fea8e7634dd5490cb0a486a99a..ed9728e108d320f7614b12ea936836696e514e02 100644 (file)
@@ -2,6 +2,7 @@
 
 use DB_File;
 use Fcntl qw/O_RDONLY/;
+use Mail::Address;
 $config_path = '/etc/debbugs';
 $lib_path = '/usr/lib/debbugs';
 require "$lib_path/errorlib";
@@ -132,6 +133,15 @@ sub splitpackages {
     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.
@@ -153,6 +163,25 @@ sub htmlpackagelinks {
            ) . ";\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)};
index dc0af76788c45731fb2891e665f4dba144e900bc..a2c73e501cd3a440404f4de4c076ca671338aef1 100755 (executable)
@@ -62,12 +62,12 @@ if ($indexon eq "pkg") {
   $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";
@@ -80,33 +80,32 @@ if ($indexon eq "pkg") {
   $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";
index 9440dd3062de2edffdc0697d8931244c74fbff56..8456a266c12d87e04d784c4cc27aa792bf2ab075 100755 (executable)
@@ -126,30 +126,24 @@ if (defined $pkg) {
 } 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)};
@@ -159,9 +153,10 @@ if (defined $pkg) {
   $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;
                         })};
@@ -210,9 +205,13 @@ if (defined $pkg || defined $src) {
     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()};
index bf121341a6748e1b989a8705914967f17e6e0bae..4b695f5e1b0c31a9bc2829b5789aa5335677a106 100644 (file)
@@ -2,6 +2,7 @@ debbugs (2.4.2) UNRELEASED; urgency=low
 
   * 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