about summary refs log tree commit homepage
path: root/lib/PublicInbox/MboxReader.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/PublicInbox/MboxReader.pm')
-rw-r--r--lib/PublicInbox/MboxReader.pm42
1 files changed, 11 insertions, 31 deletions
diff --git a/lib/PublicInbox/MboxReader.pm b/lib/PublicInbox/MboxReader.pm
index beffabe8..3d78ca23 100644
--- a/lib/PublicInbox/MboxReader.pm
+++ b/lib/PublicInbox/MboxReader.pm
@@ -1,10 +1,10 @@
-# Copyright (C) 2020-2021 all contributors <meta@public-inbox.org>
+# Copyright (C) all contributors <meta@public-inbox.org>
 # License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
 
-# reader for mbox variants we support
+# reader for mbox variants we support (and also sets up commands for writing)
 package PublicInbox::MboxReader;
 use strict;
-use v5.10.1;
+use v5.10.1; # check regexps before v5.12
 use Data::Dumper;
 $Data::Dumper::Useqq = 1; # should've been the default, for bad data
 
@@ -29,7 +29,7 @@ sub _mbox_from {
         my @raw;
         while (defined(my $r = read($mbfh, $buf, 65536, length($buf)))) {
                 if ($r == 0) { # close here to check for "curl --fail"
-                        close($mbfh) or die "error closing mbox: \$?=$? $!";
+                        $mbfh->close or die "error closing mbox: \$?=$? $!";
                         @raw = ($buf);
                 } else {
                         @raw = split(/$from_strict/mos, $buf, -1);
@@ -88,12 +88,12 @@ sub _mbox_cl ($$$;@) {
         my $buf = '';
         while (defined(my $r = read($mbfh, $buf, 65536, length($buf)))) {
                 if ($r == 0) { # detect "curl --fail"
-                        close($mbfh) or
+                        $mbfh->close or
                                 die "error closing mboxcl/mboxcl2: \$?=$? $!";
                         undef $mbfh;
                 }
                 while (my $hdr = _extract_hdr(\$buf)) {
-                        $$hdr =~ s/\A[\r\n]*From [^\n]*\n//s or
+                        PublicInbox::Eml::strip_from($$hdr) or
                                 die "E: no 'From ' line in:\n", Dumper($hdr);
                         my $eml = PublicInbox::Eml->new($hdr);
                         next unless $eml->raw_size;
@@ -141,10 +141,9 @@ sub reads {
 
 # all of these support -c for stdout and -d for decompression,
 # mutt is commonly distributed with hooks for gz, bz2 and xz, at least
-# { foo => '' } means "--foo" is passed to the command-line,
-# otherwise { foo => '--bar' } passes "--bar"
+# { foo => '' } means "--foo" is passed to the command-line
 my %zsfx2cmd = (
-        gz => [ qw(GZIP pigz gzip) ],
+        gz => [ qw(GZIP pigz gzip), { rsyncable => '' } ],
         bz2 => [ 'bzip2', {} ],
         xz => [ 'xz', {} ],
         # don't add new entries here unless MUA support is widely available
@@ -173,28 +172,9 @@ sub zsfx2cmd ($$$) {
         }
         $cmd[0] // die join(' or ', @info)." missing for .$zsfx";
 
-        # not all gzip support --rsyncable, FreeBSD gzip doesn't even exit
-        # with an error code
-        if (!$decompress && $cmd[0] =~ m!/gzip\z! && !defined($cmd_opt)) {
-                pipe(my ($r, $w)) or die "pipe: $!";
-                open my $null, '+>', '/dev/null' or die "open: $!";
-                my $rdr = { 0 => $null, 1 => $null, 2 => $w };
-                my $tst = [ $cmd[0], '--rsyncable' ];
-                my $pid = PublicInbox::Spawn::spawn($tst, undef, $rdr);
-                close $w;
-                my $err = do { local $/; <$r> };
-                waitpid($pid, 0) == $pid or die "BUG: waitpid: $!";
-                $cmd_opt = $err ? {} : { rsyncable => '' };
-                push(@$x, $cmd_opt);
-        }
-        for my $bool (keys %$cmd_opt) {
-                my $switch = $cmd_opt->{$bool} // next;
-                push @cmd, '--'.($switch || $bool);
-        }
-        for my $key (qw(rsyncable)) { # support compression level?
-                my $switch = $cmd_opt->{$key} // next;
-                my $val = $lei->{opt}->{$key} // next;
-                push @cmd, $switch, $val;
+        # only for --rsyncable.  TODO: support compression level?
+        for my $key (keys %$cmd_opt) {
+                push @cmd, '--'.$key if $lei->{opt}->{$key};
         }
         \@cmd;
 }