about summary refs log tree commit homepage
path: root/lib/PublicInbox/LeiInput.pm
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2021-10-26 10:35:55 +0000
committerEric Wong <e@80x24.org>2021-10-26 17:43:57 +0000
commit6d78574a7b8084a9415b4168262207ebe54e5feb (patch)
treee2e0b96306f0916dc7149b8138700d5d73152eea /lib/PublicInbox/LeiInput.pm
parentec031825967ac3eb89df4e71ab85ca230358ca70 (diff)
downloadpublic-inbox-6d78574a7b8084a9415b4168262207ebe54e5feb.tar.gz
The LeiInput backend now allows p2q to work like any other
command which reads .eml, .patch, mbox*, Maildir, IMAP, and NNTP
input.  Running "git format-patch --stdout -1 $COMMIT" remains
supported.

This is intended to allow lower memory use while parsing
"git log --pretty=mboxrd -p" output.  Previously, the entire
output of "git log" would be slurped into memory at once.

The intended use is to allow easy(-ish :P) searching for
unapplied patches as documented in the new example in the
manpage.
Diffstat (limited to 'lib/PublicInbox/LeiInput.pm')
-rw-r--r--lib/PublicInbox/LeiInput.pm30
1 files changed, 24 insertions, 6 deletions
diff --git a/lib/PublicInbox/LeiInput.pm b/lib/PublicInbox/LeiInput.pm
index 2621fc1f..540681e3 100644
--- a/lib/PublicInbox/LeiInput.pm
+++ b/lib/PublicInbox/LeiInput.pm
@@ -64,6 +64,11 @@ sub input_mbox_cb { # base MboxReader callback
         $self->input_eml_cb($eml);
 }
 
+sub input_net_cb { # imap_each, nntp_each cb
+        my ($url, $uid, $kw, $eml, $self) = @_;
+        $self->input_eml_cb($eml);
+}
+
 # import a single file handle of $name
 # Subclass must define ->input_eml_cb and ->input_mbox_cb
 sub input_fh {
@@ -108,10 +113,10 @@ sub handle_http_input ($$@) {
         grep(/\A--compressed\z/, @$curl) or
                 $fh = IO::Uncompress::Gunzip->new($fh, MultiStream => 1);
         eval { $self->input_fh('mboxrd', $fh, $url, @args) };
-        my $err = $@;
+        my @err = ($@ ? $@ : ());
         $ar->join;
-        $? || $err and
-                $lei->child_error($?, "@$cmd failed".$err ? " $err" : '');
+        push(@err, "\$?=$?") if $?;
+        $lei->child_error($?, "@$cmd failed: @err") if @err;
 }
 
 sub input_path_url {
@@ -184,7 +189,17 @@ EOM
                                                 $self, @args);
                 }
         } elsif ($self->{missing_ok} && !-e $input) { # don't ->fail
-                $self->folder_missing("$ifmt:$input");
+                if ($lei->{cmd} eq 'p2q') {
+                        my $fp = [ qw(git format-patch --stdout -1), $input ];
+                        my $rdr = { 2 => $lei->{2} };
+                        my $fh = popen_rd($fp, undef, $rdr);
+                        eval { $self->input_fh('eml', $fh, $input, @args) };
+                        my @err = ($@ ? $@ : ());
+                        close($fh) or push @err, "\$?=$?";
+                        $lei->child_error($?, "@$fp failed: @err") if @err;
+                } else {
+                        $self->folder_missing("$ifmt:$input");
+                }
         } else {
                 $lei->fail("$ifmt_pfx$input unsupported (TODO)");
         }
@@ -330,9 +345,12 @@ $input is `eml', not --in-format=$in_fmt
                                 }
                                 push @md, $input;
                         } elsif ($self->{missing_ok} && !-e $input) {
-                                # for lei rm-watch
-                                $may_sync and $input = 'maildir:'.
+                                if ($lei->{cmd} eq 'p2q') {
+                                        # will run "git format-patch"
+                                } elsif ($may_sync) { # for lei rm-watch
+                                        $input = 'maildir:'.
                                                 $lei->abs_path($input);
+                                }
                         } else {
                                 return $lei->fail("Unable to handle $input")
                         }