]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/Inbox.pm
inbox: msg_by_*: remove $(size)ref args
[public-inbox.git] / lib / PublicInbox / Inbox.pm
index 4f27d1bbb65f9aa5dee21b66aa5eb8202004f796..38abdfe584752c0a5123816fcd899bfa2890b45e 100644 (file)
@@ -7,7 +7,7 @@ use strict;
 use warnings;
 use PublicInbox::Git;
 use PublicInbox::MID qw(mid2path);
-use PublicInbox::MIME;
+use PublicInbox::Eml;
 
 # Long-running "git-cat-file --batch" processes won't notice
 # unlinked packs, so we need to restart those processes occasionally.
@@ -82,7 +82,7 @@ sub _set_uint ($$$) {
 sub _set_limiter ($$$) {
        my ($self, $pi_config, $pfx) = @_;
        my $lkey = "-${pfx}_limiter";
-       $self->{$lkey} ||= eval {
+       $self->{$lkey} ||= do {
                # full key is: publicinbox.$NAME.httpbackendmax
                my $mkey = $pfx.'max';
                my $val = $self->{$mkey} or return;
@@ -102,7 +102,7 @@ sub _set_limiter ($$$) {
 
 sub new {
        my ($class, $opts) = @_;
-       my $v = $opts->{address} ||= 'public-inbox@example.com';
+       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';
        my $pi_config = delete $opts->{-pi_config};
@@ -130,7 +130,7 @@ sub version { $_[0]->{version} // 1 }
 sub git_epoch {
        my ($self, $epoch) = @_;
        $self->version == 2 or return;
-       $self->{"$epoch.git"} ||= eval {
+       $self->{"$epoch.git"} ||= do {
                my $git_dir = "$self->{inboxdir}/git/$epoch.git";
                my $g = PublicInbox::Git->new($git_dir);
                $g->{-httpbackend_limiter} = $self->{-httpbackend_limiter};
@@ -141,7 +141,7 @@ sub git_epoch {
 
 sub git {
        my ($self) = @_;
-       $self->{git} ||= eval {
+       $self->{git} ||= do {
                my $git_dir = $self->{inboxdir};
                $git_dir .= '/all.git' if $self->version == 2;
                my $g = PublicInbox::Git->new($git_dir);
@@ -219,19 +219,23 @@ sub try_cat {
 
 sub description {
        my ($self) = @_;
-       $self->{description} //= do {
+       ($self->{description} //= do {
                my $desc = try_cat("$self->{inboxdir}/description");
                local $/ = "\n";
                chomp $desc;
+               utf8::decode($desc);
                $desc =~ s/\s+/ /smg;
-               $desc eq '' ? '($INBOX_DIR/description missing)' : $desc;
-       };
+               $desc eq '' ? undef : $desc;
+       }) // '($INBOX_DIR/description missing)';
 }
 
 sub cloneurl {
        my ($self) = @_;
-       $self->{cloneurl} //=
-               [ split(/\s+/s, try_cat("$self->{inboxdir}/cloneurl")) ];
+       ($self->{cloneurl} //= do {
+               my $s = try_cat("$self->{inboxdir}/cloneurl");
+               my @urls = split(/\s+/s, $s);
+               scalar(@urls) ? \@urls : undef
+       }) // [];
 }
 
 sub base_url {
@@ -306,34 +310,36 @@ sub nntp_usable {
 }
 
 # for v1 users w/o SQLite only
-sub msg_by_path ($$;$) {
-       my ($self, $path, $ref) = @_;
-       my $str = git($self)->cat_file('HEAD:'.$path, $ref);
-       $$str =~ s/\A[\r\n]*From [^\r\n]*\r?\n//s if $str;
-       $str;
+sub msg_by_path ($$) {
+       my ($self, $path) = @_;
+       git($self)->cat_file('HEAD:'.$path);
 }
 
-sub msg_by_smsg ($$;$) {
-       my ($self, $smsg, $ref) = @_;
+sub msg_by_smsg ($$) {
+       my ($self, $smsg) = @_;
 
        # ghosts may have undef smsg (from SearchThread.node) or
        # no {blob} field
        return unless defined $smsg;
        defined(my $blob = $smsg->{blob}) or return;
 
-       my $str = git($self)->cat_file($blob, $ref);
-       $$str =~ s/\A[\r\n]*From [^\r\n]*\r?\n//s if $str;
-       $str;
+       git($self)->cat_file($blob);
 }
 
 sub smsg_mime {
-       my ($self, $smsg, $ref) = @_;
-       if (my $s = msg_by_smsg($self, $smsg, $ref)) {
-               $smsg->{mime} = PublicInbox::MIME->new($s);
+       my ($self, $smsg) = @_;
+       if (my $s = msg_by_smsg($self, $smsg)) {
+               $smsg->{mime} = PublicInbox::Eml->new($s);
                return $smsg;
        }
 }
 
+sub smsg_eml {
+       my ($self, $smsg) = @_;
+       my $bref = msg_by_smsg($self, $smsg) or return;
+       PublicInbox::Eml->new($bref);
+}
+
 sub mid2num($$) {
        my ($self, $mid) = @_;
        my $mm = mm($self) or return;
@@ -349,14 +355,14 @@ sub smsg_by_mid ($$) {
        PublicInbox::Smsg::psgi_cull($smsg);
 }
 
-sub msg_by_mid ($$;$) {
-       my ($self, $mid, $ref) = @_;
+sub msg_by_mid ($$) {
+       my ($self, $mid) = @_;
 
        over($self) or
-               return msg_by_path($self, mid2path($mid), $ref);
+               return msg_by_path($self, mid2path($mid));
 
        my $smsg = smsg_by_mid($self, $mid);
-       $smsg ? msg_by_smsg($self, $smsg, $ref) : undef;
+       $smsg ? msg_by_smsg($self, $smsg) : undef;
 }
 
 sub recent {
@@ -376,4 +382,19 @@ sub modified {
        git($self)->modified; # v1
 }
 
+# returns prefix => pathname mapping
+# (pathname is NOT public, but prefix is used for Xapian queries)
+sub altid_map ($) {
+       my ($self) = @_;
+       $self->{-altid_map} //= eval {
+               require PublicInbox::AltId;
+               my $altid = $self->{altid} or return {};
+               my %h = map {;
+                       my $x = PublicInbox::AltId->new($self, $_);
+                       "$x->{prefix}" => $x->{filename}
+               } @$altid;
+               \%h;
+       } // {};
+}
+
 1;