From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-4.0 required=3.0 tests=ALL_TRUSTED,BAYES_00 shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 352371F8C8 for ; Thu, 2 Sep 2021 10:17:59 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 2/3] lei_input: set and prepare watches early Date: Thu, 2 Sep 2021 10:17:57 +0000 Message-Id: <20210902101758.18715-3-e@80x24.org> In-Reply-To: <20210902101758.18715-1-e@80x24.org> References: <20210902101758.18715-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: This will be needed as we track changes in real-time, especially for "lei index" since there's no storage involved. --- lib/PublicInbox/LeiInput.pm | 20 ++++++++++++++------ lib/PublicInbox/LeiStore.pm | 7 +++++++ 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/lib/PublicInbox/LeiInput.pm b/lib/PublicInbox/LeiInput.pm index 88889f45..1b28f36f 100644 --- a/lib/PublicInbox/LeiInput.pm +++ b/lib/PublicInbox/LeiInput.pm @@ -225,6 +225,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,12 +268,12 @@ 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 - $sync and $input = 'maildir:'. + $may_sync and $input = 'maildir:'. $lei->abs_path($input_path); } else { return $lei->fail("Unable to handle $input"); @@ -294,7 +295,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 { @@ -303,15 +304,15 @@ $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 - $sync and $input = 'maildir:'. + $may_sync and $input = 'maildir:'. $lei->abs_path($input); } else { return $lei->fail("Unable to handle $input") @@ -343,6 +344,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)"; + my $wait = $lei->{sto}->ipc_do('add_sync_folders', @md); + $lei->refresh_watches; + } } $self->{inputs} = $inputs; } diff --git a/lib/PublicInbox/LeiStore.pm b/lib/PublicInbox/LeiStore.pm index 6c557d99..0fa2d3c0 100644 --- a/lib/PublicInbox/LeiStore.pm +++ b/lib/PublicInbox/LeiStore.pm @@ -537,4 +537,11 @@ sub git_blob_id { # called via LEI->git_blob_id git_sha(1, $eml)->hexdigest; } +# called by lei-daemon before lei->refresh_watches +sub add_sync_folders { + my ($self, @folders) = @_; + my $lms = _lms_rw($self); + for my $f (@folders) { $lms->fid_for($f, 1) } +} + 1;