#!/usr/bin/perl -wT
use strict;
use LWP::Simple;
use POSIX;
my $issues = {};
my $raisers = {};
my $id = 0;
while (1) {
$id += 1;
sleep 5;
my $source = get("http://www.w3.org/html/wg/tracker/issues/$id?changelog");
last unless defined $source;
my $issue = {};
$issue->{opened} = getField($source, 'Opened on');
$issue->{state} = getField($source, 'State');
$issue->{product} = getField($source, 'Product');
$issue->{raiser} = getField($source, 'Raised by');
$source =~ m{
((?:(?!
).)*)\n((?:(?!
).)*)}os;
$issue->{nickname} = $1;
$issue->{title} = $2;
$issue->{timeline} = [{
'datetime' => "$issue->{opened} 00:00:00",
'date' => $issue->{opened},
'state' => 'RAISED',
}];
while ($source =~ m{\G.+?\n
Status changed to &\#039;([a-z ]+)&\#039;
(?:[^<]+, )?([0-9]+) ([A-Za-z]+) ([0-9]+), (..:..:..)\n
}gos) {
my $state = uc $1;
my $day = $2;
my $month = $3 eq 'Jan' ? '01' :
$3 eq 'Feb' ? '02' :
$3 eq 'Mar' ? '03' :
$3 eq 'Apr' ? '04' :
$3 eq 'May' ? '05' :
$3 eq 'Jun' ? '06' :
$3 eq 'Jul' ? '07' :
$3 eq 'Aug' ? '08' :
$3 eq 'Sep' ? '09' :
$3 eq 'Oct' ? '10' :
$3 eq 'Nov' ? '11' :
$3 eq 'Dec' ? '12' : die;
my $year = $4;
my $time = $5;
my $date = sprintf('%04d-%02d-%02d', $year, $month, $day);
my $datetime = "$date $time";
push(@{$issue->{timeline}}, {
'datetime' => $datetime,
'date' => $date,
'state' => $state,
});
}
if (not exists $raisers->{$issue->{raiser}}) {
$raisers->{$issue->{raiser}} = [];
}
push(@{$raisers->{$issue->{raiser}}}, $id);
$issues->{$id} = $issue;
}
my $states = {};
my $dates = { strftime('%Y-%m-%d', gmtime time) => {} };
foreach my $issue (values %$issues) {
my $lastState;
foreach my $event (@{$issue->{timeline}}) {
if (not exists $dates->{$event->{date}}) {
$dates->{$event->{date}} = {};
}
if (exists $dates->{$event->{date}}->{$event->{state}}) {
$dates->{$event->{date}}->{$event->{state}} += 1;
} else {
$dates->{$event->{date}}->{$event->{state}} = 1;
}
if (defined $lastState) {
if (exists $dates->{$event->{date}}->{$lastState}) {
$dates->{$event->{date}}->{$lastState} -= 1;
} else {
$dates->{$event->{date}}->{$lastState} = -1;
}
}
$lastState = $event->{state};
$states->{$event->{state}} = 0;
}
}
foreach my $date (sort keys %$dates) {
foreach my $state (keys %$states) {
if (exists $dates->{$date}->{$state}) {
$dates->{$date}->{$state} = $states->{$state} += $dates->{$date}->{$state};
} else {
$dates->{$date}->{$state} = $states->{$state};
}
}
}
print 'date,';
foreach my $state (sort keys %$states) {
print "$state,";
}
print "total\n";
foreach my $date (sort keys %$dates) {
print "$date,";
my $total = 0;
foreach my $state (sort keys %$states) {
print "$dates->{$date}->{$state},";
$total += $dates->{$date}->{$state};
}
print "$total\n";
}
foreach my $raiser (sort { scalar(@{$raisers->{$a}}) <=> scalar(@{$raisers->{$b}}) } keys %$raisers) {
warn sprintf("%80s %4d: %s\n", $raiser, scalar @{$raisers->{$raiser}}, join(', ', @{$raisers->{$raiser}}));
}
sub getField {
my($source, $field) = @_;
$source =~ m{$field:\n((?:(?!).)*)}s;
return $1;
}