X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FLeiInput.pm;h=a1dcc907252f47d7716a83e799e2912a34be2416;hb=27015c3365fd069013e58c6cc06e7be38f4fbe4f;hp=dd40d83840c57cb2e790fd86d30699b8a11f60c5;hpb=4b5a1b5787edee2a3b6cc10a3ccc5721f1414268;p=public-inbox.git diff --git a/lib/PublicInbox/LeiInput.pm b/lib/PublicInbox/LeiInput.pm index dd40d838..a1dcc907 100644 --- a/lib/PublicInbox/LeiInput.pm +++ b/lib/PublicInbox/LeiInput.pm @@ -30,7 +30,7 @@ my %ERR = ( my ($label) = @_; length($label) >= $L_MAX and return "`$label' too long (must be <= $L_MAX)"; - $label =~ m{\A[a-z0-9_](?:[a-z0-9_\-\./\@,]*[a-z0-9])?\z}i ? + $label =~ m{\A[a-z0-9_](?:[a-z0-9_\-\./\@,]*[a-z0-9])?\z} ? undef : "`$label' is invalid"; }, kw => sub { @@ -64,6 +64,16 @@ sub input_mbox_cb { # base MboxReader callback $self->input_eml_cb($eml); } +sub input_maildir_cb { + my ($fn, $kw, $eml, $self) = @_; + $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 +118,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 +194,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 +350,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") } @@ -402,7 +425,7 @@ sub input_only_atfork_child { sub input_only_net_merge_all_done { my ($self) = @_; $self->wq_io_do('process_inputs'); - $self->wq_close(1); + $self->wq_close; } # like Getopt::Long, but for +kw:FOO and -kw:FOO to prepare