Increase version to v0.12.1
[Fedora-Rebuild.git] / lib / Fedora / Rebuild / Package / ListLog.pm
blob9c6f03c5e4658aeae6d612f49767c4a839499d20
1 package Fedora::Rebuild::Package::ListLog;
2 use strict;
3 use warnings;
4 use version 0.77; our $VERSION = version->declare("v0.12.1");
6 use Moose;
7 use Carp;
8 use IO::Handle;
9 use Fcntl qw(:flock);
10 use namespace::clean;
12 =encoding utf8
14 =head1
16 Fedora::Rebuild::Package::ListLog - Append a package name to a file
18 =head1 SYNOPSIS
20 # Prepare a package
21 use threads::shared;
22 use Fedora::Rebuild::Package;
23 my $package = Fedora::Rebuild::Package->new(...);
24 $package->provides(shared_clone(...));
27 # Create a log file
28 my $log = Fedora::Rebuild::Package::ListLog->new(file => 'file');
30 # Log the package into a file
31 $log->log($package);
33 # Here the log file has been closed
35 =head1 DESCRIPTION
37 The class allows to append a L<Fedora::Rebuild::Package> name into a file in
38 a safe way.
40 =head1 METHODS
42 =head2 new(file => $file_name)
44 This class method appends the $package name into the $file_name. Mandatory
45 attribute is I<log>, a file where to log the package names to.
47 =cut
49 has file => (
50 is => 'ro',
51 isa => 'Str',
52 required => 1
55 # Private log file descriptor
56 has logfd => (
57 is => 'ro',
58 isa => 'FileHandle',
59 lazy_build => 1,
60 init_arg => undef
63 sub BUILD {
64 my $self = shift;
66 if (! defined $self->file || $self->file eq '') {
67 croak "Invalid `file' attributed passed to ListLog constructor";
71 sub _build_logfd {
72 my $self = shift;
73 my $file = IO::Handle->new();
74 open($file, '>>', $self->file) or
75 croak "Could not open `" . $self->file . "' for appending: $!";
76 return $file;
79 =head2 log($package)
81 Append L<Fedora::Rebuild::Package> package name into the log file. This
82 operation is atomic.
84 =cut
86 sub log {
87 my ($self, $package) = @_;
89 flock($self->logfd, LOCK_EX) or
90 croak "Could not lock `" . $self->file . "': $!";
92 $self->logfd->print($package->name . "\n") or
93 croak "Could not write data into `" . $self->file . "': $!";
94 $self->logfd->flush && $self->logfd->sync or
95 croak "Could not flush `" . $self->file . "': $!";
97 flock($self->logfd, LOCK_UN) or
98 croak "Could not unlock `" . $self->file . "': $!";
102 sub DEMOLISH {
103 my $self = shift;
104 close($self->logfd) or
105 croak "Could not close `" . $self->file . "': $!";