With the number of RC bugs currently exploding, and no doubt about to
get much worse when the new glibc hits testing, and a bug-squashing
party coming up, I decided I needed a good way to find RC bugs that
effect packages I care about.
And what better way to figure out which packages I care about than to
ask dpkg --get-selections? Then all I needed was a convenient way to
compare that list to the list on bugs.debian.org.
Well, the answer is below. Please send along bug reports, patches,
flames that had I typed apt-cache search whatever, I'd of found out
someone already wrote this, etc to me. This program takes a few seconds
to run (3 seconds on my PII-450); I think I'll put it in
/etc/cron.weekly. If anyone wants, I'll be happy to package it up.
And now...
#!/usr/bin/perl
# RCBugger - find RC bugs for programs on your system
# Copyright (C) 2003 Anthony DeRobertis
#
# 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
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
use LWP::Simple;
use strict;
my $url = "http://bugs.debian.org/release-critical/debian/all.html";
my $cache = "rc-bugs.html";
sub mirror_buglist();
sub read_packages();
sub handle_bugs();
sub print_if_relevant(%);
my %package_list;
mirror_buglist();
read_packages();
handle_bugs();
sub mirror_buglist() {
my $http_res_code = mirror($url, $cache);
if (is_error($http_res_code)) {
print STDERR "Could not fetch $url!\n";
if ( ! -r "$cache" || ! -s "$cache" ) {
print STDERR "... and there is no cached information. Bailing out.\n";
exit(1);
} else {
print STDERR "Using cached information. Results may be out of date.\n";
}
}
}
sub read_packages() {
open PIPE, "-|", "dpkg --get-selections";
while (defined(my $line = <PIPE>)) {
if ($line =~ /^(\S+)\s+install$/) {
$package_list{$1} = undef; # could put the version here and do real work, but oh well.
}
}
close PIPE;
}
sub human_flags($) {
my $mrf = shift; # machine readable flags, for those of you wondering
my @hrf = (); # considering above, should be obvious
$mrf =~ /^\[P/ and push(@hrf, "pending");
$mrf =~ /^\[.\+/ and push(@hrf, "patch");
$mrf =~ /^\[..H/ and push(@hrf, "help [wanted]");
$mrf =~ /^\[...M/ and push(@hrf, "moreinfo [needed]");
$mrf =~ /^\[....R/ and push(@hrf, "unreproducible");
$mrf =~ /^\[.....S/ and push(@hrf, "security");
$mrf =~ /^\[......U/ and push(@hrf, "upstream");
# XXX: these are documented, but not actually used on the page (2003/03/08)
$mrf =~ /^\[.......O/ and push(@hrf, "oldstable");
$mrf =~ /^\[........S/ and push(@hrf, "stable");
$mrf =~ /^\[.........T/ and push(@hrf, "testing");
$mrf =~ /^\[..........U/ and push(@hrf, "unstable");
if (@hrf) {
return "$mrf (" . join(", ", @hrf) . ')';
} else {
return "$mrf (none)";
}
}
sub print_if_relevant(%) {
my %args = @_;
if (exists($package_list{$args{pkg}})) {
# yep, relevant
print "Package: $args{pkg}\n"
."Bug: $args{num}\n"
."Name: $args{name}\n"
."Flags: " . human_flags($args{tags}) . "\n\n";
}
}
sub handle_bugs() {
open BUGS, "<", $cache or die "Could not read $cache: $!";
my $found_bugs_start;
my $current_package;
while (defined(my $line = <BUGS>)) {
if ($line =~ /^<pre>$/) {
$found_bugs_start = 1;
next;
} elsif (!defined($found_bugs_start)) {
next;
} elsif ($line =~ /^<a name="([^"]+)"><strong>Package:<\/strong> <A HREF="[^"]+">/) {
$current_package = $1;
} elsif ($line =~ /^<A NAME="(\d+)"> <A HREF="[^"]+">\d+<\/A> (\[[^\]]+\]) (.+)$/) {
print_if_relevant(pkg => $current_package, num => $1, tags => $2, name => $3);
}
}
close BUGS or die "Could not close $cache: $!";
}
Attachment:
signature.asc
Description: This is a digitally signed message part