SetPathMode action
Matt S Trout [Fri, 14 Feb 2014 09:01:41 +0000 (09:01 +0000)]
lib/DX/Lib/FS.pm
lib/DX/Lib/FS/Action/SetPathMode.pm [new file with mode: 0644]
lib/DX/Lib/FS/Fact/PathStatusInfo.pm

index 220daec..2fb204c 100644 (file)
@@ -3,6 +3,7 @@ package DX::Lib::FS;
 use DX::Lib::FS::Observation::PathStatus;
 use DX::Lib::FS::Action::CreateDirectory;
 use DX::Lib::FS::Action::CreateFile;
+use DX::Lib::FS::Action::SetPathMode;
 use File::Spec;
 use DX::SetOver;
 use Moo;
@@ -88,6 +89,14 @@ our @RULES = (
       [ react => [ qw(PS M) ], sub {
           $_[0]->but(mode => $_[1]);
         } ] ] ],
+  [ mode => [ qw(PS M) ],
+    [ exists_path => qw(PS) ],
+    [ not => [ info_prop => 'PS', \'mode', 'M' ] ],
+    [ act => [ qw(PS M) ], sub {
+       DX::Lib::FS::Action::SetPathMode->new(
+         path_status => $_[0], mode => $_[1]
+       )
+    } ] ],
 );
 
 sub load_into {
diff --git a/lib/DX/Lib/FS/Action/SetPathMode.pm b/lib/DX/Lib/FS/Action/SetPathMode.pm
new file mode 100644 (file)
index 0000000..f7cba83
--- /dev/null
@@ -0,0 +1,23 @@
+package DX::Lib::FS::Action::SetPathMode;
+
+use Moo;
+
+has path_status => (is => 'ro', required => 1);
+has mode => (is => 'ro', required => 1);
+
+with 'DX::Role::Action';
+
+sub expected_effect {
+  my ($self) = @_;
+  my $ps = $self->path_status;
+  +(path_status => $ps->but(info => $ps->info->but(mode => $self->mode)));
+}
+
+sub _do_run {
+  my ($self) = @_;
+  chmod oct($self->mode), $self->path_status->path
+    or die "Failed to chmod ${\$self->path_status->path} to ${\$self->mode}: $!";
+  +(path_status => $self->path_status);
+}
+
+1;
index a7201ff..d1894a5 100644 (file)
@@ -6,4 +6,6 @@ has is_directory => (is => 'ro', default => 0);
 has is_file => (is => 'ro', default => 0);
 has mode => (is => 'ro', required => 1);
 
+with 'DX::Role::Fact';
+
 1;