f78351776d0e669983502de2a615fd1bf9e5b40b
[gitmo/moose-presentations.git] / moose-class / exercises / update-moosepan
1 #!/usr/bin/env perl
2
3 use strict;
4 use warnings;
5
6 use CPAN::FindDependencies qw( finddeps );
7 use CPAN::Mini;
8 use List::AllUtils qw( any );
9 use Module::CoreList;
10 use version;
11
12
13 {
14     package CPAN::FindDependencies;
15
16     use LWP::Simple qw( get );
17
18     no warnings 'redefine';
19     # The real function assumes that if you provide an argument it's a
20     # local file, not a URI.
21     sub _get02packages {
22         my $file = shift;
23
24         get($file) ||
25             die(__PACKAGE__.": Couldn't fetch 02packages index file\n");
26     }
27 }
28
29
30 sub main {
31     # If this isn't fetched fresh each time, then CPAN::Mini gets
32     # confused (maybe it's a timestamp issue because of git?)
33     unlink './moosepan/modules/02packages.details.txt.gz'
34         or die $!;
35
36     my @deps
37         = grep { is_real_dep($_) }
38         finddeps( 'Moose',
39         '02packages' =>
40             'http://mirrors.kernel.org/cpan/modules/02packages.details.txt.gz'
41         );
42
43     my @distros = map { $_->distribution() } @deps;
44
45     my $filter_sub = sub {
46         return !any { $_[0] eq $_ } @distros;
47     };
48
49     CPAN::Mini->update_mirror(
50         remote       => 'http://mirrors.kernel.org/cpan/',
51         local        => './moosepan',
52         path_filters => $filter_sub,
53         trace        => 1,
54         skip_perl    => 1,
55     );
56 }
57
58 my %skip_deps = map { $_ => 1 } qw(
59     ExtUtils::MakeMaker
60     Archive::Tar
61     Compress::Zlib
62     Compress::Raw::Bzip2
63     Compress::Raw::Zlib
64     IO::Zlib
65     Package::Constants
66     ExtUtils::CBuilder
67     Pod::Simple
68     Pod::Escapes
69     Task::Weaken
70     Module::Build
71 );
72
73 my $min_perl = version->new('5.8.5');
74 sub is_real_dep {
75     my $dep = shift;
76
77     # Include this just to make sure the user gets a version with
78     # weaken available.
79     return 1 if $dep->name eq 'Scalar::Util';
80
81     return if $skip_deps{ $dep->name() };
82
83     my $perl = Module::CoreList->first_release( $dep->name() );
84
85     return if defined $perl && version->new($perl) le $min_perl;
86
87     return 1;
88 }
89
90 main();