diff options
Diffstat (limited to 'lib/PublicInbox/MboxReader.pm')
-rw-r--r-- | lib/PublicInbox/MboxReader.pm | 30 |
1 files changed, 12 insertions, 18 deletions
diff --git a/lib/PublicInbox/MboxReader.pm b/lib/PublicInbox/MboxReader.pm index 5a754cb8..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,8 +141,7 @@ 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), { rsyncable => '' } ], bz2 => [ 'bzip2', {} ], @@ -160,7 +159,7 @@ sub zsfx2cmd ($$$) { my ($zsfx, $decompress, $lei) = @_; my $x = $zsfx2cmd{$zsfx} // die "BUG: no support for suffix=.$zsfx"; my @info = @$x; - my $cmd_opt = pop @info; + my $cmd_opt = ref($info[-1]) ? pop(@info) : undef; my @cmd = (undef, $decompress ? qw(-dc) : qw(-c)); require PublicInbox::Spawn; for my $exe (@info) { @@ -172,15 +171,10 @@ sub zsfx2cmd ($$$) { $cmd[0] = PublicInbox::Spawn::which($exe) and last; } $cmd[0] // die join(' or ', @info)." missing for .$zsfx"; - # push @cmd, @{$cmd_opt->{-default}} if $cmd_opt->{-default}; - for my $bool (qw(rsyncable)) { - my $switch = $cmd_opt->{rsyncable} // 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; } |