Commit | Line | Data |
4d2ad771 |
1 | package DX::Lib::FS::Action::CreateFile; |
2 | |
3 | use aliased 'DX::Lib::FS::Fact::PathStatus'; |
4 | use aliased 'DX::Lib::FS::Fact::PathStatusInfo'; |
8c3eab7b |
5 | use Fcntl qw(O_CREAT O_WRONLY); |
4d2ad771 |
6 | use Moo; |
7 | |
8 | with 'DX::Role::Action'; |
9 | |
10 | has path => (is => 'ro', required => 1); |
11 | |
640fa37e |
12 | has mode => (is => 'ro', predicate => 1); |
13 | |
4d2ad771 |
14 | sub 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 | |
25 | sub _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 | |
41 | 1; |