From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-2.9 required=3.0 tests=ALL_TRUSTED,AWL,BAYES_00, URIBL_BLOCKED shortcircuit=no autolearn=unavailable version=3.3.2 X-Original-To: meta@public-inbox.org Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id EAFCD1F81A; Sun, 16 Aug 2015 08:55:41 +0000 (UTC) Date: Sun, 16 Aug 2015 08:55:41 +0000 From: Eric Wong To: meta@public-inbox.org Subject: [RFC 12/11] view: deduplicate common code for loading search results Message-ID: <20150816085541.GA26975@dcvr.yhbt.net> References: <1439714279-21923-1-git-send-email-e@80x24.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1439714279-21923-1-git-send-email-e@80x24.org> List-Id: More to come later. --- lib/PublicInbox/MID.pm | 14 +++++++- lib/PublicInbox/View.pm | 91 +++++++++++++++++-------------------------------- lib/PublicInbox/WWW.pm | 15 ++------ 3 files changed, 48 insertions(+), 72 deletions(-) diff --git a/lib/PublicInbox/MID.pm b/lib/PublicInbox/MID.pm index e5a30a1..d097011 100644 --- a/lib/PublicInbox/MID.pm +++ b/lib/PublicInbox/MID.pm @@ -4,7 +4,7 @@ package PublicInbox::MID; use strict; use warnings; use base qw/Exporter/; -our @EXPORT_OK = qw/mid_clean mid_compressed/; +our @EXPORT_OK = qw/mid_clean mid_compressed mid2path/; use Digest::SHA qw/sha1_hex/; use constant MID_MAX => 40; # SHA-1 hex length @@ -24,4 +24,16 @@ sub mid_compressed { sha1_hex($mid); } +sub mid2path { + my ($mid) = @_; + my ($x2, $x38) = ($mid =~ /\A([a-f0-9]{2})([a-f0-9]{38})\z/); + + unless (defined $x38) { + # compatibility with old links (or short Message-IDs :) + $mid = sha1_hex($mid); + ($x2, $x38) = ($mid =~ /\A([a-f0-9]{2})([a-f0-9]{38})\z/); + } + "$x2/$x38"; +} + 1; diff --git a/lib/PublicInbox/View.pm b/lib/PublicInbox/View.pm index 696d7d5..575c5ff 100644 --- a/lib/PublicInbox/View.pm +++ b/lib/PublicInbox/View.pm @@ -9,7 +9,7 @@ use Encode qw/find_encoding/; use Encode::MIME::Header; use Email::MIME::ContentType qw/parse_content_type/; use PublicInbox::Hval; -use PublicInbox::MID qw/mid_clean mid_compressed/; +use PublicInbox::MID qw/mid_clean mid_compressed mid2path/; use Digest::SHA; require POSIX; @@ -138,37 +138,11 @@ sub thread_html { my $mid = mid_compressed($ctx->{mid}); my $res = $srch->get_thread($mid); my $rv = ''; - require PublicInbox::GitCatFile; - my $git = PublicInbox::GitCatFile->new($ctx->{git_dir}); - my $nr = scalar @{$res->{msgs}}; + my $msgs = load_results($ctx, $res); + my $nr = scalar @$msgs; return $rv if $nr == 0; - my @msgs; - while (my $smsg = shift @{$res->{msgs}}) { - my $m = $smsg->mid; - - # Duplicated from WWW.pm - my ($x2, $x38) = ($m =~ /\A([a-f0-9]{2})([a-f0-9]{38})\z/); - - unless (defined $x38) { - require Digest::SHA; - $m = Digest::SHA::sha1_hex($m); - ($x2, $x38) = ($m =~ /\A([a-f0-9]{2})([a-f0-9]{38})\z/); - } - - # FIXME: duplicated code from Feed.pm - my $mime = eval { - my $str = $git->cat_file("HEAD:$x2/$x38"); - Email::MIME->new($str); - }; - unless ($@) { - my $t = eval { str2time($mime->header('Date')) }; - defined($t) or $t = 0; - $mime->header_set('X-PI-TS', $t); - push @msgs, $mime; - } - } require PublicInbox::Thread; - my $th = PublicInbox::Thread->new(@msgs); + my $th = PublicInbox::Thread->new(@$msgs); $th->thread; $th->order(*PublicInbox::Thread::sort_ts); my $state = [ undef, { root_anchor => anchor_for($mid) }, undef, 0 ]; @@ -184,37 +158,11 @@ sub subject_path_html { my $path = $ctx->{subject_path}; my $res = $srch->get_subject_path($path); my $rv = ''; - require PublicInbox::GitCatFile; - my $git = PublicInbox::GitCatFile->new($ctx->{git_dir}); - my $nr = scalar @{$res->{msgs}}; + my $msgs = load_results($ctx, $res); + my $nr = scalar @$msgs; return $rv if $nr == 0; - my @msgs; - while (my $smsg = shift @{$res->{msgs}}) { - my $m = $smsg->mid; - - # Duplicated from WWW.pm - my ($x2, $x38) = ($m =~ /\A([a-f0-9]{2})([a-f0-9]{38})\z/); - - unless (defined $x38) { - require Digest::SHA; - $m = Digest::SHA::sha1_hex($m); - ($x2, $x38) = ($m =~ /\A([a-f0-9]{2})([a-f0-9]{38})\z/); - } - - # FIXME: duplicated code from Feed.pm - my $mime = eval { - my $str = $git->cat_file("HEAD:$x2/$x38"); - Email::MIME->new($str); - }; - unless ($@) { - my $t = eval { str2time($mime->header('Date')) }; - defined($t) or $t = 0; - $mime->header_set('X-PI-TS', $t); - push @msgs, $mime; - } - } require PublicInbox::Thread; - my $th = PublicInbox::Thread->new(@msgs); + my $th = PublicInbox::Thread->new(@$msgs); $th->thread; $th->order(*PublicInbox::Thread::sort_ts); my $state = [ undef, { root_anchor => 'dummy' }, undef, 0 ]; @@ -597,4 +545,29 @@ sub thread_entry { thread_entry($dst, $state, $node->next, $level) if $node->next; } +sub load_results { + my ($ctx, $res) = @_; + + require PublicInbox::GitCatFile; + my $git = PublicInbox::GitCatFile->new($ctx->{git_dir}); + my @msgs; + while (my $smsg = shift @{$res->{msgs}}) { + my $m = $smsg->mid; + my $path = mid2path($m); + + # FIXME: duplicated code from Feed.pm + my $mime = eval { + my $str = $git->cat_file("HEAD:$path"); + Email::MIME->new($str); + }; + unless ($@) { + my $t = eval { str2time($mime->header('Date')) }; + defined($t) or $t = 0; + $mime->header_set('X-PI-TS', $t); + push @msgs, $mime; + } + } + \@msgs; +} + 1; diff --git a/lib/PublicInbox/WWW.pm b/lib/PublicInbox/WWW.pm index 7fe9b85..bbd438a 100644 --- a/lib/PublicInbox/WWW.pm +++ b/lib/PublicInbox/WWW.pm @@ -141,19 +141,10 @@ sub get_index { # just returns a string ref for the blob in the current ctx sub mid2blob { my ($ctx) = @_; - my $hex = $ctx->{mid}; - my ($x2, $x38) = ($hex =~ /\A([a-f0-9]{2})([a-f0-9]{38})\z/); - - unless (defined $x38) { - # compatibility with old links - require Digest::SHA; - $hex = Digest::SHA::sha1_hex($hex); - ($x2, $x38) = ($hex =~ /\A([a-f0-9]{2})([a-f0-9]{38})\z/); - defined $x38 or die "BUG: not a SHA-1 hex: $hex"; - } - + require PublicInbox::MID; + my $path = PublicInbox::MID::mid2path($ctx->{mid}); my @cmd = ('git', "--git-dir=$ctx->{git_dir}", - qw(cat-file blob), "HEAD:$x2/$x38"); + qw(cat-file blob), "HEAD:$path"); my $cmd = join(' ', @cmd); my $pid = open my $fh, '-|'; defined $pid or die "fork failed: $!\n"; -- EW