Match Bugzilla bug IDs with two regexes instead of one. The first is a pre-filter that allows easy matching of multiple bug IDs on the same line, and the second easily picks out the individual big IDs for hyperlinking in the context of the first regex. For example, it would help in matching these and hyperlinking each ID individually. [#1234, #1235] Resolves-bug: 1234, 1235 bugs 1234, 1235, and 1236 Maybe there's a better naming scheme for the two patterns? Signed-off-by: Marcel M. Cary <marcel@xxxxxxxxxxxxxxxx> --- gitweb/gitweb.perl | 61 ++++++++++++++++++++++---------- t/t9500-gitweb-standalone-no-errors.sh | 18 +++++++++ 2 files changed, 60 insertions(+), 19 deletions(-) diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl index c66fdf3..47c8cd5 100755 --- a/gitweb/gitweb.perl +++ b/gitweb/gitweb.perl @@ -227,14 +227,28 @@ our %committags = ( 'override' => 0, 'sub' => \&hyperlink_committag, }, - # Link mentions of bug IDs to bugzilla + # Link mentions of bugs to bugzilla, allowing for separate outer + # and inner regexes (see unit test for example) 'bugzilla' => { 'options' => { 'pattern' => qr/bug\s+(\d+)/, + 'innerpattern' => undef, 'url' => 'http://bugzilla.kernel.org/show_bug.cgi?id=', }, 'override' => 0, - 'sub' => \&hyperlink_committag, + 'sub' => sub { + my ($opts, @match) = @_; + if (defined($opts->{'innerpattern'})) { + my @list = (); + push_or_append_replacements(\@list, $opts->{innerpattern}, + $match[0], sub { + return hyperlink_committag($opts, @_); + }); + return @list; + } else { + return hyperlink_committag(@_); + } + }, }, # Link URLs 'url' => { @@ -1539,23 +1553,9 @@ COMMITTAG: next PART; } - my $oldpos = 0; - - MATCH: - while ($part =~ m/$pattern/gc) { - my ($prepos, $postpos) = ($-[0], $+[0]); - my $repl = $committag->{'sub'}->($opts, $&, $1); - $repl = "" if (!defined $repl); - - my $pre = substr($part, $oldpos, $prepos - $oldpos); - push_or_append(\@newlist, $pre); - push_or_append(\@newlist, $repl); - - $oldpos = $postpos; - } # end while [regexp matches] - - my $rest = substr($part, $oldpos); - push_or_append(\@newlist, $rest); + push_or_append_replacements(\@newlist, $opts->{'pattern'}, $part, sub { + $committag->{'sub'}->($opts, @_); + }); } # end foreach (@list) @@ -1586,6 +1586,29 @@ sub hyperlink_committag { esc_html($match[0], -nbsp=>1)); } +# Find $pattern in string $part, and push_or_append the parts between +# matches and the result of calling $sub with matched text to $newlist. +sub push_or_append_replacements { + my ($newlist, $pattern, $part, $sub) = @_; + + my $oldpos = 0; + +MATCH: + while ($part =~ m/$pattern/gc) { + my ($prepos, $postpos) = ($-[0], $+[0]); + + my @repl = $sub->($&, $1); + + my $pre = substr($part, $oldpos, $prepos - $oldpos); + push_or_append($newlist, $pre); + push_or_append($newlist, @repl); + + $oldpos = $postpos; + } # end while [regexp matches] + + my $rest = substr($part, $oldpos); + push_or_append($newlist, $rest); +} sub push_or_append (\@@) { my $list = shift; diff --git a/t/t9500-gitweb-standalone-no-errors.sh b/t/t9500-gitweb-standalone-no-errors.sh index 37a127c..573f03c 100755 --- a/t/t9500-gitweb-standalone-no-errors.sh +++ b/t/t9500-gitweb-standalone-no-errors.sh @@ -798,6 +798,24 @@ test_expect_success 'bugzilla: affects log view too' ' test_debug 'cat gitweb.log' test_debug 'grep 1234 resp.http' +echo hello > file.txt +git add file.txt +git commit -q -F - file.txt <<END +[#123,#45] This commit fixes two bugs involving bar and baz. +END +git config gitweb.committag.bugzilla.pattern '^\[#\d+(,( )?#\d+)\]' +git config gitweb.committag.bugzilla.innerpattern '#(\d+)' +git config gitweb.committag.bugzilla.url 'http://bugs/' +test_expect_success 'bugzilla: override everything, use fancier url format' ' + h=$(git rev-parse --verify HEAD) && + gitweb_run "p=.git;a=commit;h=$h" && + grep -F -q \ + "[<a class=\"text\" href=\"http://bugs/123\">#123</a>,<a class=\"text\" href=\"http://bugs/45\">#45</a>]" \ + resp.http +' +test_debug 'cat gitweb.log' +test_debug 'grep 123 resp.http' + # ---------------------------------------------------------------------- # url linking # -- 1.6.2 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html