From: Eric Wong Date: Wed, 2 Oct 2024 22:39:02 +0000 (+0000) Subject: viewvcs: generate search query for merge commits X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d6b7a19e8490d799007f805caea92ab0f9f934c9;p=thirdparty%2Fpublic-inbox.git 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. --- 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