From 7c0c47e26af17918031d449d24abe40ad452f51a Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Sat, 19 Sep 2020 09:37:10 +0000 Subject: add gcf2 client and executable script This should be able to replace multiple `git cat-file' for blob retrieval, but adjustments may be needed. --- lib/PublicInbox/Gcf2Client.pm | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 lib/PublicInbox/Gcf2Client.pm (limited to 'lib/PublicInbox') diff --git a/lib/PublicInbox/Gcf2Client.pm b/lib/PublicInbox/Gcf2Client.pm new file mode 100644 index 00000000..71fbb1d1 --- /dev/null +++ b/lib/PublicInbox/Gcf2Client.pm @@ -0,0 +1,35 @@ +# Copyright (C) 2020 all contributors +# License: AGPL-3.0+ +package PublicInbox::Gcf2Client; +use strict; +use parent 'PublicInbox::Git'; +use PublicInbox::Spawn qw(popen_rd); +use IO::Handle (); + +sub new { + my $self = shift->SUPER::new('/nonexistent'); + my ($out_r, $out_w); + pipe($out_r, $out_w) or $self->fail("pipe failed: $!"); + my $cmd = [ 'public-inbox-gcf2' ]; + @$self{qw(in pid)} = popen_rd($cmd, undef, { 0 => $out_r }); + $self->{inflight} = []; + $self->{out} = $out_w; + fcntl($out_w, 1031, 4096) if $^O eq 'linux'; # 1031: F_SETPIPE_SZ + $out_w->autoflush(1); + $self; +} + +sub add_git_dir { + my ($self, $git_dir) = @_; + + # ensure buffers are drained, length($git_dir) may exceed + # PIPE_BUF on platforms where PIPE_BUF is only 512 bytes + my $inflight = $self->{inflight}; + while (scalar(@$inflight)) { + $self->cat_async_step($inflight); + } + print { $self->{out} } $git_dir, "\n" or + $self->fail("write error: $!"); +} + +1; -- cgit v1.2.3-24-ge0c7