提交 1938bc69 编写于 作者: D Daniel P. Berrange

Add automatic generation of a todo item page

This adds a script to generate the todo item page from
bugzilla. This requires a valid username+password for
bugzilla, so it is intended that this only be run on
the libvirt.org website via cron. Normal usage will just
generate an empty stub page.

* docs/todo.pl: Script to extract todo items from bugzilla
* docs/todo.cfg-example: Example config file
* docs/sitemap.html.in: Add todo page
* docs/Makefile.am: Generation rules for todo items
上级 093973aa
......@@ -5,3 +5,4 @@ apibuild.pyc
*.html
libvirt-api.xml
libvirt-refs.xml
todo.html.in
## Process this file with automake to produce Makefile.in
SUBDIRS= schemas
PERL = perl
# The directory containing the source code (if it contains documentation).
DOC_SOURCE_DIR=../src
......@@ -53,7 +55,7 @@ gif = \
architecture.gif \
node.gif
dot_html_in = $(notdir $(wildcard $(srcdir)/*.html.in))
dot_html_in = $(notdir $(wildcard $(srcdir)/*.html.in)) todo.html.in
dot_html = $(dot_html_in:%.html.in=%.html)
patches = $(wildcard api_extension/*.patch)
......@@ -97,6 +99,22 @@ ChangeLog.html.in: ChangeLog.xml ChangeLog.xsl
$(XSLTPROC) --nonet $(top_srcdir)/docs/ChangeLog.xsl $< > $@ \
|| { rm $@ && exit 1; }; fi
todo.html.in: todo.pl
if [ -f todo.cfg ]; then \
echo "Generating $@"; \
$(PERL) $(srcdir)/$< > $@ \
|| { rm $@ && exit 1; }; \
else \
echo "Stubbing $@"; \
echo "<html><body><h1>Todo list</h1></body></html>" > $@ ; \
fi
todo:
rm -f todo.html.in
$(MAKE) todo.html
.PHONY: todo
%.png: %.fig
convert -rotate 90 $< $@
......@@ -153,7 +171,7 @@ clean-local:
rm -f *~ *.bak *.hierarchy *.signals *-unused.txt *.html
maintainer-clean-local: clean-local
rm -rf libvirt-api.xml libvirt-refs.xml
rm -rf libvirt-api.xml libvirt-refs.xml todo.html.in
rebuild: api all
......
......@@ -275,6 +275,12 @@
<li>
<a href="bugs.html">Bug reports</a>
<span>How and where to report bugs and request features</span>
<ul>
<li>
<a href="todo.html">Todo list</a>
<span>Main feature request list</span>
</li>
</ul>
</li>
<li>
<a href="contact.html">Contact</a>
......
bugzilla = {
#username = ...some email addr...
#password = ...some bz password...
server = https://bugzilla.redhat.com
}
query = {
product = Virtualization Tools
alias = libvirtTodo
}
output = {
title = Todo list
blurb = <<EOF
This is a summary of all the ideas submitted for future todo items in
libvirt. Listing an idea here does not imply that it is committed to
for inclusion in libvirt, just that someone thought it might be a
useful feature. Discussion for final approval of features always takes
place on the <a href="contact.html">development mailing list</a>.
If you intend to work on one of the items here, it is recommended to
add a comment to the corresponding bugzilla ticket to this effect.
This will reduce the risk of duplicated effort between developers.
It is also strongly recommended to mail the development mailing list
with proposals for new APIs &amp; XML before fully implementing them, to
allow for early design review.
EOF
}
#!/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}) {
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}) {
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/&/&amp;/g;
$txt =~ s/</&lt;/g;
$txt =~ s/>/&gt;/g;
return $txt;
};
print "<?xml version=\"1.0\"?>\n";
print "<html>\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";
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册