File Coverage

blib/lib/OTRS/OPM/Maker/Command/index.pm
Criterion Covered Total %
statement 73 73 100.0
branch 8 8 100.0
condition 9 9 100.0
subroutine 14 14 100.0
pod 4 4 100.0
total 108 108 100.0


line stmt bran cond sub pod time code
1             package OTRS::OPM::Maker::Command::index;
2             $OTRS::OPM::Maker::Command::index::VERSION = '0.19';
3 15     15   12176 use strict;
  15         39  
  15         485  
4 15     15   81 use warnings;
  15         31  
  15         473  
5              
6             # ABSTRACT: Build index for an OPM repository
7              
8 15     15   94 use File::Basename;
  15         56  
  15         1091  
9 15     15   2715 use File::Find::Rule;
  15         39607  
  15         159  
10 15     15   3737 use MIME::Base64 ();
  15         3292  
  15         348  
11 15     15   2272 use Sys::Hostname;
  15         4927  
  15         790  
12 15     15   2388 use Path::Class ();
  15         141541  
  15         324  
13 15     15   3487 use XML::LibXML;
  15         237933  
  15         126  
14 15     15   10945 use XML::LibXML::PrettyPrint;
  15         116292  
  15         1176  
15              
16 15     15   4014 use OTRS::OPM::Maker -command;
  15         40  
  15         163  
17              
18             sub abstract {
19 1     1 1 3510 return "build index for an OPM repository";
20             }
21              
22             sub usage_desc {
23 1     1 1 951 return "opmbuild index ";
24             }
25              
26             sub validate_args {
27 7     7 1 7612 my ($self, $opt, $args) = @_;
28            
29 7 100 100     109 $self->usage_error( 'need path to directory that contains opm files' ) if
      100        
      100        
30             !$args ||
31             'ARRAY' ne ref $args ||
32             !$args->[0] ||
33             !-d $args->[0];
34             }
35              
36             sub execute {
37 3     3 1 5649 my ($self, $opt, $args) = @_;
38            
39 3         10 my $dir = $args->[0];
40            
41 3         113 my @opm_files = File::Find::Rule->file->name( '*.opm' )->in( $dir );
42            
43 3         3073 my @packages;
44 3         52 my $pp = XML::LibXML::PrettyPrint->new(
45             indent_string => ' ',
46             element => {
47             compact => [qw(
48             Vendor Name Description Version Framework
49             ModuleRequired PackageRequired URL License
50             File
51             )],
52             },
53             );
54            
55 3         122 for my $opm_file ( sort @opm_files ) {
56 3         69 my $parser = XML::LibXML->new;
57 3         1145 my $tree = $parser->parse_file( $opm_file );
58            
59 3         1455 $tree->setStandalone( 0 );
60            
61 3         16 my $root_elem = $tree->getDocumentElement;
62 3         34 $root_elem->setNodeName( 'Package' );
63 3         20 $root_elem->removeAttribute( 'version' );
64            
65             # retrieve file information
66 3         15 my @files = $root_elem->findnodes( 'Filelist/File' );
67            
68             FILE:
69 3         154 for my $file ( @files ) {
70 6         45 my $location = $file->findvalue( '@Location' );
71            
72             # keep only documentation in file list
73 6 100       657 if ( $location !~ m{\A doc/}x ) {
74 4         41 $file->parentNode->removeChild( $file );
75             }
76             else {
77 2         14 my @child_nodes = $file->childNodes;
78            
79             # clean nodes
80 2         55 $file->removeChild( $_ ) for @child_nodes;
81 2         10 $file->removeAttribute( 'Encode' );
82 2         12 $file->setNodeName( 'FileDoc' );
83             }
84             }
85            
86             # remove unnecessary nodes
87 3         159 for my $node_name ( qw(Code Intro Database)) {
88 9         15 for my $phase ( qw(Install Upgrade Reinstall Uninstall) ) {
89 36         145 my @nodes = $root_elem->findnodes( $node_name . $phase );
90 36         750 $_->parentNode->removeChild( $_ ) for @nodes;
91             }
92             }
93            
94 3         9 for my $node_name ( qw(BuildHost BuildDate)) {
95 6         87 my @nodes = $root_elem->findnodes( $node_name );
96 6         152 $_->parentNode->removeChild( $_ ) for @nodes;
97             }
98            
99 3         83 my $file_node = XML::LibXML::Element->new( 'File' );
100 3         7 my $file_path = $opm_file;
101              
102 3 100       33 $file_path =~ s/\Q$dir// if $dir ne '.';
103 3 100       15 $file_path = '/' . $file_path if '/' ne substr $file_path, 0, 1;
104              
105 3         16 $file_node->appendText( $file_path );
106 3         19 $root_elem->addChild( $file_node );
107            
108 3         7 $pp->pretty_print( $tree );
109            
110 3         18423 my $xml = $tree->toString;
111 3         154 $xml =~ s{<\?xml .*? \?> \s+}{}x;
112            
113 3         15 push @packages, $xml;
114             }
115            
116 3         356 print sprintf qq~
117            
118             %s
119            
120             ~, join "", @packages;
121             }
122              
123             1;
124              
125             __END__