| line | stmt | bran | cond | sub | pod | time | code | 
| 1 |  |  |  |  |  |  | package WWW::Selenium::Utils; | 
| 2 |  |  |  |  |  |  |  | 
| 3 | 2 |  |  | 2 |  | 34840 | use 5.006; | 
|  | 2 |  |  |  |  | 7 |  | 
|  | 2 |  |  |  |  | 71 |  | 
| 4 | 2 |  |  | 2 |  | 9 | use strict; | 
|  | 2 |  |  |  |  | 6 |  | 
|  | 2 |  |  |  |  | 54 |  | 
| 5 | 2 |  |  | 2 |  | 18 | use warnings; | 
|  | 2 |  |  |  |  | 4 |  | 
|  | 2 |  |  |  |  | 49 |  | 
| 6 | 2 |  |  | 2 |  | 9 | use Carp; | 
|  | 2 |  |  |  |  | 3 |  | 
|  | 2 |  |  |  |  | 140 |  | 
| 7 | 2 |  |  | 2 |  | 11 | use File::Find; | 
|  | 2 |  |  |  |  | 2 |  | 
|  | 2 |  |  |  |  | 98 |  | 
| 8 | 2 |  |  | 2 |  | 7 | use Config; | 
|  | 2 |  |  |  |  | 2 |  | 
|  | 2 |  |  |  |  | 97 |  | 
| 9 | 2 |  |  | 2 |  | 679 | use WWW::Selenium::Utils::Actions qw(%selenium_actions); | 
|  | 2 |  |  |  |  | 4 |  | 
|  | 2 |  |  |  |  | 6603 |  | 
| 10 |  |  |  |  |  |  |  | 
| 11 |  |  |  |  |  |  | require Exporter; | 
| 12 |  |  |  |  |  |  | our @ISA = qw(Exporter); | 
| 13 |  |  |  |  |  |  | our @EXPORT_OK = qw(generate_suite cat parse_wikifile); | 
| 14 |  |  |  |  |  |  |  | 
| 15 |  |  |  |  |  |  | our $VERSION = '0.09'; | 
| 16 |  |  |  |  |  |  |  | 
| 17 |  |  |  |  |  |  | sub html_header; | 
| 18 |  |  |  |  |  |  | sub html_footer; | 
| 19 |  |  |  |  |  |  |  | 
| 20 |  |  |  |  |  |  | sub generate_suite { | 
| 21 | 25 |  |  | 25 | 1 | 40873 | my %opts = @_; | 
| 22 |  |  |  |  |  |  |  | 
| 23 | 25 |  |  |  |  | 86 | my %config = parse_config(); | 
| 24 | 25 |  | 100 |  |  | 138 | $opts{$_} ||= $config{$_} for keys %config; | 
| 25 |  |  |  |  |  |  |  | 
| 26 | 25 | 50 |  |  |  | 76 | croak "Must provide a directory of tests!\n" unless $opts{test_dir}; | 
| 27 |  |  |  |  |  |  |  | 
| 28 | 25 |  |  |  |  | 88 | _generate_suite( %opts ); | 
| 29 |  |  |  |  |  |  |  | 
| 30 |  |  |  |  |  |  | # create a test Suite index | 
| 31 | 17 | 100 |  |  |  | 137 | create_suite_index($opts{test_dir}, $opts{index}) if $opts{index}; | 
| 32 |  |  |  |  |  |  | } | 
| 33 |  |  |  |  |  |  |  | 
| 34 |  |  |  |  |  |  | sub _generate_suite { | 
| 35 | 25 |  |  | 25 |  | 65 | my %opts = @_; | 
| 36 | 25 |  |  |  |  | 50 | my $testdir = $opts{test_dir}; | 
| 37 | 25 |  |  |  |  | 41 | $testdir =~ s#/$##; | 
| 38 | 25 | 50 |  |  |  | 314 | croak "$testdir is not a directory!\n" unless -d $testdir; | 
| 39 | 25 |  | 33 |  |  | 152 | my $files = $opts{files} || test_files($testdir, $opts{perdir}, \%opts); | 
| 40 |  |  |  |  |  |  |  | 
| 41 | 25 |  |  |  |  | 58 | my $suite = "$testdir/TestSuite.html"; | 
| 42 | 25 |  |  |  |  | 811 | my $date = localtime; | 
| 43 |  |  |  |  |  |  |  | 
| 44 | 25 | 50 |  |  |  | 1674 | open(my $fh, ">$suite.tmp") or croak "Can't open $suite.tmp: $!"; | 
| 45 | 25 |  |  |  |  | 109 | print $fh html_header(title => "Test Suite", | 
| 46 |  |  |  |  |  |  | text  => "Generated at $date", | 
| 47 |  |  |  |  |  |  | ); | 
| 48 |  |  |  |  |  |  |  | 
| 49 | 25 |  |  |  |  | 39 | my $tests_added = 0; | 
| 50 | 25 |  |  |  |  | 114 | for (sort {$a cmp $b} @$files) { | 
|  | 21 |  |  |  |  | 68 |  | 
| 51 | 42 | 50 |  |  |  | 193 | next if /(?:\.tmp|TestSuite\.html)$/; | 
| 52 |  |  |  |  |  |  |  | 
| 53 | 42 |  |  |  |  | 56 | my $f = $_; | 
| 54 | 42 |  |  |  |  | 71 | my $fp = "$testdir/$f"; | 
| 55 | 42 | 100 |  |  |  | 134 | if ($f =~ /(.+)\.html$/) { | 
| 56 | 20 |  |  |  |  | 39 | my $basename = $1; | 
| 57 |  |  |  |  |  |  | # skip html files that we have or will generate | 
| 58 | 20 | 50 |  |  |  | 328 | next if -e "$testdir/$basename.wiki"; | 
| 59 |  |  |  |  |  |  | # find orphaned html files | 
| 60 | 20 |  |  |  |  | 71 | my $html = cat($fp); | 
| 61 | 20 | 100 | 66 |  |  | 206 | if ($html =~ m#Auto-generated from $testdir/$basename\.wiki# and | 
| 62 |  |  |  |  |  |  | !-e "$testdir/$basename.wiki") { | 
| 63 | 1 | 50 |  |  |  | 152 | print "Deleting orphaned file $fp\n" if $opts{verbose}; | 
| 64 | 1 | 50 |  |  |  | 87 | unlink $fp or croak "Can't unlink $fp: $!"; | 
| 65 | 1 |  |  |  |  | 6 | next; | 
| 66 |  |  |  |  |  |  | } | 
| 67 |  |  |  |  |  |  | } | 
| 68 |  |  |  |  |  |  |  | 
| 69 | 41 | 100 |  |  |  | 4378 | print "Adding row for $f\n" if $opts{verbose}; | 
| 70 | 41 | 100 |  |  |  | 167 | if (/\.wiki$/) { | 
| 71 | 22 |  |  |  |  | 110 | $f = wiki2html($fp, | 
| 72 |  |  |  |  |  |  | verbose => $opts{verbose}, | 
| 73 |  |  |  |  |  |  | base_href => $opts{base_href}); | 
| 74 | 14 |  |  |  |  | 177 | $f =~ s/^$testdir\///; | 
| 75 | 14 |  |  |  |  | 37 | $fp = "$testdir/$f"; | 
| 76 |  |  |  |  |  |  | } | 
| 77 | 33 |  |  |  |  | 83 | my $title = find_title($fp); | 
| 78 | 33 |  |  |  |  | 97 | print $fh qq(\t | 
| $title | 
\n); 
| 79 | 33 |  |  |  |  | 58 | $tests_added++; | 
| 80 |  |  |  |  |  |  | } | 
| 81 |  |  |  |  |  |  | #print the footer | 
| 82 | 17 |  |  |  |  | 32 | print $fh html_footer(); | 
| 83 | 17 | 50 |  |  |  | 544 | close $fh or croak "Can't close $suite.tmp: $!"; | 
| 84 |  |  |  |  |  |  |  | 
| 85 | 17 | 100 |  |  |  | 37 | if ($tests_added) { | 
| 86 |  |  |  |  |  |  | # rename into place | 
| 87 | 14 | 50 |  |  |  | 674 | rename "$suite.tmp", $suite or croak "can't rename $suite.tmp $suite: $!"; | 
| 88 | 14 | 50 |  |  |  | 1684 | print "Created new $suite\n" if $opts{verbose}; | 
| 89 |  |  |  |  |  |  | } | 
| 90 |  |  |  |  |  |  | else { | 
| 91 | 3 |  |  |  |  | 189 | unlink "$suite.tmp"; | 
| 92 |  |  |  |  |  |  | } | 
| 93 |  |  |  |  |  |  | } | 
| 94 |  |  |  |  |  |  |  | 
| 95 |  |  |  |  |  |  | sub test_files { | 
| 96 | 25 |  |  | 25 | 0 | 59 | my ($testdir, $perdir, $opts) = @_; | 
| 97 |  |  |  |  |  |  |  | 
| 98 | 25 |  |  |  |  | 42 | my @tests; | 
| 99 | 25 | 100 |  |  |  | 58 | if ($perdir) { | 
| 100 | 11 |  |  |  |  | 779 | my @files = glob("$testdir/*"); | 
| 101 | 11 |  |  |  |  | 26 | foreach my $f (@files) { | 
| 102 | 19 | 100 |  |  |  | 300 | if (-d $f) { | 
| 103 | 6 |  |  |  |  | 13 | $opts->{test_dir} = $f; | 
| 104 | 6 |  |  |  |  | 24 | generate_suite( %$opts ); | 
| 105 | 6 |  |  |  |  | 12 | next; | 
| 106 |  |  |  |  |  |  | } | 
| 107 | 13 |  |  |  |  | 45 | push @tests, $f; | 
| 108 |  |  |  |  |  |  | } | 
| 109 |  |  |  |  |  |  | } | 
| 110 |  |  |  |  |  |  | else { | 
| 111 | 14 |  |  | 44 |  | 1020 | find(sub { push @tests, $File::Find::name }, $testdir); | 
|  | 44 |  |  |  |  | 1349 |  | 
| 112 |  |  |  |  |  |  | } | 
| 113 |  |  |  |  |  |  |  | 
| 114 | 25 | 100 |  |  |  | 80 | @tests = grep { !-d $_ and m#(?:wiki|html)$# } @tests; | 
|  | 57 |  |  |  |  | 876 |  | 
| 115 | 25 |  |  |  |  | 46 | for (@tests) { | 
| 116 | 42 |  |  |  |  | 356 | s#^$testdir/?##; | 
| 117 | 42 |  |  |  |  | 105 | s#^.+/tests/##; | 
| 118 |  |  |  |  |  |  | } | 
| 119 |  |  |  |  |  |  |  | 
| 120 | 25 |  |  |  |  | 102 | return \@tests; | 
| 121 |  |  |  |  |  |  | } | 
| 122 |  |  |  |  |  |  |  | 
| 123 |  |  |  |  |  |  | sub wiki2html { | 
| 124 | 22 |  |  | 22 | 0 | 86 | my ($wiki, %opts) = @_; | 
| 125 | 22 |  |  |  |  | 41 | my $verbose = $opts{verbose}; | 
| 126 | 22 |  |  |  |  | 29 | my $base_href = $opts{base_href}; | 
| 127 | 22 | 100 |  |  |  | 48 | $base_href =~ s#/$## if $base_href; | 
| 128 |  |  |  |  |  |  |  | 
| 129 | 22 |  |  |  |  | 92 | (my $html = $wiki) =~ s#\.wiki$#.html#; | 
| 130 |  |  |  |  |  |  |  | 
| 131 | 22 |  |  |  |  | 67 | my $results = parse_wikifile(filename => $wiki, | 
| 132 |  |  |  |  |  |  | base_href => $base_href); | 
| 133 | 22 | 100 |  |  |  | 72 | if ($results->{errors}) { | 
| 134 | 8 |  |  |  |  | 163 | croak "Error parsing file $wiki:\n  " | 
| 135 | 8 |  |  |  |  | 24 | . join("\n  ", @{$results->{errors}}) | 
| 136 |  |  |  |  |  |  | . "\n"; | 
| 137 |  |  |  |  |  |  | } | 
| 138 |  |  |  |  |  |  |  | 
| 139 | 14 | 50 |  |  |  | 1603 | print "Generating html for ($results->{title}): $html\n" if $verbose; | 
| 140 | 14 | 50 |  |  |  | 1032 | open(my $out, ">$html") or croak "Can't open $html: $!"; | 
| 141 | 14 |  |  |  |  | 74 | print $out html_header( title => $results->{title}, | 
| 142 |  |  |  |  |  |  | text => "Auto-generated from $wiki ");
 | 
| 143 | 14 |  |  |  |  | 22 | foreach my $r (@{$results->{rows}}) { | 
|  | 14 |  |  |  |  | 32 |  | 
| 144 | 58 |  |  |  |  | 302 | print $out "\n\t | 
", 
| 145 |  |  |  |  |  |  | join('', map " | $_", @$r), | 
| 146 |  |  |  |  |  |  | " | 
\n"; 
| 147 |  |  |  |  |  |  | } | 
| 148 |  |  |  |  |  |  |  | 
| 149 | 14 |  |  |  |  | 330 | my $now = localtime; | 
| 150 | 14 |  |  |  |  | 66 | print $out html_footer(" Auto-generated from $wiki at $now\n");
 | 
| 151 | 14 | 50 |  |  |  | 597 | close $out or croak "Can't write $html: $!"; | 
| 152 | 14 |  |  |  |  | 95 | return $html; | 
| 153 |  |  |  |  |  |  | } | 
| 154 |  |  |  |  |  |  |  | 
| 155 |  |  |  |  |  |  | sub parse_wikifile { | 
| 156 | 23 |  |  | 23 | 0 | 75 | my %opts = @_; | 
| 157 | 23 |  |  |  |  | 37 | my $filename = $opts{filename}; | 
| 158 | 23 |  |  |  |  | 29 | my $base_href = $opts{base_href}; | 
| 159 | 23 |  |  |  |  | 35 | my $include   = $opts{include}; | 
| 160 | 23 |  |  |  |  | 120 | (my $base_dir = $filename) =~ s#(.+)/.+$#$1#; | 
| 161 |  |  |  |  |  |  |  | 
| 162 | 23 |  |  |  |  | 40 | my $title; | 
| 163 |  |  |  |  |  |  | my @rows; | 
| 164 | 0 |  |  |  |  | 0 | my @errors; | 
| 165 |  |  |  |  |  |  |  | 
| 166 |  |  |  |  |  |  | # $. and $_ are global, so we don't need to pass them in | 
| 167 |  |  |  |  |  |  | # to this closure | 
| 168 |  |  |  |  |  |  | my $parse_error = sub { | 
| 169 | 9 |  |  | 9 |  | 55 | push @errors, "line $.: $_[0] ($_)"; | 
| 170 | 23 |  |  |  |  | 95 | }; | 
| 171 |  |  |  |  |  |  |  | 
| 172 | 23 | 50 |  |  |  | 771 | open(my $in, $filename) or croak "Can't open $filename: $!"; | 
| 173 | 23 |  |  |  |  | 251 | while(<$in>) { | 
| 174 | 167 |  |  |  |  | 484 | s/^\s*//; | 
| 175 | 167 | 100 | 66 |  |  | 821 | next if /^#/ or /^\s*$/; | 
| 176 | 122 |  |  |  |  | 122 | chomp; | 
| 177 |  |  |  |  |  |  |  | 
| 178 |  |  |  |  |  |  | # included files won't have a title | 
| 179 | 122 | 100 | 100 |  |  | 909 | if (not defined $title and not $include) { | 
|  |  | 100 |  |  |  |  |  | 
|  |  | 100 |  |  |  |  |  | 
| 180 | 22 |  |  |  |  | 25 | $title = $_; | 
| 181 | 22 |  |  |  |  | 69 | $title =~ s#^\s*##; | 
| 182 | 22 |  |  |  |  | 39 | $title =~ s#^\|(.+)\|$#$1#; | 
| 183 | 22 |  |  |  |  | 53 | next; | 
| 184 |  |  |  |  |  |  | } | 
| 185 |  |  |  |  |  |  | elsif (/^\s*                   # some possible leading space | 
| 186 |  |  |  |  |  |  | \|\s*([^\|]+?)\s*\|    # cmd | 
| 187 |  |  |  |  |  |  | (?:\s*([^\|]+?)\s*\|)? # opt1 (optional) | 
| 188 |  |  |  |  |  |  | (?:\s*([^\|]+?)\s*\|)? # opt2 (optional) | 
| 189 |  |  |  |  |  |  | \s*$/x) { | 
| 190 | 94 |  |  |  |  | 238 | my ($cmd, $opt1, $opt2) = ($1,$2,$3); | 
| 191 | 94 | 50 | 0 |  |  | 151 | $parse_error->("No command found") and next unless $cmd; | 
| 192 |  |  |  |  |  |  |  | 
| 193 | 94 |  |  |  |  | 102 | my $numargs = (grep { defined $_ } ($opt1, $opt2)); | 
|  | 188 |  |  |  |  | 333 |  | 
| 194 | 94 |  |  |  |  | 169 | my $expected_args = $selenium_actions{lc($cmd)}; | 
| 195 | 94 | 100 | 100 |  |  | 257 | if (defined $expected_args and $expected_args != $numargs) { | 
| 196 | 4 |  |  |  |  | 14 | $parse_error->("Incorrect number of arguments for $cmd"); | 
| 197 | 4 |  |  |  |  | 18 | next; | 
| 198 |  |  |  |  |  |  | } | 
| 199 |  |  |  |  |  |  |  | 
| 200 | 90 | 50 |  |  |  | 149 | $opt1 = ' ' unless defined $opt1; | 
| 201 | 90 | 100 |  |  |  | 157 | $opt2 = ' ' unless defined $opt2; | 
| 202 | 90 | 100 | 100 |  |  | 159 | if ($base_href and ($cmd eq "open" or | 
|  |  |  | 66 |  |  |  |  | 
| 203 |  |  |  |  |  |  | $cmd =~ /(?:assert|verify)Location/)) { | 
| 204 | 2 |  |  |  |  | 7 | $opt1 =~ s#^/##; | 
| 205 | 2 |  |  |  |  | 6 | $opt1 = "$base_href/$opt1"; | 
| 206 |  |  |  |  |  |  | } | 
| 207 | 90 |  |  |  |  | 534 | push @rows, [ $cmd, $opt1, $opt2 ]; | 
| 208 |  |  |  |  |  |  | } | 
| 209 |  |  |  |  |  |  | elsif (/^\s*include\s+(.+)\s*$/) { | 
| 210 | 2 |  |  |  |  | 4 | my $incl = $1; | 
| 211 | 2 | 50 |  |  |  | 20 | $incl = "$base_dir/$1" unless -e $1; | 
| 212 | 2 | 100 |  |  |  | 26 | unless (-e $incl) { | 
| 213 | 1 |  |  |  |  | 5 | $parse_error->("Can't include $incl - file doesn't exist!"); | 
| 214 | 1 |  |  |  |  | 8 | next; | 
| 215 |  |  |  |  |  |  | } | 
| 216 | 1 |  |  |  |  | 9 | my $r = parse_wikifile( %opts, filename => $incl, | 
| 217 |  |  |  |  |  |  | include => 1); | 
| 218 | 1 | 50 |  |  |  | 4 | push @rows,   @{$r->{rows}}   if $r->{rows}; | 
|  | 1 |  |  |  |  | 4 |  | 
| 219 | 1 | 50 |  |  |  | 13 | push @errors, @{$r->{errors}} if $r->{errors}; | 
|  | 0 |  |  |  |  | 0 |  | 
| 220 |  |  |  |  |  |  | } | 
| 221 |  |  |  |  |  |  | else { | 
| 222 | 4 |  |  |  |  | 9 | $parse_error->("Invalid line"); | 
| 223 |  |  |  |  |  |  | } | 
| 224 |  |  |  |  |  |  | } | 
| 225 | 23 | 50 |  |  |  | 238 | close $in or croak "Can't close $filename: $!"; | 
| 226 | 23 | 100 |  |  |  | 278 | return { $title ? (title => $title) : (), | 
|  |  | 100 |  |  |  |  |  | 
| 227 |  |  |  |  |  |  | @errors ? (errors => \@errors) : (), | 
| 228 |  |  |  |  |  |  | rows  => \@rows, | 
| 229 |  |  |  |  |  |  | }; | 
| 230 |  |  |  |  |  |  | } | 
| 231 |  |  |  |  |  |  |  | 
| 232 |  |  |  |  |  |  | sub find_title { | 
| 233 | 33 |  |  | 33 | 0 | 39 | my $filename = shift; | 
| 234 |  |  |  |  |  |  |  | 
| 235 | 33 | 50 |  |  |  | 961 | open(my $fh, $filename) or croak "Can't open $filename: $!"; | 
| 236 | 33 |  |  |  |  | 47 | my $contents; | 
| 237 |  |  |  |  |  |  | { | 
| 238 | 33 |  |  |  |  | 30 | local $/; | 
|  | 33 |  |  |  |  | 95 |  | 
| 239 | 33 |  |  |  |  | 575 | $contents = <$fh>; | 
| 240 |  |  |  |  |  |  | } | 
| 241 | 33 | 50 |  |  |  | 310 | close $fh or croak "Can't close $filename: $!"; | 
| 242 |  |  |  |  |  |  |  | 
| 243 | 33 | 50 |  |  |  | 70 | return $filename unless $contents; | 
| 244 | 33 | 100 |  |  |  | 209 | return $1 if $contents =~ m#\s*(.+)\s*#; | 
| 245 | 19 | 50 |  |  |  | 181 | return $1 if $filename =~ m#^.+/(.+)\.html$#; | 
| 246 | 0 |  |  |  |  | 0 | return $filename; | 
| 247 |  |  |  |  |  |  | } | 
| 248 |  |  |  |  |  |  |  | 
| 249 |  |  |  |  |  |  | sub create_suite_index { | 
| 250 | 3 |  |  | 3 | 0 | 4 | my ($testdir, $index) = @_; | 
| 251 | 3 |  |  |  |  | 6 | my @suites; | 
| 252 | 3 | 100 |  | 15 |  | 196 | find( sub { push @suites, $File::Find::name if /TestSuite\.html$/ }, $testdir); | 
|  | 15 |  |  |  |  | 429 |  | 
| 253 | 3 | 100 |  |  |  | 15 | return unless @suites; | 
| 254 |  |  |  |  |  |  |  | 
| 255 | 2 |  |  |  |  | 12 | (my $index_dir = $index) =~ s#^(.+)/.+$#$1#; | 
| 256 | 2 | 50 |  |  |  | 120 | open(my $fh, ">$index.tmp") or croak "Can't open $index.tmp: $!"; | 
| 257 | 2 |  |  |  |  | 7 | print $fh html_header(title => "Selenium TestSuites"); | 
| 258 | 2 |  |  |  |  | 5 | foreach my $s (@suites) { | 
| 259 | 3 |  |  |  |  | 4 | my $name = "Main"; | 
| 260 | 3 | 100 |  |  |  | 47 | $name = $1 if $s =~ m#\Q$testdir\E/(.+)/TestSuite\.html$#; | 
| 261 | 3 |  |  |  |  | 17 | (my $link = $s) =~ s#\Q$index_dir\E/##; | 
| 262 | 3 |  |  |  |  | 12 | print $fh qq(\t | 
| $name TestSuite | 
\n); 
| 263 |  |  |  |  |  |  | } | 
| 264 | 2 |  |  |  |  | 5 | print $fh html_footer; | 
| 265 | 2 | 50 |  |  |  | 67 | close $fh or croak "Can't write $index.tmp: $!"; | 
| 266 | 2 | 50 |  |  |  | 166 | rename "$index.tmp", $index or croak "Can't rename $index.tmp to $index: $!"; | 
| 267 |  |  |  |  |  |  | } | 
| 268 |  |  |  |  |  |  |  | 
| 269 |  |  |  |  |  |  | sub html_header { | 
| 270 | 41 |  |  | 41 | 0 | 176 | my %opts = @_; | 
| 271 | 41 |  | 50 |  |  | 100 | my $title = $opts{title} || 'Generic Title'; | 
| 272 | 41 |  | 100 |  |  | 90 | my $text = $opts{text} || ''; | 
| 273 |  |  |  |  |  |  |  | 
| 274 | 41 |  |  |  |  | 108 | my $header = < | 
| 275 |  |  |  |  |  |  |  | 
| 276 |  |  |  |  |  |  |  | 
| 277 |  |  |  |  |  |  |  | 
| 278 |  |  |  |  |  |  | http-equiv="content-type"> | 
| 279 |  |  |  |  |  |  | $title | 
| 280 |  |  |  |  |  |  |  | 
| 281 |  |  |  |  |  |  |  | 
| 282 |  |  |  |  |  |  | $text | 
| 283 |  |  |  |  |  |  |  | 
| 297 |  |  |  |  |  |  | $text | 
| 298 |  |  |  |  |  |  |  | 
| 299 |  |  |  |  |  |  |  | 
| 300 |  |  |  |  |  |  | EOT | 
| 301 |  |  |  |  |  |  | } | 
| 302 |  |  |  |  |  |  |  | 
| 303 |  |  |  |  |  |  | sub cat { | 
| 304 | 33 |  |  | 33 | 0 | 21307 | my $file = shift; | 
| 305 | 33 |  |  |  |  | 36 | my $contents; | 
| 306 | 33 |  |  |  |  | 46 | eval { | 
| 307 | 33 | 50 |  |  |  | 1011 | open(my $fh, $file) or croak "Can't open $file: $!"; | 
| 308 |  |  |  |  |  |  | { | 
| 309 | 33 |  |  |  |  | 52 | local $/; | 
|  | 33 |  |  |  |  | 98 |  | 
| 310 | 33 |  |  |  |  | 686 | $contents = <$fh>; | 
| 311 |  |  |  |  |  |  | } | 
| 312 | 33 | 50 |  |  |  | 429 | close $fh or croak "Can't close $file: $!"; | 
| 313 |  |  |  |  |  |  | }; | 
| 314 | 33 | 50 |  |  |  | 66 | warn if $@; | 
| 315 | 33 |  |  |  |  | 213 | return $contents; | 
| 316 |  |  |  |  |  |  | } | 
| 317 |  |  |  |  |  |  |  | 
| 318 |  |  |  |  |  |  | sub parse_config { | 
| 319 | 25 |  | 66 | 25 | 0 | 1262 | my $file = ($ENV{SELUTILS_ROOT} || $Config{prefix}) . "/etc/selutils.conf"; | 
| 320 | 25 | 100 |  |  |  | 3567 | return () unless -e $file; | 
| 321 |  |  |  |  |  |  | # try evaling the file (current file format) | 
| 322 | 5 | 50 |  |  |  | 153 | open(my $fh, $file) or croak "Can't open $file: $!"; | 
| 323 | 5 |  |  |  |  | 10 | my $contents; | 
| 324 |  |  |  |  |  |  | { | 
| 325 | 5 |  |  |  |  | 6 | local $/ = undef; | 
|  | 5 |  |  |  |  | 18 |  | 
| 326 | 5 |  |  |  |  | 91 | $contents = <$fh>; | 
| 327 |  |  |  |  |  |  | } | 
| 328 | 5 | 50 |  |  |  | 50 | close $fh or die "Can't close $file: $!"; | 
| 329 |  |  |  |  |  |  |  | 
| 330 | 5 |  |  |  |  | 8 | our $perdir; | 
| 331 | 5 |  |  |  |  | 7 | our $test_dir; | 
| 332 | 5 |  |  |  |  | 7 | our $index; | 
| 333 |  |  |  |  |  |  | { | 
| 334 | 5 |  |  | 2 |  | 7 | local $SIG{__WARN__} = sub {}; # hide eval errors | 
|  | 5 |  |  |  |  | 35 |  | 
|  | 2 |  |  |  |  | 33 |  | 
| 335 | 5 |  |  |  |  | 375 | eval $contents; | 
| 336 |  |  |  |  |  |  | } | 
| 337 | 5 |  |  |  |  | 48 | my $eval_err = $@; | 
| 338 |  |  |  |  |  |  |  | 
| 339 |  |  |  |  |  |  | # failed to eval file - try reading as an old style config | 
| 340 | 5 | 100 |  |  |  | 12 | if ($eval_err) { | 
| 341 | 1 |  |  |  |  | 10 | while($contents =~ /^\s*(\w+)\s*=\s*['"]?([^'"]+)['"]?\s*$/mg) { | 
| 342 | 2 | 100 |  |  |  | 6 | $perdir = $2 if $1 eq 'perdir'; | 
| 343 | 2 | 50 |  |  |  | 5 | $index = $2 if $1 eq 'index'; | 
| 344 | 2 | 100 |  |  |  | 10 | $test_dir = $2 if $1 eq 'test_dir'; | 
| 345 |  |  |  |  |  |  | } | 
| 346 | 1 | 50 |  |  |  | 3 | warn "$file eval error: $eval_err\n" unless $test_dir; | 
| 347 |  |  |  |  |  |  | } | 
| 348 | 5 |  |  |  |  | 20 | my %config = ( perdir => $perdir, | 
| 349 |  |  |  |  |  |  | test_dir => $test_dir, | 
| 350 |  |  |  |  |  |  | index => $index, | 
| 351 |  |  |  |  |  |  | ); | 
| 352 | 5 |  |  |  |  | 48 | return %config; | 
| 353 |  |  |  |  |  |  | } | 
| 354 |  |  |  |  |  |  |  | 
| 355 |  |  |  |  |  |  | 1; | 
| 356 |  |  |  |  |  |  | __END__ |