lib/PublicInbox/LEI.pm | 2 +- lib/PublicInbox/LeiQuery.pm | 2 +- lib/PublicInbox/LeiToMail.pm | 8 ++++++-- t/lei-q-kw.t | 25 +++++++++++++++++++------ diff --git a/lib/PublicInbox/LEI.pm b/lib/PublicInbox/LEI.pm index 50276a505abbce64a4b1d2cff009d799c9aedead..50c0a885ec0d6a6cf332f727246dbba99f243102 100644 --- a/lib/PublicInbox/LEI.pm +++ b/lib/PublicInbox/LEI.pm @@ -431,7 +431,7 @@ sub out ($;@) { my $self = shift; return if print { $self->{1} // return } @_; # likely return note_sigpipe($self, 1) if $! == EPIPE; - my $err = "error writing to stdout: $!"; + my $err = "error writing to output: $!"; delete $self->{1}; fail($self, $err); } diff --git a/lib/PublicInbox/LeiQuery.pm b/lib/PublicInbox/LeiQuery.pm index 493a83825d2c4e64a1f350ad6ea329b3fc32fb1d..623b92cdb78c3893de9c9cfcc7475261a5a160e0 100644 --- a/lib/PublicInbox/LeiQuery.pm +++ b/lib/PublicInbox/LeiQuery.pm @@ -52,7 +52,7 @@ # we'll allow "--only $LOCATION --local" my $sto = $self->_lei_store(1); my $lse = $sto->search; if (($opt->{'import-remote'} //= 1) | - ($opt->{'import-before'} //= 1)) { + (($opt->{'import-before'} //= \1) ? 1 : 0)) { $sto->write_prepare($self); } if ($opt->{'local'} //= scalar(@only) ? 0 : 1) { diff --git a/lib/PublicInbox/LeiToMail.pm b/lib/PublicInbox/LeiToMail.pm index 1e2060fe973d129f0ddffec6db17f1fac68e4ce5..13b4f67275b696cb1b84148f00b60bebf25562d3 100644 --- a/lib/PublicInbox/LeiToMail.pm +++ b/lib/PublicInbox/LeiToMail.pm @@ -223,8 +223,6 @@ my $dup = bless { "pid.$pid" => $cmd }, ref($lei); $dup->{$_} = $lei->{$_} for qw(2 sock); tie *$pp, 'PublicInbox::ProcessPipe', $pid, $w, \&reap_compress, $dup; $lei->{1} = $pp; - die 'BUG: unexpected {ovv}->{lock_path}' if $lei->{ovv}->{lock_path}; - $lei->{ovv}->ovv_out_lk_init; } sub decompress_src ($$$) { @@ -495,6 +493,7 @@ my $dst = $lei->{ovv}->{dst}; my $out = $lei->{1}; if ($dst ne '/dev/stdout') { if (-p $dst) { + $out = undef; open $out, '>', $dst or die "open($dst): $!"; } elsif (-f _ || !-e _) { require PublicInbox::MboxLock; @@ -521,6 +520,11 @@ state $zsfx_allow = join('|', keys %zsfx2cmd); if (($self->{zsfx}) = ($dst =~ /\.($zsfx_allow)\z/)) { pipe(my ($r, $w)) or die "pipe: $!"; $lei->{zpipe} = [ $r, $w ]; + $lei->{ovv}->{lock_path} and + die 'BUG: unexpected {ovv}->{lock_path}'; + $lei->{ovv}->ovv_out_lk_init; + } elsif (!$self->{seekable} && !$lei->{ovv}->{lock_path}) { + $lei->{ovv}->ovv_out_lk_init; } $lei->{1} = $out; undef; diff --git a/t/lei-q-kw.t b/t/lei-q-kw.t index 9daeb5b1976a40c8fb97c1771c247e20ba3f0259..917a2c53dc76d46662fbc7c164615e1559256574 100644 --- a/t/lei-q-kw.t +++ b/t/lei-q-kw.t @@ -7,7 +7,15 @@ use Fcntl qw(SEEK_SET O_RDONLY O_NONBLOCK); use IO::Uncompress::Gunzip qw(gunzip); use IO::Compress::Gzip qw(gzip); use PublicInbox::MboxReader; +use PublicInbox::LeiToMail; use PublicInbox::Spawn qw(popen_rd); +my $exp = { + '' => eml_load('t/plack-qp.eml'), + '' => eml_load('t/utf8.eml'), +}; +$exp->{''}->header_set('Status', 'OR'); +$exp->{''}->header_set('Status', 'O'); + test_lei(sub { lei_ok(qw(import -F eml t/plack-qp.eml)); my $o = "$ENV{HOME}/dst"; @@ -42,6 +50,17 @@ my $cat = popen_rd(['cat', $o]); ok(!lei(qw(q --import-before bogus -o), "mboxrd:$o"), '--import-before fails on non-seekable output'); is(do { local $/; <$cat> }, '', 'no output on FIFO'); + close $cat; + $cat = popen_rd(['cat', $o]); + lei_ok(qw(q m:qp@example.com -o), "mboxrd:$o"); + my $buf = do { local $/; <$cat> }; + open my $fh, '<', \$buf or BAIL_OUT $!; + PublicInbox::MboxReader->mboxrd($fh, sub { + my ($eml) = @_; + $eml->header_set('Status', 'OR'); + is_deeply($eml, $exp->{''}, + 'FIFO output works as expected'); + }); }; lei_ok qw(import -F eml t/utf8.eml), \'for augment test'; @@ -66,12 +85,6 @@ close $fh or BAIL_OUT; } }; -my $exp = { - '' => eml_load('t/plack-qp.eml'), - '' => eml_load('t/utf8.eml'), -}; -$exp->{''}->header_set('Status', 'OR'); -$exp->{''}->header_set('Status', 'O'); for my $sfx ('', '.gz') { $o = "$ENV{HOME}/dst.mboxrd$sfx"; lei_ok(qw(q -o), "mboxrd:$o", qw(m:qp@example.com));