1
1
# !/usr/bin/env perl
2
2
use strict;
3
+ use Capture::Tiny qw( capture_stdout) ;
4
+ use Config;
5
+ use Cwd;
6
+ use CPAN::Meta;
3
7
use File::Path;
4
8
use File::Find;
5
9
use File::pushd;
10
+ use Carton::Snapshot;
6
11
use Tie::File;
7
12
13
+ sub run_command {
14
+ local $ENV {PLENV_VERSION } = " 5.8.9" ;
15
+ system " plenv" , " exec" , @_ ;
16
+ }
17
+
8
18
sub rewrite_version_pm {
9
19
my $file = shift ;
10
20
@@ -19,38 +29,98 @@ sub rewrite_version_pm {
19
29
}
20
30
}
21
31
22
- sub run {
23
- my ($fresh ) = @_ ;
24
-
25
- my $dir = " .fatpack-build" ;
26
- mkpath $dir ;
32
+ sub build_snapshot {
33
+ my $dir = shift ;
27
34
28
35
{
29
- my $push = pushd $dir ;
36
+ my $pushd = pushd $dir ;
30
37
31
38
open my $fh , " >cpanfile" ;
32
- print $fh <<EOF ;
33
- requires "Menlo";
34
- EOF
39
+ print $fh " requires 'Menlo', '$Menlo::VERSION ';\n " ;
35
40
close $fh ;
41
+
42
+ run_command " carton" , " install" ;
43
+ }
44
+
45
+ my $snapshot = Carton::Snapshot-> new(path => " $dir /cpanfile.snapshot" );
46
+ $snapshot -> load;
36
47
37
- $ENV {PLENV_VERSION } = " 5.12.5" ;
48
+ return $snapshot ;
49
+ }
38
50
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
+ }
41
77
}
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 ) = @_ ;
42
88
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 " ;
45
97
}
46
98
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 );
49
117
50
- use Config;
51
118
mkpath " fatlib/version" ;
52
119
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
+ ) {
54
124
next if $file =~ / \b vxs\. pm$ / ;
55
125
(my $target = $file ) =~ s ! ^fatlib/$Config{archname}/! fatlib/! ;
56
126
rename $file => $target or die " $file => $target : $! " ;
0 commit comments