From 0c15c16c0e1b0c3724c46137f83e1962fad261f6 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Thu, 31 Dec 2020 13:51:30 +0000 Subject: lei_to_mail: support for non-seekable outputs Users may wish to pipe output to "git am", "spamc", or similar, so we need to support those cases and not bail out on lseek(2) or ftruncate(2) failures. --- t/lei_to_mail.t | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) (limited to 't') diff --git a/t/lei_to_mail.t b/t/lei_to_mail.t index 5be4e285..f3cc71ad 100644 --- a/t/lei_to_mail.t +++ b/t/lei_to_mail.t @@ -6,6 +6,7 @@ use v5.10.1; use Test::More; use PublicInbox::TestCommon; use PublicInbox::Eml; +use Fcntl qw(SEEK_SET); require_mods(qw(DBD::SQLite)); use_ok 'PublicInbox::LeiToMail'; my $from = "Content-Length: 10\nSubject: x\n\nFrom hell\n"; @@ -120,15 +121,41 @@ for my $zsfx (qw(gz bz2 xz)) { # XXX should we support zst, zz, lzo, lzma? } unlink $fn or BAIL_OUT $!; +require PublicInbox::MboxReader; if ('default deduplication uses content_hash') { my $wcb = PublicInbox::LeiToMail->write_cb("mboxo:$fn", $lei); $wcb->(\(my $x = $buf), 'deadbeef', []) for (1..2); undef $wcb; # undef to commit changes my $cmp = ''; open my $fh, '<', $fn or BAIL_OUT $!; - require PublicInbox::MboxReader; PublicInbox::MboxReader->mboxo($fh, sub { $cmp .= shift->as_string }); is($cmp, $buf, 'only one message written'); } +{ # stdout support + open my $tmp, '+>', undef or BAIL_OUT $!; + local $lei->{1} = $tmp; + my $wcb = PublicInbox::LeiToMail->write_cb("mboxrd:/dev/stdout", $lei); + $wcb->(\(my $x = $buf), 'deadbeef', []); + undef $wcb; # commit + seek($tmp, 0, SEEK_SET) or BAIL_OUT $!; + my $cmp = ''; + PublicInbox::MboxReader->mboxrd($tmp, sub { $cmp .= shift->as_string }); + is($cmp, $buf, 'message written to stdout'); +} + +SKIP: { # FIFO support + use PublicInbox::Spawn qw(popen_rd which); + use POSIX qw(mkfifo); + my $fn = "$tmpdir/fifo"; + mkfifo($fn, 0600) or skip("mkfifo not supported: $!", 1); + my $cat = popen_rd([which('cat'), $fn]); + my $wcb = PublicInbox::LeiToMail->write_cb("mboxo:$fn", $lei); + $wcb->(\(my $x = $buf), 'deadbeef', []); + undef $wcb; # commit + my $cmp = ''; + PublicInbox::MboxReader->mboxo($cat, sub { $cmp .= shift->as_string }); + is($cmp, $buf, 'message written to FIFO'); +} + done_testing; -- cgit v1.2.3-24-ge0c7