/
updatelist.pl
87 lines (79 loc) · 2.2 KB
/
updatelist.pl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
BEGIN { $ENV{HTTPS_CA_FILE} = '/etc/ssl/certs/ca-certificates.crt' }
use 5.010;
use strict;
use warnings;
use JSON::XS;
use LWP::UserAgent;
use autodie;
use File::Spec;
use FindBin;
use File::AtomicWrite;
use Data::Dumper;
$|++;
my $OUTDIR = shift(@ARGV) // 'public/';
my $ua = LWP::UserAgent->new;
$ua->timeout(10);
my @modules;
my @errors;
open my $fh, '<', "$FindBin::Bin/../META.list";
for my $url (<$fh>) {
chomp $url;
next unless $url =~ /\S/;
eval {
print "$url ";
my $response = $ua->get($url);
say $response->code;
if ($response->is_success) {
my $module = decode_json $response->content;
_normalize_module($module);
push @modules, $module;
my $name = $module->{name};
if ($name =~ m{[/\\]} || $name =~ m{\.\.}) {
die "Invalid module name '$name'";
}
open my $OUT, '>', File::Spec->catfile($OUTDIR, 'module', $name);
print $OUT $response->content;
close $OUT;
}
else {
die 'Unsuccessful HTTP response: ' . $response->code
. ' ' . $response->status_line;
}
};
if ($@) {
warn $@;
push @errors, {
url => $url,
message => $@,
};
}
}
close $fh;
for my $basename ('projects.json', 'list') {
File::AtomicWrite->write_file({
file => File::Spec->catfile($OUTDIR, $basename),
input => \encode_json(\@modules),
});
}
File::AtomicWrite->write_file({
file => File::Spec->catfile($OUTDIR, 'errors.json'),
input => \JSON::XS->new->pretty(1)->encode(\@errors),
});
sub _normalize_module {
my $module = shift;
for ( qw/source-url repo-url/ ) {
next unless defined $module->{ $_ };
_normalize_source_url( $module->{ $_ } );
}
_normalize_source_url( $module->{support}{source} )
if defined $module->{support} and defined $module->{support}{source};
}
sub _normalize_source_url {
for ( @_ ) {
next unless defined;
s/^\s+|\s+$//g;
s{git\@github\.com:}{git://github.com/};
$_ .= '.git' if m{^git://} and not m{\.git$};
s{/$}{.git} if m{^https?://};
}
}