env dir code
[scpubgit/DKit.git] / lib / DX / Lib / FS / Guts.pm
CommitLineData
0d1a41d9 1package DX::Lib::FS::Guts;
2
3use File::stat;
4use File::Copy;
5use Fcntl qw(O_CREAT O_WRONLY);
6use POSIX qw(ENOENT);
7use Moo;
8
9sub 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
22sub 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
39sub 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
46sub 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
61sub 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
76sub 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
6a7c71ff 87sub env_dir {
88 my ($self, $key) = @_;
89 $key =~ s/^\.\///;
90 return $ENV{$key}|| die "${key} not set";
91}
92
0d1a41d9 931;