]> Sergey Matveev's repositories - public-inbox.git/commitdiff
imap: omit $UID_END from mailbox name, use index
authorEric Wong <e@yhbt.net>
Wed, 10 Jun 2020 07:04:42 +0000 (07:04 +0000)
committerEric Wong <e@yhbt.net>
Sat, 13 Jun 2020 07:55:45 +0000 (07:55 +0000)
Having two large numbers separated by a dash can make visual
comparisons difficult when numbers are in the 3,000,000 range
for LKML.  So avoid the $UID_END value, since it can be
calculated from $UID_MIN.  And we can avoid large values of
$UID_MIN, too, by instead storing the block index and just
multiplying it by 50000 (and adding 1) on the server side.

Of course, LKML still goes up to 72, at the moment.

lib/PublicInbox/IMAP.pm
lib/PublicInbox/IMAPD.pm
t/imapd.t
xt/imapd-mbsync-oimap.t
xt/imapd-validate.t

index 6f64dff99585b738a75a2f076efed6a001a8daa7..5865822f0c3f12183d0390247e2ae590ee1c635b 100644 (file)
@@ -197,14 +197,10 @@ sub ensure_ranges_exist ($$$) {
        my $mailboxes = $imapd->{mailboxes};
        my $mb_top = $ibx->{newsgroup};
        my @created;
-       my $uid_min = UID_BLOCK * int($max/UID_BLOCK) + 1;
-       my $uid_end = $uid_min + UID_BLOCK - 1;
-       while ($uid_min > 0) {
-               my $sub_mailbox = "$mb_top.$uid_min-$uid_end";
+       for (my $i = int($max/UID_BLOCK); $i >= 0; --$i) {
+               my $sub_mailbox = "$mb_top.$i";
                last if exists $mailboxes->{$sub_mailbox};
                $mailboxes->{$sub_mailbox} = $ibx;
-               $uid_end -= UID_BLOCK;
-               $uid_min -= UID_BLOCK;
                push @created, $sub_mailbox;
        }
        return unless @created;
@@ -216,9 +212,9 @@ sub cmd_examine ($$$) {
        my ($self, $tag, $mailbox) = @_;
        my ($ibx, $mm, $max);
 
-       if ($mailbox =~ /\A(.+)\.([0-9]+)-([0-9]+)\z/) {
-               # old mail: inbox.comp.foo.$uid_min-$uid_end
-               my ($mb_top, $uid_min, $uid_end) = ($1, $2 + 0, $3 + 0);
+       if ($mailbox =~ /\A(.+)\.([0-9]+)\z/) {
+               # old mail: inbox.comp.foo.$uid_block_idx
+               my ($mb_top, $uid_min) = ($1, $2 * UID_BLOCK + 1);
 
                $ibx = $self->{imapd}->{mailboxes}->{lc $mailbox} or
                        return "$tag NO Mailbox doesn't exist: $mailbox\r\n";
@@ -227,6 +223,7 @@ sub cmd_examine ($$$) {
                $max = $mm->max // 0;
                $self->{uid_min} = $uid_min;
                ensure_ranges_exist($self->{imapd}, $ibx, $max);
+               my $uid_end = $uid_min + UID_BLOCK - 1;
                $max = $uid_end if $max > $uid_end;
        } else { # check for dummy inboxes
                $ibx = $self->{imapd}->{mailboxes}->{lc $mailbox} or
index 6488dc0f3bcbedbdd49fbcd6d2c9580e6f56e533..261d756042fbf7ee2856e486d11e28c46b3202e4 100644 (file)
@@ -31,7 +31,7 @@ sub imapd_refresh_ibx { # pi_config->each_inbox cb
                        join(', ', @$ngname). "\n";
                return;
        } elsif ($ngname =~ m![^a-z0-9/_\.\-\~\@\+\=:]! ||
-                $ngname =~ /\.[0-9]+-[0-9]+\z/) {
+                $ngname =~ /\.[0-9]+\z/) {
                warn "mailbox name invalid: newsgroup=`$ngname'\n";
                return;
        }
index 5d9a7d1181c78e907d6b46ffe787893b098e90bb..45ee401a1e0cfa598d10c07dde11da7a4b50c8f5 100644 (file)
--- a/t/imapd.t
+++ b/t/imapd.t
@@ -17,7 +17,7 @@ if ($can_compress) { # hope this gets fixed upstream, soon
 }
 
 require_ok 'PublicInbox::IMAP';
-my $first_range = '1-'.PublicInbox::IMAP::UID_BLOCK();
+my $first_range = '0';
 
 my $level = '-Lbasic';
 SKIP: {
index b2cb8737f82264bcd2d8e30a68f465c605236850..fdaa22aa9efb868b1b4da4206cc4ef525f81da37 100644 (file)
@@ -14,7 +14,7 @@ plan skip_all => "bad characters in $inboxdir" if $inboxdir =~ m![^\w\.\-/]!;
 my ($tmpdir, $for_destroy) = tmpdir();
 my $cfg = "$tmpdir/cfg";
 my $newsgroup = 'inbox.test';
-my $mailbox = "$newsgroup.1-50000";
+my $mailbox = "$newsgroup.0";
 {
        open my $fh, '>', $cfg or BAIL_OUT "open: $!";
        print $fh <<EOF or BAIL_OUT "print: $!";
index b7b66d0583f49869ca94785e072505f02fb9050b..aeeb43b9b40f2de330286349830929a8154d30e2 100644 (file)
@@ -39,7 +39,7 @@ if (($ENV{IMAP_TEST_URL} // '') =~ m!\Aimap://([^/]+)/(.+)\z!) {
 } else {
        require_mods(qw(DBD::SQLite));
        $make_local_server->();
-       $mailbox = "$newsgroup.1-50000";
+       $mailbox = "$newsgroup.0";
 }
 
 my %opts = (imap => \%OPT, 'imap+compress' => { %OPT, Compress => 1 });