]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/LeiExportKw.pm
www_stream: note existence of IMAP and NNTP URLs
[public-inbox.git] / lib / PublicInbox / LeiExportKw.pm
index 671a84df966d2f588614375a34f5b3c314fa5f46..d37f3768202619d434060981580ae27b0d2a76e0 100644 (file)
@@ -10,8 +10,7 @@ use Errno qw(EEXIST ENOENT);
 
 sub export_kw_md { # LeiMailSync->each_src callback
        my ($oidbin, $id, $self, $mdir) = @_;
-       my $oidhex = unpack('H*', $oidbin);
-       my $sto_kw = $self->{lse}->oid_keywords($oidhex) or return;
+       my $sto_kw = $self->{lse}->oidbin_keywords($oidbin) or return;
        my $bn = $$id;
        my ($md_kw, $unknown, @try);
        if ($bn =~ s/:2,([a-zA-Z]*)\z//) {
@@ -26,12 +25,11 @@ sub export_kw_md { # LeiMailSync->each_src callback
        }
        $bn .= ':2,'.
                PublicInbox::LeiToMail::kw2suffix([keys %$sto_kw], @$unknown);
+       return if $bn eq $$id;
        my $dst = "$mdir/cur/$bn";
-       my @fail;
        my $lei = $self->{lei};
        for my $d (@try) {
                my $src = "$mdir/$d/$$id";
-               next if $src eq $dst;
 
                # we use link(2) + unlink(2) since rename(2) may
                # inadvertently clobber if the "uniquefilename" part wasn't
@@ -45,25 +43,24 @@ sub export_kw_md { # LeiMailSync->each_src callback
                        $lei->{sto}->ipc_do('lms_mv_src', "maildir:$mdir",
                                                $oidbin, $id, $bn);
                        return; # success anyways if link(2) worked
-               }
-               if ($! == ENOENT && !-e $src) { # some other process moved it
-                       $lei->{sto}->ipc_do('lms_clear_src',
-                                               "maildir:$mdir", $id);
-                       next;
-               }
-               push @fail, $src if $! != EEXIST;
+               } elsif ($! == EEXIST) { # lost race with lei/store?
+                       return;
+               } elsif ($! != ENOENT) {
+                       $lei->child_error(1, "E: link($src -> $dst): $!");
+               } # else loop @try
        }
-       return unless @fail;
-       # both tries failed
        my $e = $!;
-       my $orig = '['.join('|', @fail).']';
-       $lei->child_error(1, "link($orig, $dst) ($oidhex): $e");
+       # both tries failed
+       my $oidhex = unpack('H*', $oidbin);
+       my $src = "$mdir/{".join(',', @try)."}/$$id";
+       $lei->child_error(1, "link($src -> $dst) ($oidhex): $e");
+       for (@try) { return if -e "$mdir/$_/$$id" }
+       $lei->{sto}->ipc_do('lms_clear_src', "maildir:$mdir", $id);
 }
 
 sub export_kw_imap { # LeiMailSync->each_src callback
        my ($oidbin, $id, $self, $mic) = @_;
-       my $oidhex = unpack('H*', $oidbin);
-       my $sto_kw = $self->{lse}->oid_keywords($oidhex) or return;
+       my $sto_kw = $self->{lse}->oidbin_keywords($oidbin) or return;
        $self->{imap_mod_kw}->($self->{nwr}, $mic, $id, [ keys %$sto_kw ]);
 }
 
@@ -148,7 +145,4 @@ no warnings 'once';
 *ipc_atfork_child = \&PublicInbox::LeiInput::input_only_atfork_child;
 *net_merge_all_done = \&PublicInbox::LeiInput::input_only_net_merge_all_done;
 
-# the following works even when LeiAuth is lazy-loaded
-*net_merge_all = \&PublicInbox::LeiAuth::net_merge_all;
-
 1;