#!/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; }