From d6b7a19e8490d799007f805caea92ab0f9f934c9 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Wed, 2 Oct 2024 22:39:02 +0000 Subject: [PATCH] viewvcs: generate search query for merge commits Attempt to parse commit titles out of merge commit messages and generate search queries out of them to find the related emails for the individual patch(es). As with all search-related functionality, it's best-effort and inexact, but seems somewhat successful. --- lib/PublicInbox/ViewVCS.pm | 70 ++++++++++++++++++++++++++++---------- 1 file changed, 52 insertions(+), 18 deletions(-) diff --git a/lib/PublicInbox/ViewVCS.pm b/lib/PublicInbox/ViewVCS.pm index 49477619d..d9df671c2 100644 --- a/lib/PublicInbox/ViewVCS.pm +++ b/lib/PublicInbox/ViewVCS.pm @@ -154,7 +154,7 @@ sub do_check_async { } } -sub cmt_hdr_prep { # psgi_qx cb +sub cmt_hdr_prep { # psgi_qx cb for "git show" commit output my ($fh, $ctx, $cmt_fin) = @_; return if $ctx->{-qsp_err_h}; # let cmt_fin handle it seek $fh, 0, SEEK_SET; @@ -221,7 +221,26 @@ sub ibx_url_for { wantarray ? (@ret) : $ret[0]; } -sub cmt_fin { # OnDestroy cb +sub prep_merge_titles ($) { + my ($in_titles, @s, $t, @lines); + chomp(@lines = split /^/ms, $_[0]); + for (@lines) { + if (/^\* /) { # * branch/name: + $in_titles = 1; + } elsif ($in_titles) { # commit titles + if (s/^ //) { # break up Xapian phrases + $t = join " AND\n ", map { qq{s:"$_"} } + split /["\x{201c}\x{201d}]+/; + push @s, $t if $t ne 's:"..."'; + } else { # trailing text or trailers? + undef $in_titles; + } + } # else: preamble text + } + @s ? \@s : undef; +} + +sub cmt_fin { # OnDestroy cb for `git show' commit output my ($ctx) = @_; my ($eh, $ep) = delete @$ctx{qw(-qsp_err_h -qsp_err_p)}; if ($eh || $ep) { @@ -242,7 +261,17 @@ sub cmt_fin { # OnDestroy cb $au =~ s/>/>$x/; } $_ = ascii_html($_) for ($au, $co); - my $ibx_url = ibx_url_for($ctx) // $upfx; + my ($merge_titles, $ibx_url, $ibx_url_html, $alt); + $ibx_url = ibx_url_for($ctx); + if (defined $ibx_url) { + $ibx_url =~ m!://! or + substr($ibx_url, 0, 0, '../../../'); + $ibx_url_html = ascii_html($ibx_url); + $alt = " `$ibx_url_html'"; + } else { + $ibx_url = $ibx_url_html = $upfx; + $alt = ''; + } $au =~ s!(> +)([0-9]{4,}-\S+ \S+)! my ($gt, $t) = ($1, $2); $t =~ tr/ :-//d; @@ -258,6 +287,7 @@ title="list contemporary emails">$2) $x = qq{ (patch)\n parent $P->[0]}; } elsif (@$P > 1) { + $merge_titles = 1; $x = qq(\n parents $P->[0]\n); shift @$P; $x .= qq( $_\n) for @$P; @@ -275,7 +305,10 @@ committer $co $title_html EOM - print $zfh "\n", $ctx->{-linkify}->to_html($bdy) if length($bdy); + if (length($bdy)) { + print $zfh "\n", $ctx->{-linkify}->to_html($bdy); + $merge_titles = prep_merge_titles $bdy if $merge_titles; + } undef $bdy; # free memory my $fh = delete $ctx->{patch_fh}; if (-s $fh > $MAX_SIZE) { @@ -293,26 +326,27 @@ EOM # commit? print $zfh ''; my ($rows, $q) = PublicInbox::View::dfqry_text $ctx, $s; - if ($rows) { - my $ibx_url = ibx_url_for($ctx); - my $alt; - if (defined $ibx_url) { - $alt = " `$ibx_url'"; - $ibx_url =~ m!://! or - substr($ibx_url, 0, 0, '../../../'); - $ibx_url = ascii_html($ibx_url); - } else { - $ibx_url = $upfx; - $alt = ''; - } - print $zfh < EOM - } + } + if (ref $merge_titles) { + print $zfh <
find merged patch emails
+
+
+EOM + undef $merge_titles; } chop($x = <
glossary
-- 
2.47.2