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