mirror of
https://github.com/libvirt/libvirt.git
synced 2025-02-25 18:55:26 -06:00
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
This commit is contained in:
parent
093973aabe
commit
1938bc69a7
1
docs/.gitignore
vendored
1
docs/.gitignore
vendored
@ -5,3 +5,4 @@ apibuild.pyc
|
|||||||
*.html
|
*.html
|
||||||
libvirt-api.xml
|
libvirt-api.xml
|
||||||
libvirt-refs.xml
|
libvirt-refs.xml
|
||||||
|
todo.html.in
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
## Process this file with automake to produce Makefile.in
|
## Process this file with automake to produce Makefile.in
|
||||||
SUBDIRS= schemas
|
SUBDIRS= schemas
|
||||||
|
|
||||||
|
PERL = perl
|
||||||
|
|
||||||
# The directory containing the source code (if it contains documentation).
|
# The directory containing the source code (if it contains documentation).
|
||||||
DOC_SOURCE_DIR=../src
|
DOC_SOURCE_DIR=../src
|
||||||
|
|
||||||
@ -53,7 +55,7 @@ gif = \
|
|||||||
architecture.gif \
|
architecture.gif \
|
||||||
node.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)
|
dot_html = $(dot_html_in:%.html.in=%.html)
|
||||||
|
|
||||||
patches = $(wildcard api_extension/*.patch)
|
patches = $(wildcard api_extension/*.patch)
|
||||||
@ -97,6 +99,22 @@ ChangeLog.html.in: ChangeLog.xml ChangeLog.xsl
|
|||||||
$(XSLTPROC) --nonet $(top_srcdir)/docs/ChangeLog.xsl $< > $@ \
|
$(XSLTPROC) --nonet $(top_srcdir)/docs/ChangeLog.xsl $< > $@ \
|
||||||
|| { rm $@ && exit 1; }; fi
|
|| { 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
|
%.png: %.fig
|
||||||
convert -rotate 90 $< $@
|
convert -rotate 90 $< $@
|
||||||
|
|
||||||
@ -153,7 +171,7 @@ clean-local:
|
|||||||
rm -f *~ *.bak *.hierarchy *.signals *-unused.txt *.html
|
rm -f *~ *.bak *.hierarchy *.signals *-unused.txt *.html
|
||||||
|
|
||||||
maintainer-clean-local: clean-local
|
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
|
rebuild: api all
|
||||||
|
|
||||||
|
@ -275,6 +275,12 @@
|
|||||||
<li>
|
<li>
|
||||||
<a href="bugs.html">Bug reports</a>
|
<a href="bugs.html">Bug reports</a>
|
||||||
<span>How and where to report bugs and request features</span>
|
<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>
|
||||||
<li>
|
<li>
|
||||||
<a href="contact.html">Contact</a>
|
<a href="contact.html">Contact</a>
|
||||||
|
26
docs/todo.cfg-example
Normal file
26
docs/todo.cfg-example
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
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 & XML before fully implementing them, to
|
||||||
|
allow for early design review.
|
||||||
|
EOF
|
||||||
|
}
|
120
docs/todo.pl
Executable file
120
docs/todo.pl
Executable file
@ -0,0 +1,120 @@
|
|||||||
|
#!/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/&/&/g;
|
||||||
|
$txt =~ s/</</g;
|
||||||
|
$txt =~ s/>/>/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";
|
Loading…
Reference in New Issue
Block a user