create directory and create file, now with mode setting
[scpubgit/DKit.git] / lib / DX / Lib / FS / Action / CreateFile.pm
CommitLineData
4d2ad771 1package DX::Lib::FS::Action::CreateFile;
2
3use aliased 'DX::Lib::FS::Fact::PathStatus';
4use aliased 'DX::Lib::FS::Fact::PathStatusInfo';
640fa37e 5use POSIX ();
4d2ad771 6use Moo;
7
8with 'DX::Role::Action';
9
10has path => (is => 'ro', required => 1);
11
640fa37e 12has mode => (is => 'ro', predicate => 1);
13
4d2ad771 14sub expected_effect {
15 my ($self) = @_;
16 return +(path_status => PathStatus->new(
17 path => $self->path,
640fa37e 18 info => PathStatusInfo->new(
19 is_file => 1,
20 mode => ($self->has_mode ? $self->mode : '')
21 )
4d2ad771 22 ));
23}
24
25sub _do_run {
26 my ($self) = @_;
640fa37e 27 if ($self->has_mode) {
28 my $umask = umask(0000);
29 my $fd = POSIX::open(
30 $self->path, POSIX::O_CREAT | POSIX::O_RDONLY, oct($self->mode)
31 ) or do { umask($umask); die "Couldn't create ${\$self->path}: $!" };
32 POSIX::close($fd);
33 umask($umask);
34 } else {
35 open my $fh, '>>', $self->path or die "Couldn't create ${\$self->path}: $!";
36 }
4d2ad771 37 +(path_status => PathStatus->new(path => $self->path));
38}
39
401;