file content handling
[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';
8c3eab7b 5use Fcntl qw(O_CREAT O_WRONLY);
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) = @_;
8c3eab7b 27 my $fh;
640fa37e 28 if ($self->has_mode) {
29 my $umask = umask(0000);
8c3eab7b 30 sysopen(
31 $fh, $self->path, O_CREAT | O_WRONLY, oct($self->mode)
640fa37e 32 ) or do { umask($umask); die "Couldn't create ${\$self->path}: $!" };
640fa37e 33 umask($umask);
34 } else {
8c3eab7b 35 sysopen($fh, $self->path, O_CREAT | O_WRONLY)
36 or die "Couldn't create ${\$self->path}: $!";
640fa37e 37 }
4d2ad771 38 +(path_status => PathStatus->new(path => $self->path));
39}
40
411;