lib/PublicInbox/NNTP.pm | 12 ++++++------ public-inbox-nntpd | 26 +++++++++++++++++++------- diff --git a/lib/PublicInbox/NNTP.pm b/lib/PublicInbox/NNTP.pm index 8f8668591e51ce0e0ffce62f9caa28fb3a1bd223..79f2c2f8e3edc5b191c57c7e7f38018b349c6d53 100644 --- a/lib/PublicInbox/NNTP.pm +++ b/lib/PublicInbox/NNTP.pm @@ -93,7 +93,7 @@ sub list_active ($;$) { my ($self, $wildmat) = @_; wildmat2re($wildmat); - foreach my $ng (values %{$self->{nntpd}->{groups}}) { + foreach my $ng (@{$self->{nntpd}->{grouplist}}) { $ng->{name} =~ $wildmat or next; group_line($self, $ng); } @@ -102,7 +102,7 @@ sub list_active_times ($;$) { my ($self, $wildmat) = @_; wildmat2re($wildmat); - foreach my $ng (values %{$self->{nntpd}->{groups}}) { + foreach my $ng (@{$self->{nntpd}->{grouplist}}) { $ng->{name} =~ $wildmat or next; my $c = eval { $ng->mm->created_at } || time; more($self, "$ng->{name} $c $ng->{address}"); @@ -112,7 +112,7 @@ sub list_newsgroups ($;$) { my ($self, $wildmat) = @_; wildmat2re($wildmat); - foreach my $ng (values %{$self->{nntpd}->{groups}}) { + foreach my $ng (@{$self->{nntpd}->{grouplist}}) { $ng->{name} =~ $wildmat or next; my $d = $ng->description; more($self, "$ng->{name} $d"); @@ -137,7 +137,7 @@ more($self, '215 information follows'); $arg->($self, @args); } else { more($self, '215 list of newsgroups follows'); - foreach my $ng (values %{$self->{nntpd}->{groups}}) { + foreach my $ng (@{$self->{nntpd}->{grouplist}}) { group_line($self, $ng); } } @@ -200,7 +200,7 @@ return r501 if $@; # TODO dists more($self, '231 list of new newsgroups follows'); - foreach my $ng (values %{$self->{nntpd}->{groups}}) { + foreach my $ng (@{$self->{nntpd}->{grouplist}}) { my $c = eval { $ng->mm->created_at } || 0; next unless $c > $ts; group_line($self, $ng); @@ -249,7 +249,7 @@ my ($keep, $skip) = split('!', $newsgroups, 2); ngpat2re($keep); ngpat2re($skip); my @srch; - foreach my $ng (values %{$self->{nntpd}->{groups}}) { + foreach my $ng (@{$self->{nntpd}->{grouplist}}) { $ng->{name} =~ $keep or next; $ng->{name} =~ $skip and next; my $srch = $ng->search or next; diff --git a/public-inbox-nntpd b/public-inbox-nntpd index b66de58efba490facb0bc73a7e839ae0a26bfaa7..0395e98bcff3bd39569c2f6c591c504bd03777d3 100644 --- a/public-inbox-nntpd +++ b/public-inbox-nntpd @@ -298,7 +298,7 @@ 1; package PublicInbox::NNTPD; use strict; use warnings; -use fields qw(groups err out); +use fields qw(groups grouplist err out); sub new { my ($class) = @_; @@ -306,6 +306,7 @@ my $self = fields::new($class); $self->{groups} = {}; $self->{err} = \*STDERR; $self->{out} = \*STDOUT; + $self->{grouplist} = []; $self; } @@ -314,26 +315,37 @@ my ($self) = @_; require PublicInbox::Config; my $pi_config = PublicInbox::Config->new; my $new = {}; + my @list; foreach my $k (keys %$pi_config) { $k =~ /\Apublicinbox\.([^\.]+)\.mainrepo\z/ or next; my $g = $1; my $git_dir = $pi_config->{$k}; - my $address = $pi_config->{"publicinbox.$g.address"}; - my $ng = PublicInbox::NewsGroup->new($g, $git_dir, $address); + my $addr = $pi_config->{"publicinbox.$g.address"}; + my $ngname = $pi_config->{"publicinbox.$g.newsgroup"}; + if (defined $ngname) { + next if ($ngname eq ''); # disabled + $g = $ngname; + } + my $ng = PublicInbox::NewsGroup->new($g, $git_dir, $addr); my $old_ng = $self->{groups}->{$g}; - # Reuse the old one if possible since it can hold references - # to valid mm and gcf objects + # Reuse the old one if possible since it can hold + # references to valid mm and gcf objects if ($old_ng) { $old_ng->update($ng); $ng = $old_ng; } # Only valid if Msgmap works - $new->{$g} = $ng if $ng->mm(1); + if ($ng->mm(1)) { + $new->{$g} = $ng; + push @list, $ng; + } } + @list = sort { $a->{name} cmp $b->{name} } @list; + $self->{grouplist} = \@list; # this will destroy old groups that got deleted %{$self->{groups}} = %$new; -}; +} 1;