about summary refs log tree commit homepage
path: root/lib/PublicInbox/Feed.pm
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2015-12-22 00:17:33 +0000
committerEric Wong <e@80x24.org>2015-12-22 00:58:13 +0000
commit4c2c2325d2948ec5340e2fcafbee798cf568f5fd (patch)
tree85dd6e48f4b7c658cb3eee12032143839000f218 /lib/PublicInbox/Feed.pm
parentb140961420c0f240c9c3f55e83c52cfc3efa709d (diff)
downloadpublic-inbox-4c2c2325d2948ec5340e2fcafbee798cf568f5fd.tar.gz
We'll be using it for more than just cat-file.
Adding a `popen' API for internal use allows us to save a bunch
of code in other places.
Diffstat (limited to 'lib/PublicInbox/Feed.pm')
-rw-r--r--lib/PublicInbox/Feed.pm23
1 files changed, 9 insertions, 14 deletions
diff --git a/lib/PublicInbox/Feed.pm b/lib/PublicInbox/Feed.pm
index 68f1e67b..150bea03 100644
--- a/lib/PublicInbox/Feed.pm
+++ b/lib/PublicInbox/Feed.pm
@@ -9,7 +9,7 @@ use Email::Address;
 use Email::MIME;
 use Date::Parse qw(strptime);
 use PublicInbox::Hval;
-use PublicInbox::GitCatFile;
+use PublicInbox::Git;
 use PublicInbox::View;
 use PublicInbox::MID qw/mid_clean mid2path/;
 use POSIX qw/strftime/;
@@ -66,7 +66,7 @@ sub emit_atom {
         my $max = $ctx->{max} || MAX_PER_PAGE;
         my $feed_opts = get_feedopts($ctx);
         my $x = atom_header($feed_opts);
-        my $git = PublicInbox::GitCatFile->new($ctx->{git_dir});
+        my $git = $ctx->{git} ||= PublicInbox::Git->new($ctx->{git_dir});
         each_recent_blob($ctx, sub {
                 my ($path, undef, $ts) = @_;
                 if (defined $x) {
@@ -75,7 +75,6 @@ sub emit_atom {
                 }
                 add_to_feed($feed_opts, $fh, $path, $git);
         });
-        $git = undef; # destroy pipes
         end_feed($fh);
 }
 
@@ -105,11 +104,10 @@ sub emit_atom_thread {
         $feed_opts->{url} = $html_url;
         $feed_opts->{emit_header} = 1;
 
-        my $git = PublicInbox::GitCatFile->new($ctx->{git_dir});
+        my $git = $ctx->{git} ||= PublicInbox::Git->new($ctx->{git_dir});
         foreach my $msg (@{$res->{msgs}}) {
                 add_to_feed($feed_opts, $fh, mid2path($msg->mid), $git);
         }
-        $git = undef; # destroy pipes
         end_feed($fh);
 }
 
@@ -167,7 +165,7 @@ sub emit_html_index {
 
 sub emit_index_nosrch {
         my ($ctx, $state, $fh) = @_;
-        my $git = PublicInbox::GitCatFile->new($ctx->{git_dir});
+        my $git = $ctx->{git} ||= PublicInbox::Git->new($ctx->{git_dir});
         my (undef, $last) = each_recent_blob($ctx, sub {
                 my ($path, $commit, $ts, $u, $subj) = @_;
                 $state->{first} ||= $commit;
@@ -219,14 +217,11 @@ sub each_recent_blob {
         # get recent messages
         # we could use git log -z, but, we already know ssoma will not
         # leave us with filenames with spaces in them..
-        my @cmd = ('git', "--git-dir=$ctx->{git_dir}",
-                        qw/log --no-notes --no-color --raw -r
-                           --abbrev=16 --abbrev-commit/,
-                        "--format=%h%x00%ct%x00%an%x00%s%x00");
-        push @cmd, $range;
-
-        my $pid = open(my $log, '-|', @cmd) or
-                die('open `'.join(' ', @cmd) . " pipe failed: $!\n");
+        my $git = $ctx->{git} ||= PublicInbox::Git->new($ctx->{git_dir});
+        my $log = $git->popen(qw/log --no-notes --no-color --raw -r
+                                --abbrev=16 --abbrev-commit/,
+                                "--format=%h%x00%ct%x00%an%x00%s%x00",
+                                $range);
         my %deleted; # only an optimization at this point
         my $last;
         my $nr = 0;