11# !/usr/bin/env perl
22use strict;
3+ use Capture::Tiny qw( capture_stdout) ;
4+ use Config;
5+ use Cwd;
6+ use CPAN::Meta;
37use File::Path;
48use File::Find;
59use File::pushd;
10+ use Carton::Snapshot;
611use Tie::File;
712
13+ sub run_command {
14+ local $ENV {PLENV_VERSION } = " 5.8.9" ;
15+ system " plenv" , " exec" , @_ ;
16+ }
17+
818sub rewrite_version_pm {
919 my $file = shift ;
1020
@@ -19,38 +29,98 @@ sub rewrite_version_pm {
1929 }
2030}
2131
22- sub run {
23- my ($fresh ) = @_ ;
24-
25- my $dir = " .fatpack-build" ;
26- mkpath $dir ;
32+ sub build_snapshot {
33+ my $dir = shift ;
2734
2835 {
29- my $push = pushd $dir ;
36+ my $pushd = pushd $dir ;
3037
3138 open my $fh , " >cpanfile" ;
32- print $fh <<EOF ;
33- requires "Menlo";
34- EOF
39+ print $fh " requires 'Menlo', '$Menlo::VERSION ';\n " ;
3540 close $fh ;
41+
42+ run_command " carton" , " install" ;
43+ }
44+
45+ my $snapshot = Carton::Snapshot-> new(path => " $dir /cpanfile.snapshot" );
46+ $snapshot -> load;
3647
37- $ENV {PLENV_VERSION } = " 5.12.5" ;
48+ return $snapshot ;
49+ }
3850
39- if ($fresh ) {
40- system " plenv" , " exec" , " carmel" , " update" ;
51+ sub required_modules {
52+ my ($snapshot , $dir ) = @_ ;
53+
54+ my $requires = CPAN::Meta::Requirements-> new;
55+ $requires -> add_minimum(Menlo => $Menlo::VERSION );
56+
57+ my $finder ;
58+ $finder = sub {
59+ my $module = shift ;
60+
61+ my $dist = $snapshot -> find($module );
62+ if ($dist ) {
63+ my $name = $dist -> name;
64+ my $path = " $dir /local/lib/perl5/$Config {archname}/.meta/$name /MYMETA.json" ;
65+ my $meta = CPAN::Meta-> load_file($path );
66+
67+ my $reqs = $meta -> effective_prereqs-> requirements_for(' runtime' => ' requires' );
68+ for my $module ( $reqs -> required_modules ) {
69+ next if $module eq ' perl' ;
70+
71+ my $core = $Module::CoreList::version {" 5.008009" }{$module };
72+ unless ($core && $reqs -> accepts_module($module , $core )) {
73+ $requires -> add_string_requirement( $module => $reqs -> requirements_for_module($module ) );
74+ $finder -> ($module );
75+ }
76+ }
4177 }
78+ };
79+
80+ $finder -> (" Menlo" );
81+ $requires -> clear_requirement($_ ) for qw( Module::CoreList ) ;
82+
83+ return map { s ! ::! /! g ; " $_ .pm" } $requires -> required_modules;
84+ }
85+
86+ sub pack_modules {
87+ my ($dir , @modules ) = @_ ;
4288
43- system " plenv" , " exec" , " carmel" , " install" ;
44- system " plenv" , " exec" , " carmel" , " rollout" ;
89+ my $stdout = capture_stdout {
90+ local $ENV {PERL5LIB } = cwd . " /$dir /local/lib/perl5" ;
91+ run_command " fatpack" , " packlists-for" , @modules ;
92+ };
93+
94+ my @packlists = split /\n/, $stdout ;
95+ for my $packlist (@packlists ) {
96+ warn " Packing $packlist \n " ;
4597 }
4698
47- rmtree " fatlib" ;
48- system " rsync" , " -auv" , " --chmod=u+w" , " $dir /local/lib/perl5/" , " fatlib/" ;
99+ run_command " fatpack" , " tree" , @packlists ;
100+ }
101+
102+ sub run {
103+ my ($fresh ) = @_ ;
104+
105+ my $dir = " .fatpack-build" ;
106+ mkdir $dir , 0777;
107+
108+ if ($fresh ) {
109+ rmtree $dir ;
110+ mkpath $dir ;
111+ }
112+
113+ my $snapshot = build_snapshot($dir );
114+ my @modules = required_modules($snapshot , $dir );
115+
116+ pack_modules($dir , @modules );
49117
50- use Config;
51118 mkpath " fatlib/version" ;
52119
53- for my $file (" fatlib/$Config {archname}/version.pm" , glob (" fatlib/$Config {archname}/version/*.pm" )) {
120+ for my $file (
121+ glob (" fatlib/$Config {archname}/version.pm*" ),
122+ glob (" fatlib/$Config {archname}/version/*.pm" ),
123+ ) {
54124 next if $file =~ / \b vxs\. pm$ / ;
55125 (my $target = $file ) =~ s ! ^fatlib/$Config{archname}/! fatlib/! ;
56126 rename $file => $target or die " $file => $target : $! " ;
0 commit comments