qw(save output|mfolder|o=s format|f=s dedupe|d=s threads|t+
sort|s=s reverse|r offset=i pretty jobs|j=s globoff|g augment|a
import-before! lock=s@ rsyncable alert=s@ mua=s verbose|v+
- color!), @c_opt, opt_dash('limit|n=i', '[0-9]+') ],
+ color! mail-sync!), @c_opt, opt_dash('limit|n=i', '[0-9]+') ],
'up' => [ 'OUTPUT|--all', 'update saved search',
qw(jobs|j=s lock=s@ alert=s@ mua=s verbose|v+ all:s), @c_opt ],
\@docids;
}
-sub set_sync_info ($$$) {
- my ($self, $oidhex, $sync_info) = @_;
+sub set_sync_info {
+ my ($self, $oidhex, $folder, $id) = @_;
($self->{lms} //= do {
require PublicInbox::LeiMailSync;
my $f = "$self->{priv_eidx}->{topdir}/mail_sync.sqlite3";
my $lms = PublicInbox::LeiMailSync->new($f);
$lms->lms_begin;
$lms;
- })->set_src($oidhex, @$sync_info);
+ })->set_src($oidhex, $folder, $id);
}
sub add_eml {
my $smsg = bless { -oidx => $oidx }, 'PublicInbox::Smsg';
my $im_mark = $im->add($eml, undef, $smsg);
if ($vmd && $vmd->{sync_info}) {
- set_sync_info($self, $smsg->{blob}, $vmd->{sync_info});
+ set_sync_info($self, $smsg->{blob}, @{$vmd->{sync_info}});
}
$im_mark or return; # duplicate blob returns undef
my $kw = $smsg->{kw} // [];
my $sfx = join('', sort(map { $kw2char{$_} // () } @$kw));
my $rand = ''; # chosen by die roll :P
- my ($tmp, $fh, $final, $ok);
+ my ($tmp, $fh, $base, $ok);
my $common = $smsg->{blob} // _rand;
if (defined(my $pct = $smsg->{pct})) { $common .= "=$pct" }
do {
$dst .= 'cur/';
$rand = '';
do {
- $final = $dst.$rand.$common.':2,'.$sfx;
- } while (!($ok = link($tmp, $final)) && $!{EEXIST} &&
+ $base = $rand.$common.':2,'.$sfx
+ } while (!($ok = link($tmp, $dst.$base)) && $!{EEXIST} &&
($rand = _rand.','));
- die "link($tmp, $final): $!" unless $ok;
+ die "link($tmp, $dst$base): $!" unless $ok;
unlink($tmp) or warn "W: failed to unlink $tmp: $!\n";
+ \$base;
} else {
my $err = "Error writing $smsg->{blob} to $dst: $!\n";
$_[0] = undef; # clobber dst
$dedupe->prepare_dedupe if $dedupe;
my $dst = $lei->{ovv}->{dst};
my $lse = $lei->{lse}; # may be undef
+ my $sto = $lei->{opt}->{'mail-sync'} ? $lei->{sto} : undef;
+ my $out = $sto ? 'maildir:'.$lei->rel2abs($dst) : undef;
sub { # for git_to_mail
my ($bref, $smsg, $eml) = @_;
$dst // return $lei->fail; # dst may be undef-ed in last run
return if $dedupe && $dedupe->is_dup($eml //
PublicInbox::Eml->new($$bref));
$lse->xsmsg_vmd($smsg) if $lse;
- _buf2maildir($dst, $bref // \($eml->as_string), $smsg);
+ my $n = _buf2maildir($dst, $bref // \($eml->as_string), $smsg);
+ $sto->ipc_do('set_sync_info', $smsg->{blob}, $out, $n) if $sto;
++$lei->{-nr_write};
}
}
my ($self, $lei) = @_;
my $dedupe = $lei->{dedupe};
$dedupe->prepare_dedupe if $dedupe;
- my $imap_append = $lei->{net}->can('imap_append');
+ my $append = $lei->{net}->can('imap_append');
my $mic = $lei->{net}->mic_get($self->{uri});
my $folder = $self->{uri}->mailbox;
my $lse = $lei->{lse}; # may be undef
+ my $sto = $lei->{opt}->{'mail-sync'} ? $lei->{sto} : undef;
+ my $out = $lei->{ovv}->{dst};
sub { # for git_to_mail
my ($bref, $smsg, $eml) = @_;
$mic // return $lei->fail; # mic may be undef-ed in last run
return if $dedupe && $dedupe->is_dup($eml //
PublicInbox::Eml->new($$bref));
$lse->xsmsg_vmd($smsg) if $lse;
- eval { $imap_append->($mic, $folder, $bref, $smsg, $eml) };
+ my $uid = eval { $append->($mic, $folder, $bref, $smsg, $eml) };
if (my $err = $@) {
undef $mic;
die $err;
}
+ # imap_append returns UID if IMAP server has UIDPLUS extension
+ ($sto && $uid =~ /\A[0-9]+\z/) and
+ $sto->ipc_do('set_sync_info',
+ $smsg->{blob}, $out, $uid + 0);
++$lei->{-nr_write};
}
}