]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/IMAPD.pm
imap: support LIST command
[public-inbox.git] / lib / PublicInbox / IMAPD.pm
index 05aa30e42a15acb30e288896016c3d1f5df3fa3d..a3a2598661bbf97d09b0c5ddb550f5c9faeca506 100644 (file)
@@ -21,10 +21,35 @@ sub new {
        }, $class;
 }
 
+sub refresh_inboxlist ($) {
+       my ($self) = @_;
+       my @names = map { $_->{newsgroup} } @{delete $self->{grouplist}};
+       my %ns; # "\Noselect \HasChildren"
+       for (@names) {
+               my $up = $_;
+               while ($up =~ s/\.[^\.]+\z//) {
+                       $ns{$up} = '\\Noselect \\HasChildren';
+               }
+       }
+       @names = map {;
+               my $at = delete($ns{$_}) ? '\\HasChildren' : '\\HasNoChildren';
+               qq[* LIST ($at) "." $_\r\n]
+       } @names;
+       push(@names, map { qq[* LIST ($ns{$_}) "." $_\r\n] } keys %ns);
+       @names = sort {
+               my ($xa) = ($a =~ / (\S+)\r\n/g);
+               my ($xb) = ($b =~ / (\S+)\r\n/g);
+               length($xa) <=> length($xb);
+       } @names;
+       $self->{inboxlist} = \@names;
+}
+
 sub refresh_groups {
        my ($self) = @_;
        my $pi_config = $self->{pi_config} = PublicInbox::Config->new;
        $self->SUPER::refresh_groups($pi_config);
+       refresh_inboxlist($self);
+
        if (my $idler = $self->{idler}) {
                $idler->refresh($pi_config);
        }