rewrite file correctly chaining from create file
[scpubgit/DKit.git] / lib / DX / Lib / FS / Action / CreateFile.pm
CommitLineData
4d2ad771 1package DX::Lib::FS::Action::CreateFile;
2
e02a5c0a 3use aliased 'DX::Lib::FS::Fact::FileContent';
4d2ad771 4use aliased 'DX::Lib::FS::Fact::PathStatus';
5use aliased 'DX::Lib::FS::Fact::PathStatusInfo';
8c3eab7b 6use Fcntl qw(O_CREAT O_WRONLY);
4d2ad771 7use Moo;
8
9with 'DX::Role::Action';
10
11has path => (is => 'ro', required => 1);
12
640fa37e 13has mode => (is => 'ro', predicate => 1);
14
e02a5c0a 15has data => (is => 'ro', default => sub { '' });
16
4d2ad771 17sub expected_effect {
18 my ($self) = @_;
19 return +(path_status => PathStatus->new(
20 path => $self->path,
640fa37e 21 info => PathStatusInfo->new(
22 is_file => 1,
23 mode => ($self->has_mode ? $self->mode : '')
24 )
e02a5c0a 25 ), file_content => FileContent->new(
26 path => $self->path,
27 data => $self->data,
4d2ad771 28 ));
29}
30
31sub _do_run {
32 my ($self) = @_;
8c3eab7b 33 my $fh;
640fa37e 34 if ($self->has_mode) {
35 my $umask = umask(0000);
8c3eab7b 36 sysopen(
37 $fh, $self->path, O_CREAT | O_WRONLY, oct($self->mode)
640fa37e 38 ) or do { umask($umask); die "Couldn't create ${\$self->path}: $!" };
640fa37e 39 umask($umask);
40 } else {
8c3eab7b 41 sysopen($fh, $self->path, O_CREAT | O_WRONLY)
42 or die "Couldn't create ${\$self->path}: $!";
640fa37e 43 }
e02a5c0a 44 print $fh $self->data if length($self->data);
4d2ad771 45 +(path_status => PathStatus->new(path => $self->path));
46}
47
481;