X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FLeiInput.pm;h=fe736981ba6565d111871f6778b11838d1ecf83d;hb=47d4e53734820b4e;hp=de2a8ff1c31944639031f862b2a44c1dc93e925f;hpb=09f1fabd1b3097426734b358d7231c11ab4b8d6e;p=public-inbox.git diff --git a/lib/PublicInbox/LeiInput.pm b/lib/PublicInbox/LeiInput.pm index de2a8ff1..fe736981 100644 --- a/lib/PublicInbox/LeiInput.pm +++ b/lib/PublicInbox/LeiInput.pm @@ -63,7 +63,7 @@ sub input_fh { my ($self, $ifmt, $fh, $name, @args) = @_; if ($ifmt eq 'eml') { my $buf = do { local $/; <$fh> } // - return $self->{lei}->child_error(1 << 8, <<""); + return $self->{lei}->child_error(0, <<""); error reading $name: $! # mutt pipes single RFC822 messages with a "From " line, @@ -104,7 +104,7 @@ sub handle_http_input ($$@) { my $err = $@; waitpid($pid, 0); $? || $err and - $lei->child_error($? || 1, "@$cmd failed".$err ? " $err" : ''); + $lei->child_error($?, "@$cmd failed".$err ? " $err" : ''); } sub input_path_url { @@ -124,7 +124,11 @@ sub input_path_url { handle_http_input($self, $input, @args); return; } + + # local-only below + my $ifmt_pfx = ''; if ($input =~ s!\A([a-z0-9]+):!!i) { + $ifmt_pfx = "$1:"; $ifmt = lc($1); } elsif ($input =~ /\.(?:patch|eml)\z/i) { $ifmt = 'eml'; @@ -172,11 +176,16 @@ EOM $self->can('input_maildir_cb'), $self, @args); } + } elsif ($self->{missing_ok} && !-e $input) { # don't ->fail + $self->folder_missing("$ifmt:$input"); } else { - $lei->fail("$input unsupported (TODO)"); + $lei->fail("$ifmt_pfx$input unsupported (TODO)"); } } +# subclasses should overrride this (see LeiRefreshMailSync) +sub folder_missing { die "BUG: ->folder_missing undefined for $_[0]" } + sub bad_http ($$;$) { my ($lei, $url, $alt) = @_; my $x = $alt ? "did you mean <$alt>?" : 'download and import manually'; @@ -225,6 +234,7 @@ sub prepare_inputs { # returns undef on error my ($self, $lei, $inputs) = @_; my $in_fmt = $lei->{opt}->{'in-format'}; my $sync = $lei->{opt}->{'mail-sync'} ? {} : undef; # using LeiMailSync + my $may_sync = $sync || $self->{-mail_sync}; if ($lei->{opt}->{stdin}) { @$inputs and return $lei->fail("--stdin and @$inputs do not mix"); @@ -267,11 +277,18 @@ sub prepare_inputs { # returns undef on error } elsif (-d $input_path) { $ifmt eq 'maildir' or return $lei->fail("$ifmt not supported"); - $sync and $input = 'maildir:'. + $may_sync and $input = 'maildir:'. $lei->abs_path($input_path); push @md, $input; + } elsif ($self->{missing_ok} && !-e _) { + # for "lei rm-watch" on missing Maildir + $may_sync and $input = 'maildir:'. + $lei->abs_path($input_path); } else { - return $lei->fail("Unable to handle $input"); + my $m = "Unable to handle $input"; + $input =~ /\A(?:L|kw):/ and + $m .= ", did you mean +$input?"; + return $lei->fail($m); } } elsif ($input =~ /\.(?:eml|patch)\z/i && -f $input) { lc($in_fmt//'eml') eq 'eml' or return $lei->fail(<<""); @@ -290,7 +307,7 @@ $input is `eml', not --in-format=$in_fmt if ($sync) { $input = $lei->abs_path($mdir) . "/$nc/$bn"; - push @{$sync->{ok}}, $input; + push @{$sync->{ok}}, $input if $sync; } require PublicInbox::MdirReader; } else { @@ -299,12 +316,16 @@ $input is `eml', not --in-format=$in_fmt push @{$sync->{no}}, $input if $sync; push @f, $input; } elsif (-d "$input/new" && -d "$input/cur") { - if ($sync) { + if ($may_sync) { $input = 'maildir:'. $lei->abs_path($input); - push @{$sync->{ok}}, $input; + push @{$sync->{ok}}, $input if $sync; } push @md, $input; + } elsif ($self->{missing_ok} && !-e $input) { + # for lei rm-watch + $may_sync and $input = 'maildir:'. + $lei->abs_path($input); } else { return $lei->fail("Unable to handle $input") } @@ -335,6 +356,13 @@ $input is `eml', not --in-format=$in_fmt require PublicInbox::LeiPmdir; $self->{pmd} = PublicInbox::LeiPmdir->new($lei, $self); } + + # start watching Maildirs ASAP + if ($may_sync && $lei->{sto}) { + grep(!m!\Amaildir:/!i, @md) and die "BUG: @md (no pfx)"; + $lei->lms(1)->lms_write_prepare->add_folders(@md); + $lei->refresh_watches; + } } $self->{inputs} = $inputs; } @@ -372,6 +400,7 @@ sub input_only_net_merge_all_done { # like Getopt::Long, but for +kw:FOO and -kw:FOO to prepare # for update_xvmd -> update_vmd +# returns something like { "+L" => [ @Labels ], ... } sub vmd_mod_extract { my $argv = $_[-1]; my $vmd_mod = {};