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