#!/usr/bin/perl use strict; use warnings; use BZ::Client; use BZ::Client::Bug; use Config::Record; my $cfg = Config::Record->new(file => "todo.cfg"); my $server = $cfg->get("bugzilla/server", "https://bugzilla.redhat.com"); my $username = $cfg->get("bugzilla/username"); my $password = $cfg->get("bugzilla/password"); my $product = $cfg->get("query/product", "Virtualization Tools"); my $todoalias = $cfg->get("query/todoalias", "libvirtTodo"); my $title = $cfg->get("output/title", undef); my $blurb = $cfg->get("output/blurb", undef); $SIG{__DIE__} = sub { my $err = shift; if (UNIVERSAL::isa($err, "BZ::Client::Exception")) { die "Unable to access bugzilla: " . $err->message; } die $err; }; my $client = BZ::Client->new(url => $server, user => $username, password => $password); my $todo = BZ::Client::Bug->search($client, {'product' => $product, 'alias' => $todoalias}); die "Cannot find bug alias 'libvirtTodo'" unless $#{$todo} > -1; my $todoid = $todo->[0]->{'bug_id'}; my $todosummary = $todo->[0]->{'short_desc'}; $todosummary =~ s/^\s*RFE\s*:\s*//; $todosummary =~ s/^\s*\[\s*RFE\s*\]\s*:?\s*//; $todosummary =~ s/^\s*Tracker\s*:\s*//; my $trackers = BZ::Client::Bug->search($client, {'product' => $product, 'blocked' => $todoid }); my @trackers; foreach my $tracker (@{$trackers}) { next if $tracker->{'bug_status'} eq "CLOSED"; my $summary = $tracker->{'short_desc'}; $summary =~ s/^\s*RFE\s*:\s*//; $summary =~ s/^\s*\[\s*RFE\s*\]\s*:?\s*//; $summary =~ s/^\s*Tracker\s*:\s*//; push @trackers, { id => $tracker->{'bug_id'}, summary => $summary, features => [], }; } foreach my $tracker (@trackers) { my $features = BZ::Client::Bug->search($client, {'product' => $product, 'blocked' => $tracker->{id}}); foreach my $feature (@{$features}) { next if $feature->{'bug_status'} eq "CLOSED"; my $summary = $feature->{'short_desc'}; $summary =~ s/^\s*RFE\s*:\s*//; $summary =~ s/^\s*\[\s*RFE\s*\]\s*:?\s*//; push @{$tracker->{features}}, { id => $feature->{'bug_id'}, summary => $summary, }; } } sub escape { my $txt = shift; $txt =~ s/&/&/g; $txt =~ s/</</g; $txt =~ s/>/>/g; return $txt; }; print "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"; print "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n"; print "<html xmlns=\"http://www.w3.org/1999/xhtml\">\n"; print " <body>\n"; if (defined $title) { print " <h1>", &escape($title), "</h1>\n"; } else { print " <h1>", &escape($todosummary), "</h1>\n"; } if (defined $blurb) { print " <p>\n"; print $blurb; print " </p>\n"; } foreach my $tracker (sort { $a->{summary} cmp $b->{summary} } @trackers) { next unless $#{$tracker->{features}} >= 0; my $summary = &escape($tracker->{summary}); my $id = $tracker->{id}; print " <h2><a href=\"$server/$id\">$summary</a></h2>\n"; print " <ul>\n"; foreach my $feature (sort { $a->{summary} cmp $b->{summary} } @{$tracker->{features}}) { $summary = &escape($feature->{summary}); $summary =~ s,^([^:]+):,<strong>$1</strong>,; $id = $feature->{id}; print " <li>$summary (<strong>rhbz <a href=\"$server/$id\">$id</a></strong>)</li>\n"; } print " </ul>\n"; } print " <p>\n"; print " This page is automatically generated from <a href=\"$server/$todoid\">", &escape($todosummary), "</a>\n"; print " </p>\n"; print " </body>\n"; print "</html>\n";