File Coverage

blib/lib/OPM/Maker/Command/build.pm
Criterion Covered Total %
statement 79 80 98.7
branch 14 16 87.5
condition n/a
subroutine 14 14 100.0
pod 5 5 100.0
total 112 115 97.3


line stmt bran cond sub pod time code
1             package OPM::Maker::Command::build;
2             $OPM::Maker::Command::build::VERSION = '1.16';
3 22     22   17330 use strict;
  22         56  
  22         765  
4 22     22   122 use warnings;
  22         47  
  22         739  
5              
6             # ABSTRACT: Build OPM packages
7              
8 22     22   117 use Carp qw(croak);
  22         46  
  22         1205  
9 22     22   9803 use MIME::Base64 ();
  22         15479  
  22         655  
10 22     22   9867 use Sys::Hostname;
  22         22871  
  22         1288  
11 22     22   4337 use Path::Class ();
  22         270370  
  22         468  
12 22     22   9922 use XML::LibXML;
  22         631569  
  22         173  
13              
14 22     22   7140 use OPM::Maker -command;
  22         56  
  22         203  
15 22     22   104998 use OPM::Maker::Utils qw(reformat_size check_args_sopm);
  22         61  
  22         15421  
16              
17             sub abstract {
18 1     1 1 3790 return "build package files for Znuny, OTOBO or ((OTRS)) Community Edition";
19             }
20              
21             sub usage_desc {
22 1     1 1 1105 return "opmbuild build [--version ] [--basedir ] [--output ] ";
23             }
24              
25             sub opt_spec {
26             return (
27 1     1 1 686 [ "output=s", "Output path for OPM file" ],
28             [ "basedir=s", "Base directory of SOPM files" ],
29             [ "version=s", "Version to be used (override the one from the sopm file)" ],
30             );
31             }
32              
33             sub validate_args {
34 16     16 1 16532 my ($self, $opt, $args) = @_;
35              
36 16         57 my $sopm = check_args_sopm( $args );
37              
38 16 100       90 $self->usage_error( 'need path to .sopm' ) if
39             !$sopm;
40             }
41              
42             sub execute {
43 12     12 1 10919 my ($self, $opt, $args) = @_;
44              
45 12         48 my $file = check_args_sopm( $args );
46              
47 12         51 my $hostname = hostname;
48 12         538 my @time = localtime;
49 12         150 my $timestamp = sprintf "%04d-%02d-%02d %02d:%02d:%02d",
50             $time[5]+1900, $time[4]+1, $time[3],
51             $time[2], $time[1], $time[0];
52              
53 12         27 my %opts;
54 12 50       54 if ( !$ENV{OPM_UNSECURE} ) {
55 12         54 %opts = (
56             no_network => 1,
57             expand_entities => 0,
58             );
59             }
60              
61 12         187 my $size = -s $file;
62              
63             # if file is big, but not "too big"
64 12         32 my $max_size = 31_457_280;
65 12 100       42 if ( $ENV{OPM_MAX_SIZE} ) {
66 7         26 $max_size = reformat_size( $ENV{OPM_MAX_SIZE} );
67             }
68              
69 12 100       38 if ( $size > $max_size ) {
70 1         223 croak "$file too big (max size: $max_size bytes)";
71             }
72              
73 11 50       28 if ( $size > 10_000_000 ) {
74 0         0 $opts{huge} = 1;
75             }
76              
77 11         99 my $parser = XML::LibXML->new( %opts );
78 11         1138 my $tree = $parser->parse_file( $file );
79            
80 11         4188 my $sopm_path = Path::Class::File->new( $file );
81 11         1735 my $path = $sopm_path->dir;
82            
83 11         297 my $root_elem = $tree->getDocumentElement;
84            
85             # retrieve file information
86 11         79 my @files = $root_elem->findnodes( 'Filelist/File' );
87            
88             FILE:
89 11         769 for my $file ( @files ) {
90 22         104 my $name = $file->findvalue( '@Location' );
91             my $file_path = Path::Class::File->new(
92 22 100       2394 $opt->{basedir} ? $opt->{basedir} : $path, $name );
93 22         2155 my $file_content = $file_path->slurp;
94 22         5434 my $base64 = MIME::Base64::encode( $file_content );
95            
96 22         115 $file->setAttribute( 'Encode', 'Base64' );
97 22         699 $file->appendText( $base64 );
98             }
99            
100 11         100 my $build_date = XML::LibXML::Element->new( 'BuildDate' );
101 11         50 $build_date->appendText( $timestamp );
102            
103 11         34 my $build_host = XML::LibXML::Element->new( 'BuildHost' );
104 11         39 $build_host->appendText( $hostname );
105            
106 11         98 $root_elem->addChild( $build_date );
107 11         50 $root_elem->addChild( $build_host );
108            
109 11         500 my $version = $root_elem->find( 'Version' )->[0];
110 11 100       681 if ( $opt->{version} ) {
111 1         10 $version->removeChildNodes();
112 1         4 $version->appendText( $opt->{version} );
113             }
114 11         36 my $package_name = $root_elem->findvalue( 'Name' );
115 11         914 my $file_name = sprintf "%s-%s.opm", $package_name, $version->textContent;
116            
117 11         32 my $output_path = $opt->{output};
118 11 100       35 $output_path = $path if !$output_path;
119              
120 11         58 my $opm_path = Path::Class::File->new( $output_path, $file_name );
121 11         865 my $fh = $opm_path->openw;
122 11         14307 $fh->print( $tree->toString );
123              
124 11         1022 return $opm_path->stringify;
125             }
126              
127             1;
128              
129             __END__