[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#562109: patch for maintainers-needed.pl



tag 562109 +patch
thanks

Attached a patch for maintainers-needed.pl to include a list of closed RFA/O
bugs, indicating by whom the bugs were closed, and whether they were
adoptions, or removals from the archive.

To be able to distinguish between removals and adoptions, it looks up whether
the affected package is listed in ftp-master's removals.txt (see attached
shell script for details).

In the reported count, "recently" refers to whatever is in the current
fullindex (which is produced by bts2ldap). I'm lumping together adopted and
removed, because there aren't that many of either anyway.

To test the patch, just make sure you have all needed input files in place,
and run without any arguments (doesn't send an email by default). At this
moment there aren't any closed RFA/O bugs during last week, so you might need
to increase $days_ago_removed_adopted from 7 to say 21 to see any results.

Cheers,
Serafeim

ps. I understand that maintainers-needed.pl isn't actively maintained (funny
that) and I'm not a DD to apply it myself, so I'm cc'ing Paul who's requested
the feature in the first place

-- 
debtags-organised WNPP bugs: http://members.hellug.gr/serzan/wnpp
Index: maintainers-needed.pl
===================================================================
--- maintainers-needed.pl	(revision 2323)
+++ maintainers-needed.pl	(working copy)
@@ -5,6 +5,7 @@
 # Copyright (C) 2004, 2005  Martin Michlmayr <tbm@cyrius.com>
 # Copyright (C) 2004  Frank Lichtenheld <djpig@debian.org>
 # Copyright (C) 2005, 2006  Christoph Berg <myon@debian.org>
+# Copyright (C) 2009  Serafeim Zanikolas <serzan@hellug.gr>
 # $Id$
 
 # This program is free software; you can redistribute it and/or modify
@@ -28,15 +29,20 @@
 use Date::Parse;
 use Mail::Header;
 use DB_File;
+use SOAP::Lite;
 
 my $whereto = "debian-devel\@lists.debian.org";
 my $wnpp_url = "http://www.debian.org/devel/wnpp/";;
 my $rfa_url = $wnpp_url . "rfa_bypackage";
 my $orphaned_url = $wnpp_url . "orphaned";
 my $rfh_url = $wnpp_url . "help_requested";
+my $bts_soap_url = "http://bugs.debian.org/cgi-bin/soap.cgi";;
+my $removals_file = "/org/ftp-master.debian.org/removals.txt";
 
 my $new_only = 1; # show only new WNPP entries from the previous week
 
+my $days_ago_removed_adopted = 7; # increase to manually inspect results
+
 my $mail;
 if (@ARGV && $ARGV[0] eq "--email") {
     $mail = "| /usr/sbin/sendmail -t";
@@ -56,18 +62,23 @@
 my $curtime = time;
 
 open INDEX, $BTS2LDAP or die "Couldn't open BTS LDAP index file: $!";
-my (@rfa, @orphaned, @rfh, %pkginfo);
+my (@rfa, @orphaned, @rfh, @rfa_o_closed, @rfa_o_closed_bugnrs, %pkginfo);
 while (1) {
     my $reader = new Mail::Header \*INDEX;
     last unless $reader->get("debbugsID");
     last unless $reader->get("debbugsID") > 0;
-    next unless $reader->get("debbugsState") =~ /^(open|forwarded)$/;
+    next unless $reader->get("debbugsState") =~ /^(open|forwarded|done)$/;
     next if grep $_ eq "fixed\n", $reader->get("debbugsTag");
     my $package = $reader->get("debbugsPackage");
     chomp($package);
     my $bugnr = $reader->get("debbugsID");
     chomp($bugnr);
     my $title = $reader->get("debbugsTitle");
+    my $bugstate = $reader->get("debbugsState");
+    my $closed_by = $reader->get("debbugsDone");
+    if ($closed_by) {
+        chomp($closed_by);
+    }
     chomp($title);
     if (! $title) {
         print $bugnr, "\n";
@@ -101,21 +112,35 @@
             next if (grep { $_ eq $package } @rfa);
             $pkginfo{$package} = {
                 id => $bugnr, age => $age, desc => $desc, revdeps => {} };
-            push @rfa, $package;
+            if ($bugstate eq "done\n") {
+                $pkginfo{$package}{closed_by} = $closed_by;
+                push @rfa_o_closed, $package;
+                push @rfa_o_closed_bugnrs, $bugnr;
+            } else {
+                push @rfa, $package;
+            }
         }
     } elsif ($title =~ /^O:\s*((?:[a-z0-9][-a-z0-9+.]+(?:,?\s+)?)+)/io) {
         foreach my $package (split /,?\s+/, $1) {
             next if (grep { $_ eq $package } @orphaned);
             $pkginfo{$package} = {
                 id => $bugnr, age => $age, desc => $desc, revdeps => {} };
-            push @orphaned, $package;
+            if ($bugstate eq "done") {
+                $pkginfo{$package}{closed_by} = $closed_by;
+                push @rfa_o_closed, $package;
+                push @rfa_o_closed_bugnrs, $bugnr;
+            } else {
+                push @orphaned, $package;
+            }
         }
     } elsif ($title =~ /^RFH:\s*((?:[a-z0-9][-a-z0-9+.]+(?:,?\s+)?)+)/io) {
         foreach my $package (split /,?\s+/, $1) {
             next if (grep { $_ eq $package } @rfh);
             $pkginfo{$package} = {
                 id => $bugnr, age => $age, desc => $desc, revdeps => {} };
-            push @rfh, $package;
+            if ($bugstate ne "done") {
+                push @rfh, $package;
+            }
         }
     }
 }
@@ -192,7 +217,8 @@
 }
 $/ = "\n";
 
-my ($orphaned, $rfa, $new_orphaned, $new_rfa, $rfh, $new_rfh) = (0, 0, 0, 0, 0, 0);
+my ($orphaned, $rfa, $new_orphaned, $new_rfa, $rfh, $new_rfh,
+    $rfa_o_closed, $new_rfa_o_closed) = (0, 0, 0, 0, 0, 0, 0, 0);
 
 foreach my $pkg (@orphaned) {
     next unless defined(%{$pkginfo{$pkg}});
@@ -210,6 +236,22 @@
     $new_rfh++ if ($pkginfo{$pkg}{age} < 7);
 }
 
+# for closed rfa/orphaned bugs, re-calculate age using last_modified
+# (and ignore archived bugs, as they're definately older than 7 days)
+my $soap = SOAP::Lite->uri('Debbugs/SOAP')->proxy($bts_soap_url);
+my $soap_reply = $soap->get_status(@rfa_o_closed_bugnrs);
+
+foreach my $pkg (@rfa_o_closed) {
+    next unless defined(%{$pkginfo{$pkg}});
+    $rfa_o_closed++;
+    my $bugnr = $pkginfo{$pkg}{id};
+    my $last_modified = $soap_reply->result->{$bugnr}->{"last_modified"};
+    $pkginfo{$pkg}{age} = int(($curtime - $last_modified)/86400);
+    $pkginfo{$pkg}{archived} = $soap_reply->result->{$bugnr}->{"archived"};
+    $new_rfa_o_closed++ if ($pkginfo{$pkg}{age} <= $days_ago_removed_adopted)
+        and ($pkginfo{$pkg}{archived} != 1)
+}
+
 my ($mday, $mon, $year) = (localtime)[3..5];
 my $date = (qw/Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec/)[$mon] . 
     " $mday, " . ($year+1900);
@@ -233,6 +275,7 @@
 Total number of orphaned packages: $orphaned (new: $new_orphaned)
 Total number of packages offered up for adoption: $rfa (new: $new_rfa)
 Total number of packages requested help for: $rfh (new: $new_rfh)
+Number of packages adopted or removed recently: $rfa_o_closed (new: $new_rfa_o_closed)
 
 Please refer to $wnpp_url for more information.
 
@@ -300,6 +343,17 @@
     print NFM "See $rfh_url for more information.\n";
 }
 
+if ($new_rfa_o_closed) {
+    print NFM "\n", "-"x72, "\n\n";
+    print NFM "These packages have been adopted or removed in the last " .
+              "$days_ago_removed_adopted days:\n";
+    adopted_removed_pkgs_out(\@rfa_o_closed);
+} else {
+    print NFM "\n", "-"x72, "\n\n";
+    print NFM "No packages have been adopted or removed in the last " .
+              "$days_ago_removed_adopted days\n";
+}
+
 close NFM or warn "Couldn't close output stream: $!";
 
 exit 0;
@@ -366,5 +420,37 @@
     }
 }
 
+sub adopted_removed_pkgs_out {
+    my ($list) = @_;
+    my %removed_pkgs = %{load_removed_pkgs()};
+    foreach my $pkg (sort sort_pkgs @$list) {
+        next unless defined(%{$pkginfo{$pkg}});
+        next if ($pkginfo{$pkg}{age} > $days_ago_removed_adopted)
+                or ($pkginfo{$pkg}{archived} == 1);
+        my $age = ($pkginfo{$pkg}{age} == 0) ? "today" :
+                  ($pkginfo{$pkg}{age} == 1) ? "yesterday" :
+                  "$pkginfo{$pkg}{age} days ago";
+        my $closed_by = $pkginfo{$pkg}{closed_by};
+        $closed_by =~ s/ <.*//; # remove email to shorten lines
+        print NFM "\n", " "x3;
+        my $resolution = defined($removed_pkgs{$pkg}) ? "removed" : "adopted";
+        my $freeness = $pkginfo{$pkg}{nonfree} ? " (non-free)" : "";
+        print NFM fmt("$pkg (#$pkginfo{$pkg}{id}), $resolution " .
+            "by $closed_by $age$freeness", 72), "\n";
+        print NFM fmt("Description: " . $pkginfo{$pkg}{desc}, 72, " "x5), "\n"
+    }
+}
 
+sub load_removed_pkgs {
+    open(PCKG, $removals_file) or
+        die "failed to open removals file $removals_file\n";
+    my %removed_pkgs = ();
+    while (<PCKG>) {
+        if (/^ *([^ ]+) *\|.*source/) {
+            $removed_pkgs{$1} = 1;
+        }
+    }
+    return \%removed_pkgs;
+}
+
 # vim: ts=4:expandtab:shiftwidth=4:

Attachment: get-ftpmaster-removals.sh
Description: Bourne shell script


Reply to: