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.15';
3 22     22   17849 use strict;
  22         45  
  22         651  
4 22     22   128 use warnings;
  22         40  
  22         638  
5              
6             # ABSTRACT: Build OPM packages
7              
8 22     22   104 use Carp qw(croak);
  22         38  
  22         1073  
9 22     22   8598 use MIME::Base64 ();
  22         12649  
  22         530  
10 22     22   8507 use Sys::Hostname;
  22         19611  
  22         1106  
11 22     22   5453 use Path::Class ();
  22         366649  
  22         449  
12 22     22   8372 use XML::LibXML;
  22         530658  
  22         2417  
13              
14 22     22   7130 use OPM::Maker -command;
  22         69  
  22         234  
15 22     22   76580 use OPM::Maker::Utils qw(reformat_size check_args_sopm);
  22         51  
  22         13690  
16              
17             sub abstract {
18 1     1 1 2844 return "build package files for Znuny, OTOBO or ((OTRS)) Community Edition";
19             }
20              
21             sub usage_desc {
22 1     1 1 798 return "opmbuild build [--version ] [--basedir ] [--output ] ";
23             }
24              
25             sub opt_spec {
26             return (
27 1     1 1 569 [ "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 13031 my ($self, $opt, $args) = @_;
35              
36 16         78 my $sopm = check_args_sopm( $args );
37              
38 16 100       70 $self->usage_error( 'need path to .sopm' ) if
39             !$sopm;
40             }
41              
42             sub execute {
43 12     12 1 8584 my ($self, $opt, $args) = @_;
44              
45 12         34 my $file = check_args_sopm( $args );
46              
47 12         43 my $hostname = hostname;
48 12         422 my @time = localtime;
49 12         86 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         19 my %opts;
54 12 50       47 if ( !$ENV{OPM_UNSECURE} ) {
55 12         36 %opts = (
56             no_network => 1,
57             expand_entities => 0,
58             );
59             }
60              
61 12         150 my $size = -s $file;
62              
63             # if file is big, but not "too big"
64 12         35 my $max_size = 31_457_280;
65 12 100       35 if ( $ENV{OPM_MAX_SIZE} ) {
66 7         20 $max_size = reformat_size( $ENV{OPM_MAX_SIZE} );
67             }
68              
69 12 100       29 if ( $size > $max_size ) {
70 1         182 croak "$file too big (max size: $max_size bytes)";
71             }
72              
73 11 50       23 if ( $size > 10_000_000 ) {
74 0         0 $opts{huge} = 1;
75             }
76              
77 11         80 my $parser = XML::LibXML->new( %opts );
78 11         888 my $tree = $parser->parse_file( $file );
79            
80 11         3396 my $sopm_path = Path::Class::File->new( $file );
81 11         1482 my $path = $sopm_path->dir;
82            
83 11         196 my $root_elem = $tree->getDocumentElement;
84            
85             # retrieve file information
86 11         61 my @files = $root_elem->findnodes( 'Filelist/File' );
87            
88             FILE:
89 11         555 for my $file ( @files ) {
90 22         76 my $name = $file->findvalue( '@Location' );
91             my $file_path = Path::Class::File->new(
92 22 100       1885 $opt->{basedir} ? $opt->{basedir} : $path, $name );
93 22         1814 my $file_content = $file_path->slurp;
94 22         4501 my $base64 = MIME::Base64::encode( $file_content );
95            
96 22         93 $file->setAttribute( 'Encode', 'Base64' );
97 22         544 $file->appendText( $base64 );
98             }
99            
100 11         71 my $build_date = XML::LibXML::Element->new( 'BuildDate' );
101 11         40 $build_date->appendText( $timestamp );
102            
103 11         27 my $build_host = XML::LibXML::Element->new( 'BuildHost' );
104 11         34 $build_host->appendText( $hostname );
105            
106 11         69 $root_elem->addChild( $build_date );
107 11         41 $root_elem->addChild( $build_host );
108            
109 11         396 my $version = $root_elem->find( 'Version' )->[0];
110 11 100       559 if ( $opt->{version} ) {
111 1         8 $version->removeChildNodes();
112 1         4 $version->appendText( $opt->{version} );
113             }
114 11         31 my $package_name = $root_elem->findvalue( 'Name' );
115 11         724 my $file_name = sprintf "%s-%s.opm", $package_name, $version->textContent;
116            
117 11         25 my $output_path = $opt->{output};
118 11 100       27 $output_path = $path if !$output_path;
119              
120 11         45 my $opm_path = Path::Class::File->new( $output_path, $file_name );
121 11         715 my $fh = $opm_path->openw;
122 11         1978 $fh->print( $tree->toString );
123              
124 11         818 return $opm_path->stringify;
125             }
126              
127             1;
128              
129             __END__