Commit | Line | Data |
4d2ad771 |
1 | package DX::Lib::FS::Action::CreateFile; |
2 | |
e02a5c0a |
3 | use aliased 'DX::Lib::FS::Fact::FileContent'; |
4d2ad771 |
4 | use aliased 'DX::Lib::FS::Fact::PathStatus'; |
5 | use aliased 'DX::Lib::FS::Fact::PathStatusInfo'; |
8c3eab7b |
6 | use Fcntl qw(O_CREAT O_WRONLY); |
4d2ad771 |
7 | use Moo; |
8 | |
9 | with 'DX::Role::Action'; |
10 | |
11 | has path => (is => 'ro', required => 1); |
12 | |
640fa37e |
13 | has mode => (is => 'ro', predicate => 1); |
14 | |
e02a5c0a |
15 | has data => (is => 'ro', default => sub { '' }); |
16 | |
4d2ad771 |
17 | sub 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 | |
31 | sub _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 | |
dd866f63 |
48 | sub but_add { |
49 | $_[0]->but(data => $_[0]->data.$_[1]."\n") |
50 | } |
51 | |
4d2ad771 |
52 | 1; |