| File: | lib/Makefile/Update/Bakefile0.pm |
| Coverage: | 94.8% |
| line | stmt | bran | cond | sub | code |
|---|---|---|---|---|---|
| 1 | package Makefile::Update::Bakefile0; | ||||
| 2 | # ABSTRACT: Update bakefile-0.x files list. | ||||
| 3 | |||||
| 4 | 3 3 3 | use Exporter qw(import); | |||
| 5 | our @EXPORT = qw(update_bakefile_0); | ||||
| 6 | |||||
| 7 | 3 3 3 | use strict; | |||
| 8 | 3 3 3 | use warnings; | |||
| 9 | |||||
| 10 | # VERSION | ||||
| 11 | |||||
| 12 - 24 | =head1 SYNOPSIS
This is used exclusively to update wxWidgets C<files.bkl> and is probably not
useful outside of wxWidgets project.
use Makefile::Update::Bakefile0;
Makefile::Update::upmake('bakefiles/files.bkl', \&update_bakefile_0, $vars);
=head1 SEE ALSO
Makefile::Update
=cut | ||||
| 25 | |||||
| 26 | =func update_bakefile_0 | ||||
| 27 | |||||
| 28 | Update file with variable definitions in bakefile-0 format with the data | ||||
| 29 | from the hash ref containing all the file lists. | ||||
| 30 | |||||
| 31 | Takes the (open) file handles of the files to read and to write and the file | ||||
| 32 | lists hash ref as arguments. | ||||
| 33 | |||||
| 34 | Returns 1 if any changes were made. | ||||
| 35 | =cut | ||||
| 36 | |||||
| 37 | sub update_bakefile_0 | ||||
| 38 | { | ||||
| 39 | 3 | my ($in, $out, $vars) = @_; | |||
| 40 | |||||
| 41 | # Variable whose contents is being currently replaced. | ||||
| 42 | 3 | my $var; | |||
| 43 | |||||
| 44 | # Hash with files defined for the specified variable as keys and 0 or 1 | ||||
| 45 | # depending on whether we have seen them in the input file as values. | ||||
| 46 | my %files; | ||||
| 47 | |||||
| 48 | # Set to 1 if we made any changes. | ||||
| 49 | 3 | my $changed = 0; | |||
| 50 | 3 | while (<$in>) { | |||
| 51 | 63 | chomp; | |||
| 52 | |||||
| 53 | 63 | if (/<set var="(\w+)" hints="files">/ && exists $vars->{$1}) { | |||
| 54 | 6 | $var = $1; | |||
| 55 | 6 21 6 | %files = map { $_ => 0 } @{$vars->{$var}}; | |||
| 56 | } elsif (defined $var) { | ||||
| 57 | 27 | local $_ = $_; | |||
| 58 | 27 | s/<!-- .* -->//; | |||
| 59 | 27 | s/^\s+//; | |||
| 60 | 27 | s/\s+$//; | |||
| 61 | 27 | if (m{</set>}) { | |||
| 62 | # Check if we have any new files. | ||||
| 63 | # | ||||
| 64 | # TODO Insert them in alphabetical order. | ||||
| 65 | 6 | while (my ($file, $seen) = each(%files)) { | |||
| 66 | 21 | if (!$seen) { | |||
| 67 | # This file was wasn't present in the input, add it. | ||||
| 68 | # TODO Use proper indentation. | ||||
| 69 | 6 | print $out " $file\n"; | |||
| 70 | |||||
| 71 | 6 | $changed = 1; | |||
| 72 | } | ||||
| 73 | } | ||||
| 74 | |||||
| 75 | 6 | undef $var; | |||
| 76 | } elsif ($_) { | ||||
| 77 | 18 | if (not exists $files{$_}) { | |||
| 78 | # This file was removed. | ||||
| 79 | 3 | $changed = 1; | |||
| 80 | 3 | next; | |||
| 81 | } | ||||
| 82 | |||||
| 83 | 15 | if ($files{$_}) { | |||
| 84 | 0 | warn qq{Duplicate file "$_" in the definition of the } . | |||
| 85 | qq{variable "$var" at line $.\n} | ||||
| 86 | } else { | ||||
| 87 | 15 | $files{$_} = 1; | |||
| 88 | } | ||||
| 89 | } | ||||
| 90 | } | ||||
| 91 | |||||
| 92 | 60 | print $out "$_\n"; | |||
| 93 | } | ||||
| 94 | |||||
| 95 | $changed | ||||
| 96 | 3 | } | |||