This patch integrates the tag filtering CGI parameter into the framework for parameter passing, dropping 'by_tag' and instead using query name 't' and symbolic name 'ctag_filter'. Compatibility support for 'by_tag' query name is retained. This means that content tag links are now created using $cgi->a() and the href() method, and that they now point to the proper action; project_list in case of global content tags, forks in case of per-fork content tags. Also any other arguments like sorting order of projects are replayed within the links. Signed-off-by: Petr Baudis <pasky@xxxxxxx> --- gitweb/gitweb.perl | 37 +++++++++++++++++++++++-------------- 1 files changed, 23 insertions(+), 14 deletions(-) diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl index e82ca45..97e88b4 100755 --- a/gitweb/gitweb.perl +++ b/gitweb/gitweb.perl @@ -566,6 +566,7 @@ our @cgi_param_mapping = ( searchtext => "s", searchtype => "st", snapshot_format => "sf", + ctag_filter => 't', extra_options => "opt", search_use_regexp => "sr", ); @@ -622,6 +623,11 @@ while (my ($name, $symbol) = each %cgi_param_mapping) { } } +# Backwards compatibility - by_tag= <=> t= +if ($cgi->param('by_tag')) { + $input_params{'ctag_filter'} = $cgi->param('by_tag'); +} + # now read PATH_INFO and update the parameter list for missing parameters sub evaluate_path_info { return if defined $input_params{'project'}; @@ -2257,7 +2263,7 @@ sub git_get_project_ctags { } sub git_populate_project_tagcloud { - my $ctags = shift; + my ($ctags, $action) = @_; # First, merge different-cased tags; tags vote on casing my %ctags_lc; @@ -2280,7 +2286,8 @@ sub git_populate_project_tagcloud { $title =~ s/ / /g; $title =~ s/^/ /g; $title =~ s/$/ /g; - $cloud->add($title, $home_link."?by_tag=".$_, $ctags_lc{$_}->{count}); + $cloud->add($title, href(-replay=>1, action=>$action, ctag_filter=>$_), + $ctags_lc{$_}->{count}); } } else { $cloud = \%ctags_lc; @@ -2289,14 +2296,15 @@ sub git_populate_project_tagcloud { } sub git_show_project_tagcloud { - my ($cloud, $count) = @_; + my ($cloud, $count, $action) = @_; print STDERR ref($cloud)."..\n"; if (ref $cloud eq 'HTML::TagCloud') { return $cloud->html_and_css($count); } else { my @tags = sort { $cloud->{$a}->{count} <=> $cloud->{$b}->{count} } keys %$cloud; return '<p align="center">' . join (', ', map { - "<a href=\"$home_link?by_tag=$_\">$cloud->{$_}->{topname}</a>" + $cgi->a({-href => href(-replay=>1, action=>$action, ctag_filter=>$_)}, + $cloud->{$_}->{topname}); } splice(@tags, 0, $count)) . '</p>'; } } @@ -4254,7 +4262,8 @@ sub print_sort_th { } sub git_project_list_ctags { - my ($projects) = @_; + my ($projects, $action) = @_; + $action ||= 'project_list'; my %ctags; foreach my $p (@$projects) { @@ -4262,13 +4271,13 @@ sub git_project_list_ctags { $ctags{$ct} += $p->{'ctags'}->{$ct}; } } - my $cloud = git_populate_project_tagcloud(\%ctags); - print git_show_project_tagcloud($cloud, 64); + my $cloud = git_populate_project_tagcloud(\%ctags, $action); + print git_show_project_tagcloud($cloud, 64, $action); } sub git_project_list_body { # actually uses global variable $project - my ($projlist, $order, $from, $to, $extra, $no_header) = @_; + my ($projlist, $order, $from, $to, $extra, $no_header, $ctags_action) = @_; my $check_forks = gitweb_check_feature('forks'); my $show_ctags = gitweb_check_feature('ctags'); @@ -4292,7 +4301,7 @@ sub git_project_list_body { } if ($show_ctags) { - git_project_list_ctags(\@projects); + git_project_list_ctags(\@projects, $ctags_action); } print "<table class=\"project_list\">\n"; @@ -4309,7 +4318,7 @@ sub git_project_list_body { "</tr>\n"; } my $alternate = 1; - my $tagfilter = $cgi->param('by_tag'); + my $tagfilter = $input_params{'ctag_filter'}; for (my $i = $from; $i <= $to; $i++) { my $pr = $projects[$i]; @@ -4682,7 +4691,7 @@ sub git_forks { git_header_html(); git_print_page_nav('',''); git_print_header_div('summary', "$project forks"); - git_project_list_body(\@list, $order); + git_project_list_body(\@list, $order, undef, undef, undef, undef, 'forks'); git_footer_html(); } @@ -4756,12 +4765,12 @@ sub git_summary { my $show_ctags = gitweb_check_feature('ctags'); if ($show_ctags) { my $ctags = git_get_project_ctags($project); - my $cloud = git_populate_project_tagcloud($ctags); + my $cloud = git_populate_project_tagcloud($ctags, 'project_list'); print "<tr id=\"metadata_ctags\"><td>Content tags:<br />"; print "</td>\n<td>" unless %$ctags; print "<form action=\"$show_ctags\" method=\"post\"><input type=\"hidden\" name=\"p\" value=\"$project\" />Add: <input type=\"text\" name=\"t\" size=\"8\" /></form>"; print "</td>\n<td>" if %$ctags; - print git_show_project_tagcloud($cloud, 48); + print git_show_project_tagcloud($cloud, 48, 'project_list'); print "</td></tr>"; } @@ -4805,7 +4814,7 @@ sub git_summary { git_project_list_body(\@forklist, 'age', 0, 15, $#forklist <= 15 ? undef : $cgi->a({-href => href(action=>"forks")}, "..."), - 'no_header'); + 'no_header', 'forks'); } git_footer_html(); -- tg: (73bafe5..) t/frontpage/ctags (depends on: t/frontpage/refactor) -- 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