about summary refs log tree commit homepage
path: root/lib/PublicInbox/LeiInput.pm
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2021-03-29 07:08:25 +0000
committerEric Wong <e@80x24.org>2021-03-29 13:43:55 -0400
commitd326b75c07c6d79547c045cb08163f9d40b245b9 (patch)
tree8a2db59ea28b93b2e6d4f59e73bd6cde81452893 /lib/PublicInbox/LeiInput.pm
parenta0ad0c832830ecd70d01dfba5f1bc81d4efcd950 (diff)
downloadpublic-inbox-d326b75c07c6d79547c045cb08163f9d40b245b9.tar.gz
".eml" is a suffix supported by (/usr/local)/etc/mime.types
on Debian and FreeBSD systems using the "mime-support" package.
".patch" is what "git format-patch" generates by default since
git v1.5.0 in 2007.
Diffstat (limited to 'lib/PublicInbox/LeiInput.pm')
-rw-r--r--lib/PublicInbox/LeiInput.pm25
1 files changed, 18 insertions, 7 deletions
diff --git a/lib/PublicInbox/LeiInput.pm b/lib/PublicInbox/LeiInput.pm
index 93284e8b..c04fc2f8 100644
--- a/lib/PublicInbox/LeiInput.pm
+++ b/lib/PublicInbox/LeiInput.pm
@@ -14,9 +14,9 @@ sub check_input_format ($;$) {
                 my $err = $files ? "regular file(s):\n@$files" : '--stdin';
                 return $lei->fail("--$opt_key unset for $err");
         }
+        return 1 if $fmt eq 'eml';
         require PublicInbox::MboxLock if $files;
         require PublicInbox::MboxReader;
-        return 1 if $fmt eq 'eml';
         # XXX: should this handle {gz,bz2,xz}? that's currently in LeiToMail
         PublicInbox::MboxReader->reads($fmt) or
                 return $lei->fail("--$opt_key=$fmt unrecognized");
@@ -28,7 +28,6 @@ sub check_input_format ($;$) {
 sub input_fh {
         my ($self, $ifmt, $fh, $name, @args) = @_;
         if ($ifmt eq 'eml') {
-                require PublicInbox::Eml;
                 my $buf = do { local $/; <$fh> } //
                         return $self->{lei}->child_error(1 << 8, <<"");
 error reading $name: $!
@@ -60,13 +59,21 @@ sub input_path_url {
                                         $self, @args);
                 return;
         }
-        $input =~ s!\A([a-z0-9]+):!!i and $ifmt = lc($1);
+        if ($input =~ s!\A([a-z0-9]+):!!i) {
+                $ifmt = lc($1);
+        } elsif ($input =~ /\.(?:patch|eml)\z/i) {
+                $ifmt = 'eml';
+        }
         my $devfd = $lei->path_to_fd($input) // return;
         if ($devfd >= 0) {
                 $self->input_fh($ifmt, $lei->{$devfd}, $input, @args);
-        } elsif (-f $input) {
-                my $m = $lei->{opt}->{'lock'} // ($ifmt eq 'eml' ? ['none'] :
-                                PublicInbox::MboxLock->defaults);
+        } elsif (-f $input && $ifmt eq 'eml') {
+                open my $fh, '<', $input or
+                                        return $lei->fail("open($input): $!");
+                $self->input_fh($ifmt, $fh, $input, @args);
+        } elsif (-f _) {
+                my $m = $lei->{opt}->{'lock'} //
+                        PublicInbox::MboxLock->defaults;
                 my $mbl = PublicInbox::MboxLock->acq($input, 0, $m);
                 $self->input_fh($ifmt, $mbl->{fh}, $input, @args);
         } elsif (-d _ && (-d "$input/cur" || -d "$input/new")) {
@@ -91,7 +98,6 @@ sub prepare_inputs { # returns undef on error
                 push @$inputs, '/dev/stdin';
         }
         my $net = $lei->{net}; # NetWriter may be created by l2m
-        my $fmt = $lei->{opt}->{'in-format'};
         my (@f, @d);
         # e.g. Maildir:/home/user/Mail/ or imaps://example.com/INBOX
         for my $input (@$inputs) {
@@ -120,6 +126,11 @@ sub prepare_inputs { # returns undef on error
                         } else {
                                 return $lei->fail("Unable to handle $input");
                         }
+                } elsif ($input =~ /\.(eml|patch)\z/i && -f $input) {
+                        lc($in_fmt//'eml') eq 'eml' or return $lei->fail(<<"");
+$input is `eml', not --in-format=$in_fmt
+
+                        require PublicInbox::Eml;
                 } else {
                         my $devfd = $lei->path_to_fd($input) // return;
                         if ($devfd >= 0 || -f $input || -p _) {