994e64820dd09c4f51dd4bb6e6816328a3ee5c31
[scpubgit/DKit.git] / lib / DX / Lib / FS / Guts.pm
1 package DX::Lib::FS::Guts;
2
3 use File::stat;
4 use File::Copy;
5 use Fcntl qw(O_CREAT O_WRONLY);
6 use POSIX qw(ENOENT);
7 use Moo;
8
9 sub create_directory {
10   my ($self, $path, $mode) = @_;
11   if (defined $mode) {
12     my $umask = umask(0000);
13     mkdir($path, oct($mode))
14       or do { umask($umask); die "Couldn't mkdir ${path}: $!" };
15     umask($umask);
16   } else {
17     mkdir($path) or die "Couldn't mkdir ${path}: $!";
18   }
19   return;
20 }
21
22 sub create_file {
23   my ($self, $path, $mode, $data) = @_;
24   my $fh;
25   if (defined $mode) {
26     my $umask = umask(0000);
27     sysopen(
28       $fh, $path, O_CREAT | O_WRONLY, oct($mode)
29     ) or do { umask($umask); die "Couldn't create ${path}: $!" };
30     umask($umask);
31   } else {
32     sysopen($fh, $path, O_CREAT | O_WRONLY)
33       or die "Couldn't create ${path}: $!";
34   }
35   print $fh $data if length($data);
36   return;
37 }
38
39 sub set_path_mode {
40   my ($self, $path, $mode) = @_;
41   chmod oct($mode), $path
42     or die "Failed to chmod ${path} to ${mode}: $!";
43   return;
44 }
45
46 sub rewrite_file {
47   my ($self, $path, $final_content) = @_;
48   my $stat = stat($path) or die "Couldn't stat ${path}: $!";
49   my $perms = $stat->mode & 07777;
50   my $new = $path.'.new';
51   unlink($new);
52   sysopen my $fh, $new, O_CREAT | O_WRONLY, $perms
53     or die "Couldn't open ${new}: $!";
54   print $fh $final_content
55     or die "Couldn't write data to ${new}: $!";
56   close $fh;
57   move($new, $path) or die "Couldn't install ${new}: $!";
58   return;
59 }
60
61 sub path_status_info {
62   my ($self, $path) = @_;
63   if (my $stat = stat($path)) {
64     return +{
65       is_directory => -d _,
66       is_file => -f _,
67       mode => sprintf("%04o", ($stat->mode & 07777))
68     };
69   } elsif ($! == ENOENT) {
70     return undef;
71   } else {
72     die "Couldn't stat ${path}: $!";
73   }
74 }
75
76 sub file_content {
77   my ($self, $path) = @_;
78   return undef unless -e $path;
79   my $data = do {
80     open my $fh, '<', $path or die "Couldn't open ${path}: $!";
81     local $/;
82     readline($fh)
83   };
84   return $data;
85 }
86
87 1;