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//) {
}
$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
$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 ]);
}
lei mail_sync uninitialized, see lei-import(1)
EOM
my $opt = $lei->{opt};
- my $all = $opt->{all};
- if (defined $all) { # --all=<local|remote>
- my %x = map { $_ => $_ } split(/,/, $all);
- my @ok = grep(defined, delete(@x{qw(local remote), ''}));
- my @no = keys %x;
- if (@no) {
- @no = (join(',', @no));
- return $lei->fail(<<EOM);
---all=@no not accepted (must be `local' and/or `remote')
-EOM
- }
- my (%seen, @inc);
- my @all = $lms->folders;
- for my $ok (@ok) {
- if ($ok eq 'local') {
- @inc = grep(!m!\A[a-z0-9\+]+://!i, @all);
- } elsif ($ok eq 'remote') {
- @inc = grep(m!\A[a-z0-9\+]+://!i, @all);
- } elsif ($ok ne '') {
- return $lei->fail("--all=$all not understood");
- } else {
- @inc = @all;
- }
- for (@inc) {
- push(@folders, $_) unless $seen{$_}++;
- }
- }
- return $lei->fail(<<EOM) if !@folders;
-no --mail-sync folders known to lei
-EOM
+ if (defined(my $all = $opt->{all})) { # --all=<local|remote>
+ $lms->group2folders($lei, $all, \@folders) or return;
} else {
my $err = $lms->arg2folder($lei, \@folders);
$lei->qerr(@{$err->{qerr}}) if $err->{qerr};
$lei->{wq1} = $self;
$lei->{-err_type} = 'non-fatal';
net_merge_all_done($self) unless $lei->{auth};
- $op_c->op_wait_event($ops); # calls net_merge_all_done if $lei->{auth}
+ $lei->wait_wq_events($op_c, $ops); # net_merge_all_done if !{auth}
}
sub _complete_export_kw {