]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/Inbox.pm
www: allow including links to NNTP sites in HTML footer
[public-inbox.git] / lib / PublicInbox / Inbox.pm
index dc9980b77c62b0db75b09b58897c40a17f1e0e16..414973c6dedd9b6137852695092877cc0b62e7a1 100644 (file)
@@ -34,6 +34,7 @@ sub new {
        my $v = $opts->{address} ||= 'public-inbox@example.com';
        my $p = $opts->{-primary_address} = ref($v) eq 'ARRAY' ? $v->[0] : $v;
        $opts->{domain} = ($p =~ /\@(\S+)\z/) ? $1 : 'localhost';
+       weaken($opts->{-pi_config});
        bless $opts, $class;
 }
 
@@ -44,11 +45,33 @@ sub _weaken_fields {
        }
 }
 
+sub _set_limiter ($$$) {
+       my ($self, $git, $pfx) = @_;
+       my $lkey = "-${pfx}_limiter";
+       $git->{$lkey} = $self->{$lkey} ||= eval {
+               my $mkey = $pfx.'max';
+               my $val = $self->{$mkey} or return;
+               my $lim;
+               if ($val =~ /\A\d+\z/) {
+                       require PublicInbox::Qspawn;
+                       $lim = PublicInbox::Qspawn::Limiter->new($val);
+               } elsif ($val =~ /\A[a-z][a-z0-9]*\z/) {
+                       $lim = $self->{-pi_config}->limiter($val);
+                       warn "$mkey limiter=$val not found\n" if !$lim;
+               } else {
+                       warn "$mkey limiter=$val not understood\n";
+               }
+               $lim;
+       }
+}
+
 sub git {
        my ($self) = @_;
        $self->{git} ||= eval {
                _weaken_later($self);
-               PublicInbox::Git->new($self->{mainrepo});
+               my $g = PublicInbox::Git->new($self->{mainrepo});
+               _set_limiter($self, $g, 'httpbackend');
+               $g;
        };
 }
 
@@ -64,7 +87,7 @@ sub search {
        my ($self) = @_;
        $self->{search} ||= eval {
                _weaken_later($self);
-               PublicInbox::Search->new($self->{mainrepo});
+               PublicInbox::Search->new($self->{mainrepo}, $self->{altid});
        };
 }
 
@@ -83,6 +106,7 @@ sub description {
        my $desc = $self->{description};
        return $desc if defined $desc;
        $desc = try_cat("$self->{mainrepo}/description");
+       local $/ = "\n";
        chomp $desc;
        $desc =~ s/\s+/ /smg;
        $desc = '($GIT_DIR/description missing)' if $desc eq '';
@@ -95,6 +119,7 @@ sub cloneurl {
        return $url if $url;
        $url = try_cat("$self->{mainrepo}/cloneurl");
        my @url = split(/\s+/s, $url);
+       local $/ = "\n";
        chomp @url;
        $self->{cloneurl} = \@url;
 }
@@ -122,6 +147,52 @@ sub base_url {
        }
 }
 
+sub nntp_url {
+       my ($self) = @_;
+       $self->{-nntp_url} ||= do {
+               # no checking for nntp_usable here, we can point entirely
+               # to non-local servers or users run by a different user
+               my $ns = $self->{-pi_config}->{'publicinbox.nntpserver'};
+               my $group = $self->{newsgroup};
+               my @urls;
+               if ($ns && $group) {
+                       $ns = [ $ns ] if ref($ns) ne 'ARRAY';
+                       @urls = map {
+                               my $u = m!\Anntps?://! ? $_ : "nntp://$_";
+                               $u .= '/' if $u !~ m!/\z!;
+                               $u.$group;
+                       } @$ns;
+               }
+
+               my $mirrors = $self->{nntpmirror};
+               if ($mirrors) {
+                       my @m;
+                       foreach (@$mirrors) {
+                               my $u = m!\Anntps?://! ? $_ : "nntp://$_";
+                               if ($u =~ m!\Anntps?://[^/]+/?\z!) {
+                                       if ($group) {
+                                               $u .= '/' if $u !~ m!/\z!;
+                                               $u .= $group;
+                                       } else {
+                                               warn
+"publicinbox.$self->{name}.nntpmirror=$_ missing newsgroup name\n";
+                                       }
+                               }
+                               # else: allow full URLs like:
+                               # nntp://news.example.com/alt.example
+                               push @m, $u;
+                       }
+                       my %seen = map { $_ => 1 } @urls;
+                       foreach my $u (@m) {
+                               next if $seen{$u};
+                               $seen{$u} = 1;
+                               push @urls, $u;
+                       }
+               }
+               \@urls;
+       };
+}
+
 sub nntp_usable {
        my ($self) = @_;
        my $ret = $self->mm && $self->search;
@@ -137,6 +208,18 @@ sub msg_by_path ($$;$) {
        $str;
 }
 
+sub msg_by_smsg ($$;$) {
+       my ($self, $smsg, $ref) = @_;
+
+       # backwards compat to fallback to msg_by_mid
+       # TODO: remove if we bump SCHEMA_VERSION in Search.pm:
+       defined(my $blob = $smsg->blob) or return msg_by_mid($self, $smsg->mid);
+
+       my $str = git($self)->cat_file($blob, $ref);
+       $$str =~ s/\A[\r\n]*From [^\r\n]*\r?\n//s if $str;
+       $str;
+}
+
 sub path_check {
        my ($self, $path) = @_;
        git($self)->check('HEAD:'.$path);