Skip to content

Commit be8b906

Browse files
committed
gitweb: Better chopping in commit search results
When searching commit messages (commit search), if matched string is too long, the generated HTML was munged leading to an ill-formed XHTML document. Now gitweb chop leading, trailing and matched parts, HTML escapes those parts, then composes and marks up match info. HTML output is never chopped. Limiting matched info to 80 columns (with slop) is now done by dividing remaining characters after chopping match equally to leading and trailing part, not by chopping composed and HTML marked output. Noticed-by: Jean-Baptiste Quenot <[email protected]> Signed-off-by: Junio C Hamano <[email protected]> Signed-off-by: Jakub Narebski <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent fd74cb0 commit be8b906

File tree

1 file changed

+15
-9
lines changed

1 file changed

+15
-9
lines changed

gitweb/gitweb.perl

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3784,18 +3784,24 @@ sub git_search_grep_body {
37843784
print "<td title=\"$co{'age_string_age'}\"><i>$co{'age_string_date'}</i></td>\n" .
37853785
"<td><i>" . $author . "</i></td>\n" .
37863786
"<td>" .
3787-
$cgi->a({-href => href(action=>"commit", hash=>$co{'id'}), -class => "list subject"},
3788-
chop_and_escape_str($co{'title'}, 50) . "<br/>");
3787+
$cgi->a({-href => href(action=>"commit", hash=>$co{'id'}),
3788+
-class => "list subject"},
3789+
chop_and_escape_str($co{'title'}, 50) . "<br/>");
37893790
my $comment = $co{'comment'};
37903791
foreach my $line (@$comment) {
37913792
if ($line =~ m/^(.*)($search_regexp)(.*)$/i) {
3792-
my $lead = esc_html($1) || "";
3793-
$lead = chop_str($lead, 30, 10);
3794-
my $match = esc_html($2) || "";
3795-
my $trail = esc_html($3) || "";
3796-
$trail = chop_str($trail, 30, 10);
3797-
my $text = "$lead<span class=\"match\">$match</span>$trail";
3798-
print chop_str($text, 80, 5) . "<br/>\n";
3793+
my ($lead, $match, $trail) = ($1, $2, $3);
3794+
$match = chop_str($match, 70, 5); # in case match is very long
3795+
my $contextlen = (80 - len($match))/2; # is left for the remainder
3796+
$contextlen = 30 if ($contextlen > 30); # but not too much
3797+
$lead = chop_str($lead, $contextlen, 10);
3798+
$trail = chop_str($trail, $contextlen, 10);
3799+
3800+
$lead = esc_html($lead);
3801+
$match = esc_html($match);
3802+
$trail = esc_html($trail);
3803+
3804+
print "$lead<span class=\"match\">$match</span>$trail<br />";
37993805
}
38003806
}
38013807
print "</td>\n" .

0 commit comments

Comments
 (0)