about summary refs log tree commit homepage
path: root/lib/PublicInbox/Config.pm
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2015-12-10 04:16:43 +0000
committerEric Wong <e@80x24.org>2015-12-22 00:58:01 +0000
commit3273b47d02dd353cd2efe1cd0bdeca1334e3942e (patch)
tree41402862b42179ec6bb105cb295d1b5fe981a3ef /lib/PublicInbox/Config.pm
parent84130495f67b9d50e663f64c8e11293614bf0a24 (diff)
downloadpublic-inbox-3273b47d02dd353cd2efe1cd0bdeca1334e3942e.tar.gz
These will be reused elsewhere.
Diffstat (limited to 'lib/PublicInbox/Config.pm')
-rw-r--r--lib/PublicInbox/Config.pm72
1 files changed, 45 insertions, 27 deletions
diff --git a/lib/PublicInbox/Config.pm b/lib/PublicInbox/Config.pm
index 353a1fb2..844f666e 100644
--- a/lib/PublicInbox/Config.pm
+++ b/lib/PublicInbox/Config.pm
@@ -5,38 +5,16 @@
 package PublicInbox::Config;
 use strict;
 use warnings;
+use base qw/Exporter/;
+our @EXPORT_OK = qw/try_cat/;
 use File::Path::Expand qw/expand_filename/;
 
 # returns key-value pairs of config directives in a hash
 # if keys may be multi-value, the value is an array ref containing all values
 sub new {
         my ($class, $file) = @_;
-        my ($in, $out);
-
         $file = default_file() unless defined($file);
-        my @cmd = (qw/git config/, "--file=$file", '-l');
-        my $cmd = join(' ', @cmd);
-        my $pid = open(my $fh, '-|', @cmd);
-        defined $pid or die "$cmd failed: $!\n";
-        my %rv;
-        foreach my $line (<$fh>) {
-                chomp $line;
-                my ($k, $v) = split(/=/, $line, 2);
-                my $cur = $rv{$k};
-
-                if (defined $cur) {
-                        if (ref($cur) eq "ARRAY") {
-                                push @$cur, $v;
-                        } else {
-                                $rv{$k} = [ $cur, $v ];
-                        }
-                } else {
-                        $rv{$k} = $v;
-                }
-        }
-        close $fh or die "failed to close ($cmd) pipe: $!\n";
-        $? and warn "$$ $cmd exited with: ($pid) $?\n";
-        bless \%rv, $class;
+        bless git_config_dump($file), $class;
 }
 
 sub lookup {
@@ -81,11 +59,51 @@ sub get {
         $self->{"publicinbox.$listname.$key"};
 }
 
+sub config_dir { $ENV{PI_DIR} || expand_filename('~/.public-inbox') }
+
 sub default_file {
         my $f = $ENV{PI_CONFIG};
         return $f if defined $f;
-        my $pi_dir = $ENV{PI_DIR} || expand_filename('~/.public-inbox');
-        "$pi_dir/config";
+        config_dir() . '/config';
+}
+
+sub git_config_dump {
+        my ($file) = @_;
+        my ($in, $out);
+        my @cmd = (qw/git config/, "--file=$file", '-l');
+        my $cmd = join(' ', @cmd);
+        my $pid = open(my $fh, '-|', @cmd);
+        defined $pid or die "$cmd failed: $!\n";
+        my %rv;
+        foreach my $line (<$fh>) {
+                chomp $line;
+                my ($k, $v) = split(/=/, $line, 2);
+                my $cur = $rv{$k};
+
+                if (defined $cur) {
+                        if (ref($cur) eq "ARRAY") {
+                                push @$cur, $v;
+                        } else {
+                                $rv{$k} = [ $cur, $v ];
+                        }
+                } else {
+                        $rv{$k} = $v;
+                }
+        }
+        close $fh or die "failed to close ($cmd) pipe: $!\n";
+        $? and warn "$$ $cmd exited with: ($pid) $?\n";
+        \%rv;
+}
+
+sub try_cat {
+        my ($path) = @_;
+        my $rv;
+        if (open(my $fh, '<', $path)) {
+                local $/;
+                $rv = <$fh>;
+                close $fh;
+        }
+        $rv;
 }
 
 1;