@@ -7,25 +7,29 @@ use utf8;
77use FindBin;
88use lib " $FindBin::Bin /local/lib/perl5" ;
99
10- use Cwd qw( realpath) ;
10+ use Cwd qw( realpath getcwd) ;
11+ use IO::File;
1112use Data::Dumper;
13+ use Digest::MD5;
1214use Getopt::Long;
1315use HTTP::Tiny;
1416use Config::Tiny;
1517use YAML::Tiny qw( LoadFile DumpFile) ;
16- use File::Basename qw( basename) ;
18+ use File::Basename qw( basename fileparse ) ;
1719use File::Spec::Functions qw( catfile) ;
18- use File::Temp qw( tempfile tmpnam) ;
20+ use File::Temp qw( tempfile tmpnam tempdir ) ;
1921
2022GetOptions(
21- ' recipe=s' => \my $recipes ,
22- ' repo=s' => \my $repos ,
23- ' pr=s' => \my $pull_reqs ,
23+ ' recipe=s' => \my $recipes ,
24+ ' repo=s' => \my $repos ,
25+ ' pr=s' => \my $pull_reqs ,
26+ ' archive=s' => \my $archives ,
2427);
2528
2629my $recipe_dir = realpath(" $FindBin::Bin /../recipe" );
2730my $repo_dir = realpath(" $FindBin::Bin /../repo" );
2831my $repo_base_dir = realpath(" $FindBin::Bin /../.." );
32+ my $archive_dir = realpath(" $FindBin::Bin /../archive" );
2933my $git_clone_cmd = realpath(" $FindBin::Bin /git-clone" );
3034
3135my $env = {};
@@ -221,6 +225,58 @@ for my $r ( split /\s+/, $repos ) {
221225 handle_recipe( { $r => { directory => $directory , }, } );
222226}
223227
228+ for my $a ( split /\s +/, $archives ) {
229+ my $file_path ;
230+ my ( $basename , $ext ) = ( fileparse( $a , qr /\. [a-zA-Z\. ]+$ / ) )[ 0, 2 ];
231+
232+ if ( $a =~ m { ^https?://} ) {
233+
234+ # download
235+ my $response = HTTP::Tiny-> new-> get($a );
236+ die " Failed: @{[Dumper($response )]}"
237+ unless $response -> {success } && length $response -> {content };
238+
239+ ( my $fh , $file_path ) = tempfile( undef , SUFFIX => $ext );
240+ print $fh $response -> {content };
241+ }
242+ elsif ( $a =~ m { ^/} ) {
243+ $file_path = $a ;
244+ }
245+ else {
246+ $file_path = catfile( $archive_dir , $a );
247+ }
248+
249+ die " File not found: $a " unless -f $file_path ;
250+
251+ # extract archive
252+ my $cwd = getcwd();
253+ my $directory = tempdir( ' /tmp/mt-dev-archive-temp-XXXXX' , );
254+
255+ chdir $directory ;
256+ my $extract_res
257+ = $file_path =~ m /\. zip$ / i
258+ ? ` unzip -q $file_path `
259+ : ` tar zxf $file_path ` ;
260+ if ($? ) {
261+ die " Failed to extract: $a " ;
262+ }
263+
264+ my $md5_ctx = Digest::MD5-> new;
265+ $md5_ctx -> addfile( IO::File-> new( $file_path , ' r' ) );
266+ print STDERR join ( ' :' , $basename . $ext , $md5_ctx -> hexdigest ) . " \n " ;
267+
268+ my @entries = grep {
269+ !m { ^(addons|mt-static|php|alt-tmpl|plugins|default_templates|search_templates|extlib|themes|import|tmpl|tools|lib|.*\. cgi)$}
270+ } glob (' *' );
271+ if ( @entries == 1 ) {
272+ $directory = catfile( $directory , $entries [0] );
273+ }
274+ chdir $cwd ;
275+
276+ $basename =~ s {\. } { _} g ; # "." causes problems in yaml files
277+ handle_recipe( { $basename => { directory => $directory , }, } );
278+ }
279+
224280if (@$yamls ) {
225281 $env -> {DOCKER_COMPOSE_YML_OVERRIDE } = join ( ' ' , map {" -f $_ " } @$yamls );
226282}
0 commit comments