}
sub imap_uri {
- my ($url) = @_;
+ my ($url, $ls_ok) = @_;
require PublicInbox::URIimap;
my $uri = PublicInbox::URIimap->new($url);
- $uri ? $uri->canonical : undef;
+ $uri && ($ls_ok || $uri->mailbox) ? $uri->canonical : undef;
}
my %IS_NNTP = (news => 1, snews => 1, nntp => 1, nntps => 1);
sub nntp_uri {
- my ($url) = @_;
+ my ($url, $ls_ok) = @_;
require PublicInbox::URInntps;
my $uri = PublicInbox::URInntps->new($url);
- $uri && $IS_NNTP{$uri->scheme} && $uri->group ? $uri->canonical : undef;
+ $uri && $IS_NNTP{$uri->scheme} && ($ls_ok || $uri->group) ?
+ $uri->canonical : undef;
}
sub cfg_intvl ($$$) {
}
sub add_url {
- my ($self, $arg) = @_;
+ my ($self, $arg, $ls_ok) = @_;
my $uri;
- if ($uri = imap_uri($arg)) {
+ if ($uri = imap_uri($arg, $ls_ok)) {
+ $_[1] = $$uri; # canonicalized
push @{$self->{imap_order}}, $uri;
- } elsif ($uri = nntp_uri($arg)) {
+ } elsif ($uri = nntp_uri($arg, $ls_ok)) {
+ $_[1] = $$uri; # canonicalized
push @{$self->{nntp_order}}, $uri;
} else {
push @{$self->{unsupported_url}}, $arg;
my ($self, $uri, $uid, $raw, $flags) = @_;
# our target audience expects LF-only, save storage
$$raw =~ s/\r\n/\n/sg;
- my $kw = flags2kw($self, $uri, $uid, $flags) // return;
+ my $kw = defined($flags) ?
+ (flags2kw($self, $uri, $uid, $flags) // return) : undef;
my ($eml_cb, @args) = @{$self->{eml_each}};
$eml_cb->($uri, $uid, $kw, PublicInbox::Eml->new($raw), @args);
}
my ($self, $mic, $uri, $l_uid) = @_;
$l_uid ||= 1;
my $sec = uri_section($uri);
- my $bs = $self->{imap_opt}->{$sec}->{batch_size} // 10000;
+ my $bs = ($self->{imap_opt}->{$sec}->{batch_size} // 1) * 10000;
my ($eml_cb, @args) = @{$self->{eml_each}};
+ $self->{quiet} or warn "# $uri syncing flags 1:$l_uid\n";
for (my $n = 1; $n <= $l_uid; $n += $bs) {
my $end = $n + $bs;
$end = $l_uid if $end > $l_uid;
undef;
}
+# may be overridden in NetWriter or Watch
+sub folder_select { $_[0]->{each_old} ? 'select' : 'examine' }
+
sub _imap_fetch_all ($$$) {
my ($self, $mic, $orig_uri) = @_;
my $sec = uri_section($orig_uri);
# we need to check for mailbox writability to see if we care about
# FLAGS from already-imported messages.
- my $cmd = $self->{each_old} ? 'select' : 'examine';
+ my $cmd = $self->folder_select;
$mic->$cmd($mbx) or return "E: \U$cmd\E $mbx ($sec) failed: $!";
my ($r_uidval, $r_uidnext, $perm_fl);
EOF
$mic->Uid(1); # the default, we hope
my $err;
- if (!defined($single_uid) && $self->{each_old} &&
- perm_fl_ok($perm_fl)) {
+ my $use_fl = perm_fl_ok($perm_fl);
+ if (!defined($single_uid) && $self->{each_old} && $use_fl) {
$err = each_old_flags($self, $mic, $uri, $l_uid);
return $err if $err;
}
# messages get deleted, so holes appear
my $per_uid = delete $r->{$uid} // next;
my $raw = delete($per_uid->{$key}) // next;
- _imap_do_msg($self, $uri, $uid, \$raw,
- $per_uid->{FLAGS});
+ my $fl = $use_fl ? $per_uid->{FLAGS} : undef;
+ _imap_do_msg($self, $uri, $uid, \$raw, $fl);
$last_uid = $uid;
last if $self->{quit};
}