File Coverage

lib/OODoc/Manifest.pm
Criterion Covered Total %
statement 21 67 31.3
branch 0 18 0.0
condition 0 5 0.0
subroutine 7 18 38.8
pod 7 8 87.5
total 35 116 30.1


line stmt bran cond sub pod time code
1             # This code is part of Perl distribution OODoc version 3.05.
2             # The POD got stripped from this file by OODoc version 3.05.
3             # For contributors see file ChangeLog.
4              
5             # This software is copyright (c) 2003-2025 by Mark Overmeer.
6              
7             # This is free software; you can redistribute it and/or modify it under
8             # the same terms as the Perl 5 programming language system itself.
9             # SPDX-License-Identifier: Artistic-1.0-Perl OR GPL-1.0-or-later
10              
11              
12             package OODoc::Manifest;{
13             our $VERSION = '3.05';
14             }
15              
16 2     2   14 use parent 'OODoc::Object';
  2         3  
  2         13  
17              
18 2     2   151 use strict;
  2         5  
  2         59  
19 2     2   7 use warnings;
  2         3  
  2         108  
20              
21 2     2   8 use Log::Report 'oodoc';
  2         3  
  2         10  
22              
23 2     2   575 use File::Basename 'dirname';
  2         4  
  2         232  
24              
25             #--------------------
26              
27 2     2   10 use overload '@{}' => sub { [ shift->files ] };
  2     0   3  
  2         40  
  0         0  
28 2     2   166 use overload bool => sub {1};
  2     0   3  
  2         8  
  0            
29              
30             #--------------------
31              
32             sub init($)
33 0     0 0   { my ($self, $args) = @_;
34 0 0         $self->SUPER::init($args) or return;
35              
36 0           my $filename = $self->{OM_filename} = delete $args->{filename};
37              
38 0           $self->{OM_files} = {};
39 0 0 0       $self->read if defined $filename && -e $filename;
40 0           $self->modified(0);
41 0           $self;
42             }
43              
44             #--------------------
45              
46 0     0 1   sub filename() { $_[0]->{OM_filename} }
47              
48             #--------------------
49              
50 0     0 1   sub files() { keys %{ $_[0]->{OM_files}} }
  0            
51              
52              
53             sub add(@)
54 0     0 1   { my $self = shift;
55 0           while(@_)
56 0           { my $add = $self->relative(shift);
57 0 0         $self->modified(1) unless exists $self->{O_file}{$add};
58 0           $self->{OM_files}{$add}++;
59             }
60 0           $self;
61             }
62              
63             #--------------------
64              
65             sub read()
66 0     0 1   { my $self = shift;
67 0           my $filename = $self->filename;
68              
69 0 0         open my $file, "<:encoding(utf8)", $filename
70             or fault __x"cannot read manifest file {file}", file => $filename;
71              
72 0           my @dist = $file->getlines;
73 0           $file->close;
74              
75 0           s/\s+.*\n?$// for @dist;
76 0           $self->{OM_files}{$_}++ foreach @dist;
77 0           $self;
78             }
79              
80              
81             sub modified(;$)
82 0     0 1   { my $self = shift;
83 0 0         @_ ? $self->{OM_modified} = @_ : $self->{OM_modified};
84             }
85              
86              
87             sub write()
88 0     0 1   { my $self = shift;
89 0 0         return unless $self->modified;
90 0   0       my $filename = $self->filename || return $self;
91              
92 0 0         open my $file, ">:encoding(utf8)", $filename
93             or fault __x"cannot write manifest {file}", file => $filename;
94              
95 0           $file->print($_, "\n") foreach sort $self->files;
96 0           $file->close;
97              
98 0           $self->modified(0);
99 0           $self;
100             }
101              
102 0     0     sub DESTROY() { $_[0]->write }
103              
104              
105             sub relative($)
106 0     0 1   { my ($self, $filename) = @_;
107              
108 0           my $dir = dirname $self->filename;
109 0 0         return $filename if $dir eq '.';
110              
111             # normalize path for windows
112 0           s!\\!/!g for $filename, $dir;
113              
114 0 0         if(substr($filename, 0, length($dir)+1) eq "$dir/")
115 0           { substr $filename, 0, length($dir)+1, '';
116 0           return $filename;
117             }
118              
119 0           warning __x"MANIFEST file {file} lists filename outside (sub)directory: {out}", file => $self->filename, out => $filename;
120              
121 0           $filename;
122             }
123              
124             1;