Skip to content

Commit 580c3f7

Browse files
authored
Merge pull request #35 from metacpan/mickey/cpan_testers
Added cpan_testers script
2 parents 41178c4 + 898465d commit 580c3f7

File tree

3 files changed

+163
-0
lines changed

3 files changed

+163
-0
lines changed

bin/cpan_testers.pl

Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
use strict;
2+
use warnings;
3+
use v5.36;
4+
5+
use DBI ();
6+
use File::stat qw< stat >;
7+
use Getopt::Long;
8+
use IO::Uncompress::Bunzip2 qw< bunzip2 >;
9+
10+
use MetaCPAN::Logger qw< :log :dlog >;
11+
12+
use MetaCPAN::ES;
13+
use MetaCPAN::Ingest qw<
14+
home
15+
ua
16+
>;
17+
18+
# args
19+
my ( $force_refresh, $skip_download );
20+
GetOptions(
21+
"force_refresh" => \$force_refresh,
22+
"skip_download" => \$skip_download,
23+
);
24+
25+
# setup
26+
27+
# XXX fix hardcoded path
28+
my $home = home();
29+
30+
my $db
31+
= $ENV{HARNESS_ACTIVE}
32+
? $home->child('t/var/cpantesters-release-fake.db.bz2')
33+
: 'http://devel.cpantesters.org/release/release.db.bz2';
34+
35+
# XXX move path to config
36+
my $mirror_file = $home->child( 'var', ( $ENV{HARNESS_ACTIVE} ? 't' : () ),
37+
'tmp', 'cpantesters.db' );
38+
39+
my $ua = ua();
40+
41+
my $es = MetaCPAN::ES->new( type => "release" );
42+
my $bulk = $es->bulk();
43+
44+
index_reports();
45+
46+
log_info { 'Mirroring ' . $db };
47+
48+
$ua->mirror( $db, "$db.bz2" ) unless $skip_download;
49+
50+
if ( -e $mirror_file
51+
&& stat($mirror_file)->mtime >= stat("$mirror_file.bz2")->mtime )
52+
{
53+
log_info {'DB hasn\'t been modified'};
54+
exit unless $force_refresh;
55+
}
56+
57+
bunzip2
58+
"$mirror_file.bz2" => "$mirror_file",
59+
AutoClose => 1
60+
if -e "$mirror_file.bz2";
61+
62+
my $scroll = $es->scroll(
63+
body => {
64+
sort => '_doc',
65+
},
66+
);
67+
68+
my %releases;
69+
70+
while ( my $release = $scroll->next ) {
71+
my $data = $release->{_source};
72+
73+
# XXX temporary hack. This may be masking issues with release
74+
# versions. (Olaf)
75+
my $version = $data->{version};
76+
$version =~ s{\Av}{} if $version;
77+
78+
$releases{ join( '-', grep {defined} $data->{distribution}, $version ) }
79+
= $data;
80+
}
81+
82+
log_info { 'Opening database file at ' . $mirror_file };
83+
84+
my $dbh = DBI->connect( 'dbi:SQLite:dbname=' . $mirror_file );
85+
my $sth;
86+
$sth = $dbh->prepare('SELECT * FROM release');
87+
88+
$sth->execute;
89+
my @bulk;
90+
while ( my $row_from_db = $sth->fetchrow_hashref ) {
91+
92+
# The testers db seems to return q{} where we would expect a version of
93+
# 0.
94+
95+
my $version = $row_from_db->{version} || 0;
96+
97+
# weblint++ gets a name of 'weblint' and a version of '++-1.15' from
98+
# the testers db. Special case it for now. Maybe try and get the db
99+
# fixed.
100+
101+
$version =~ s{\+}{}g;
102+
$version =~ s{\A-}{};
103+
104+
my $release = join( '-', $row_from_db->{dist}, $version );
105+
my $release_doc = $releases{$release};
106+
107+
# there's a cpantesters dist we haven't indexed
108+
next unless ($release_doc);
109+
110+
my $insert_ok = 0;
111+
112+
my $tester_results = $release_doc->{tests};
113+
if ( !$tester_results ) {
114+
$tester_results = {};
115+
$insert_ok = 1;
116+
}
117+
118+
# maybe use Data::Compare instead
119+
for my $condition (qw(fail pass na unknown)) {
120+
last if $insert_ok;
121+
if ( ( $tester_results->{$condition} || 0 )
122+
!= $row_from_db->{$condition} )
123+
{
124+
$insert_ok = 1;
125+
}
126+
}
127+
128+
next unless ($insert_ok);
129+
my %tests = map { $_ => $row_from_db->{$_} } qw(fail pass na unknown);
130+
$bulk->update( {
131+
doc => { tests => \%tests },
132+
doc_as_upsert => 1,
133+
id => $release_doc->{id},
134+
} );
135+
}
136+
137+
$bulk->flush;
138+
$es->index_refresh;
139+
140+
log_info {'done'};
141+
142+
1;
143+
144+
=pod
145+
146+
=head1 SYNOPSIS
147+
148+
$ bin/metacpan cpantesters
149+
150+
=head1 DESCRIPTION
151+
152+
Index CPAN Testers test results.
153+
154+
=head1 ARGUMENTS
155+
156+
=head2 db
157+
158+
Defaults to C<http://devel.cpantesters.org/release/release.db.bz2>.
159+
160+
=cut

cpanfile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,13 @@ requires 'Cpanel::JSON::XS';
77
requires 'Data::Printer';
88
requires 'DateTime';
99
requires 'Data::Printer';
10+
requires 'DBI';
1011
requires 'Digest::SHA';
1112
requires 'Email::Valid';
1213
requires 'Encode';
1314
requires 'File::Find::Rule';
1415
requires 'Getopt::Long';
16+
requires 'IO::Prompt::Tiny';
1517
requires 'List::AllUtils';
1618
requires 'LWP::UserAgent';
1719
requires 'LWP::Protocol::https';

lib/MetaCPAN/Ingest.pm

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use v5.36;
66

77
use Digest::SHA;
88
use Encode qw< decode_utf8 >;
9+
use IO::Prompt::Tiny qw< prompt >;
910
use IPC::Run3 ();
1011
use LWP::UserAgent;
1112
use Path::Tiny qw< path >;

0 commit comments

Comments
 (0)