{"thread":{"id":"15762","subject":"Re: [PATCH] gitweb: Identify all summary metadata table rows","startedAt":"2008-10-02T14:25:05Z","lastAt":"2008-10-03T07:29:45Z","messageCount":6,"participants":["Shawn O. Pearce","Jakub Narebski","Petr Baudis"],"isPatch":true,"patchVersion":1,"patchTotal":null},"messages":[{"id":"299077","messageId":"1222957505-5150-1-git-send-email-pasky@suse.cz","threadId":"15762","inReplyTo":null,"subject":"[PATCH] gitweb: Identify all summary metadata table rows","fromName":"Petr Baudis","fromEmail":"pasky@suse.cz","sentAt":"2008-10-02T14:25:05Z","receivedAt":"2008-10-02T14:25:05Z","isPatch":true,"sender":{"key":"pasky@ucw.cz","avatar":"https://avatars.githubusercontent.com/u/18439?v=4"},"body":"In the metadata table of the summary page, all rows have their\nid (or class in case of URL) set now. This for example lets sites\neasily disable fields they do not want to show in their custom\nstylesheet (e.g. they are overly technical or irrelevant for the site).\n\nMany of my other patches depend on this, so I would appreciate to hear\nas soon as possible if someone has an issue with this patch.\n\nSigned-off-by: Petr Baudis <petr.baudis@novartis.com>\n\n---\n gitweb/gitweb.perl |    8 ++++----\n 1 files changed, 4 insertions(+), 4 deletions(-)\n\ndiff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl\nindex da474d0..bd8124a 100755\n--- a/gitweb/gitweb.perl\n+++ b/gitweb/gitweb.perl\n@@ -4070,10 +4070,10 @@ sub git_summary {\n \n \tprint \"<div class=\\\"title\\\">&nbsp;</div>\\n\";\n \tprint \"<table class=\\\"projects_list\\\">\\n\" .\n-\t      \"<tr><td>description</td><td>\" . esc_html($descr) . \"</td></tr>\\n\" .\n-\t      \"<tr><td>owner</td><td>\" . esc_html($owner) . \"</td></tr>\\n\";\n+\t      \"<tr id=\\\"metadata_desc\\\"><td>description</td><td>\" . esc_html($descr) . \"</td></tr>\\n\" .\n+\t      \"<tr id=\\\"metadata_owner\\\"><td>owner</td><td>\" . esc_html($owner) . \"</td></tr>\\n\";\n \tif (defined $cd{'rfc2822'}) {\n-\t\tprint \"<tr><td>last change</td><td>$cd{'rfc2822'}</td></tr>\\n\";\n+\t\tprint \"<tr id=\\\"metadata_lchange\\\"><td>last change</td><td>$cd{'rfc2822'}</td></tr>\\n\";\n \t}\n \n \t# use per project git URL list in $projectroot/$project/cloneurl\n@@ -4083,7 +4083,7 @@ sub git_summary {\n \t@url_list = map { \"$_/$project\" } @git_base_url_list unless @url_list;\n \tforeach my $git_url (@url_list) {\n \t\tnext unless $git_url;\n-\t\tprint \"<tr><td>$url_tag</td><td>$git_url</td></tr>\\n\";\n+\t\tprint \"<tr class=\\\"metadata_url\\\"><td>$url_tag</td><td>$git_url</td></tr>\\n\";\n \t\t$url_tag = \"\";\n \t}\n \tprint \"</table>\\n\";\n-- \ntg: (c427559..) t/summary/css-metadata (depends on: vanilla/master)\n"},{"id":"299078","messageId":"1222960382-11619-1-git-send-email-pasky@suse.cz","threadId":"15762","inReplyTo":"1222957505-5150-1-git-send-email-pasky@suse.cz","subject":"[PATCH] gitweb: Support for tag clouds","fromName":"Petr Baudis","fromEmail":"pasky@suse.cz","sentAt":"2008-10-02T15:13:02Z","receivedAt":"2008-10-02T15:13:02Z","isPatch":true,"sender":{"key":"pasky@ucw.cz","avatar":"https://avatars.githubusercontent.com/u/18439?v=4"},"body":"The \"Content tags\" (nothing to do with usual Git tags!) are free-form\nstrings that are attached to random projects and displayed in the\nwell-known Web2.0-ish tag cloud above project list.\n\nThe feature will make use of HTML::TagCloud if available, but will\nstill display (less pretty) list of tags in case the module is not\ninstalled.\n\nThe tagging itself is not done by gitweb - user-provided external\nhelper CGI needs to be provided; one example is the tagproj.cgi\nof Girocco. This functionality might get integrated to gitweb\nin the future.\n\nThe tags are stored one-per-file in ctags/ subdirectory. The reason\nthey are not stored in the project config file is that you usually\nwant to give anyone (even CGI scripts) permission to create new tags\nand they are non-essential information, and thus you would make\nthe ctags/ subdirectory world-writable.\n\nSigned-off-by: Petr Baudis <petr.baudis@novartis.com>\n\n---\n gitweb/gitweb.perl |  109 ++++++++++++++++++++++++++++++++++++++++++++++++++++\n 1 files changed, 109 insertions(+), 0 deletions(-)\n\ndiff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl\nindex bd8124a..5ba094e 100755\n--- a/gitweb/gitweb.perl\n+++ b/gitweb/gitweb.perl\n@@ -275,6 +275,24 @@ our %feature = (\n \t'forks' => {\n \t\t'override' => 0,\n \t\t'default' => [0]},\n+\n+\t# Allow gitweb scan project content tags described in ctags/\n+\t# of project repository, and display the popular Web 2.0-ish\n+\t# \"tag cloud\" near the project list. Note that this is something\n+\t# COMPLETELY different from the normal Git tags.\n+\n+\t# gitweb by itself can show existing tags, but it does not handle\n+\t# tagging itself; you need an external application for that.\n+\t# For an example script, check Girocco's cgi/tagproj.cgi.\n+\t# You may want to install the HTML::TagCloud Perl module to get\n+\t# a pretty tag cloud instead of just a list of tags.\n+\n+\t# To enable system wide have in $GITWEB_CONFIG\n+\t# $feature{'ctags'}{'default'} = ['path_to_tag_script'];\n+\t# Project specific override is not supported.\n+\t'ctags' => {\n+\t\t'override' => 0,\n+\t\t'default' => [0]},\n );\n \n sub gitweb_check_feature {\n@@ -1755,6 +1773,67 @@ sub git_get_project_description {\n \treturn $descr;\n }\n \n+sub git_get_project_ctags {\n+\tmy $path = shift;\n+\tmy $ctags = {};\n+\n+\t$git_dir = \"$projectroot/$path\";\n+\tforeach (<$git_dir/ctags/*>) {\n+\t\topen CT, $_ or next;\n+\t\tmy $val = <CT>;\n+\t\tchomp $val;\n+\t\tclose CT;\n+\t\tmy $ctag = $_; $ctag =~ s#.*/##;\n+\t\t$ctags->{$ctag} = $val;\n+\t}\n+\t$ctags;\n+}\n+\n+sub git_populate_project_tagcloud {\n+\tmy $ctags = shift;\n+\n+\t# First, merge different-cased tags; tags vote on casing\n+\tmy %ctags_lc;\n+\tforeach (keys %$ctags) {\n+\t\t$ctags_lc{lc $_}->{count} += $ctags->{$_};\n+\t\tif (not $ctags_lc{lc $_}->{topcount}\n+\t\t    or $ctags_lc{lc $_}->{topcount} < $ctags->{$_}) {\n+\t\t\t$ctags_lc{lc $_}->{topcount} = $ctags->{$_};\n+\t\t\t$ctags_lc{lc $_}->{topname} = $_;\n+\t\t}\n+\t}\n+\n+\tmy $cloud;\n+\tif (eval { require HTML::TagCloud; 1; }) {\n+\t\t$cloud = HTML::TagCloud->new;\n+\t\tforeach (sort keys %ctags_lc) {\n+\t\t\t# Pad the title with spaces so that the cloud looks\n+\t\t\t# less crammed.\n+\t\t\tmy $title = $ctags_lc{$_}->{topname};\n+\t\t\t$title =~ s/ /&nbsp;/g;\n+\t\t\t$title =~ s/^/&nbsp;/g;\n+\t\t\t$title =~ s/$/&nbsp;/g;\n+\t\t\t$cloud->add($title, $home_link.\"?by_tag=\".$_, $ctags_lc{$_}->{count});\n+\t\t}\n+\t} else {\n+\t\t$cloud = \\%ctags_lc;\n+\t}\n+\t$cloud;\n+}\n+\n+sub git_show_project_tagcloud {\n+\tmy ($cloud, $count) = @_;\n+\tprint STDERR ref($cloud).\"..\\n\";\n+\tif (ref $cloud eq 'HTML::TagCloud') {\n+\t\treturn $cloud->html_and_css($count);\n+\t} else {\n+\t\tmy @tags = sort { $cloud->{$a}->{count} <=> $cloud->{$b}->{count} } keys %$cloud;\n+\t\treturn '<p align=\"center\">' . join (', ', map {\n+\t\t\t\"<a href=\\\"$home_link?by_tag=$_\\\">$cloud->{$_}->{topname}</a>\"\n+\t\t} splice(@tags, 0, $count)) . '</p>';\n+\t}\n+}\n+\n sub git_get_project_url_list {\n \tmy $path = shift;\n \n@@ -3573,6 +3652,7 @@ sub fill_project_list_info {\n \tmy ($projlist, $check_forks) = @_;\n \tmy @projects;\n \n+\tmy $show_ctags = gitweb_check_feature('ctags');\n  PROJECT:\n \tforeach my $pr (@$projlist) {\n \t\tmy (@activity) = git_get_last_activity($pr->{'path'});\n@@ -3599,6 +3679,7 @@ sub fill_project_list_info {\n \t\t\t\t$pr->{'forks'} = 0;\n \t\t\t}\n \t\t}\n+\t\t$show_ctags and $pr->{'ctags'} = git_get_project_ctags($pr->{'path'});\n \t\tpush @projects, $pr;\n \t}\n \n@@ -3645,6 +3726,18 @@ sub git_project_list_body {\n \t$from = 0 unless defined $from;\n \t$to = $#projects if (!defined $to || $#projects < $to);\n \n+\tmy $show_ctags = gitweb_check_feature('ctags');\n+\tif ($show_ctags) {\n+\t\tmy %ctags;\n+\t\tforeach my $p (@projects) {\n+\t\t\tforeach my $ct (keys %{$p->{'ctags'}}) {\n+\t\t\t\t$ctags{$ct} += $p->{'ctags'}->{$ct};\n+\t\t\t}\n+\t\t}\n+\t\tmy $cloud = git_populate_project_tagcloud(\\%ctags);\n+\t\tprint git_show_project_tagcloud($cloud, 64);\n+\t}\n+\n \tprint \"<table class=\\\"project_list\\\">\\n\";\n \tunless ($no_header) {\n \t\tprint \"<tr>\\n\";\n@@ -3663,8 +3756,10 @@ sub git_project_list_body {\n \t\t      \"</tr>\\n\";\n \t}\n \tmy $alternate = 1;\n+\tmy $tagfilter = $cgi->param('by_tag');\n \tfor (my $i = $from; $i <= $to; $i++) {\n \t\tmy $pr = $projects[$i];\n+\t\tnext if $tagfilter and $show_ctags and not grep { lc $_ eq lc $tagfilter } keys %{$pr->{'ctags'}};\n \t\tif ($alternate) {\n \t\t\tprint \"<tr class=\\\"dark\\\">\\n\";\n \t\t} else {\n@@ -4086,6 +4181,20 @@ sub git_summary {\n \t\tprint \"<tr class=\\\"metadata_url\\\"><td>$url_tag</td><td>$git_url</td></tr>\\n\";\n \t\t$url_tag = \"\";\n \t}\n+\n+\t# Tag cloud\n+\tmy $show_ctags = (gitweb_check_feature('ctags'))[0];\n+\tif ($show_ctags) {\n+\t\tmy $ctags = git_get_project_ctags($project);\n+\t\tmy $cloud = git_populate_project_tagcloud($ctags);\n+\t\tprint \"<tr id=\\\"metadata_ctags\\\"><td>Content tags:<br />\";\n+\t\tprint \"</td>\\n<td>\" unless %$ctags;\n+\t\tprint \"<form action=\\\"$show_ctags\\\" method=\\\"post\\\"><input type=\\\"hidden\\\" name=\\\"p\\\" value=\\\"$project\\\" />Add: <input type=\\\"text\\\" name=\\\"t\\\" size=\\\"8\\\" /></form>\";\n+\t\tprint \"</td>\\n<td>\" if %$ctags;\n+\t\tprint git_show_project_tagcloud($cloud, 48);\n+\t\tprint \"</td></tr>\";\n+\t}\n+\n \tprint \"</table>\\n\";\n \n \tif (-s \"$projectroot/$project/README.html\") {\n-- \ntg: (c5a1246..) t/tagcloud/tagcloud (depends on: vanilla/master t/summary/css-metadata)\n"},{"id":"299079","messageId":"1222960621-12044-1-git-send-email-pasky@suse.cz","threadId":"15762","inReplyTo":"1222960382-11619-1-git-send-email-pasky@suse.cz","subject":"[PATCH] gitweb: Make the by_tag filter delve in forks as well","fromName":"Petr Baudis","fromEmail":"pasky@suse.cz","sentAt":"2008-10-02T15:17:01Z","receivedAt":"2008-10-02T15:17:01Z","isPatch":true,"sender":{"key":"pasky@ucw.cz","avatar":"https://avatars.githubusercontent.com/u/18439?v=4"},"body":"This requires us to build a full index including forks and then weed\nthem out only when printing.\n\nSigned-off-by: Petr Baudis <petr.baudis@novartis.com>\n\n---\n gitweb/gitweb.perl |   13 ++++++++++---\n 1 files changed, 10 insertions(+), 3 deletions(-)\n\ndiff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl\nindex 02083d5..07fa1e6 100755\n--- a/gitweb/gitweb.perl\n+++ b/gitweb/gitweb.perl\n@@ -1880,9 +1880,7 @@ sub git_get_projects_list {\n \n \t\t\t\tmy $subdir = substr($File::Find::name, $pfxlen + 1);\n \t\t\t\t# we check related file in $projectroot\n-\t\t\t\tif ($check_forks and $subdir =~ m#/.#) {\n-\t\t\t\t\t$File::Find::prune = 1;\n-\t\t\t\t} elsif (check_export_ok(\"$projectroot/$filter/$subdir\")) {\n+\t\t\t\tif (check_export_ok(\"$projectroot/$filter/$subdir\")) {\n \t\t\t\t\tpush @list, { path => ($filter ? \"$filter/\" : '') . $subdir };\n \t\t\t\t\t$File::Find::prune = 1;\n \t\t\t\t}\n@@ -3715,6 +3713,7 @@ sub print_sort_th_num {\n }\n \n sub git_project_list_body {\n+\t# actually uses global variable $project\n \tmy ($projlist, $order, $from, $to, $extra, $no_header) = @_;\n \n \tmy ($check_forks) = gitweb_check_feature('forks');\n@@ -3757,7 +3756,15 @@ sub git_project_list_body {\n \tmy $tagfilter = $cgi->param('by_tag');\n \tfor (my $i = $from; $i <= $to; $i++) {\n \t\tmy $pr = $projects[$i];\n+\n \t\tnext if $tagfilter and $show_ctags and not grep { lc $_ eq lc $tagfilter } keys %{$pr->{'ctags'}};\n+\t\t# Weed out forks\n+\t\tif ($check_forks) {\n+\t\t\tmy $forkbase = $project; $forkbase ||= ''; $forkbase =~ s#\\.git$#/#;\n+\t\t\t$forkbase=\"^$forkbase\" if $forkbase;\n+\t\t\tnext if not $tagfilter and $pr->{'path'} =~ m#$forkbase.*/.*#; # regexp-safe\n+\t\t}\n+\n \t\tif ($alternate) {\n \t\t\tprint \"<tr class=\\\"dark\\\">\\n\";\n \t\t} else {\n-- \ntg: (f429121..) t/tagcloud/forks (depends on: t/tagcloud/tagcloud)\n"},{"id":"92209","messageId":"20081003003053.GT21310@spearce.org","threadId":"15762","inReplyTo":"1222957505-5150-1-git-send-email-pasky@suse.cz","subject":"Re: [PATCH] gitweb: Identify all summary metadata table rows","fromName":"Shawn O. Pearce","fromEmail":"spearce@spearce.org","sentAt":"2008-10-03T00:30:53Z","receivedAt":"2008-10-03T00:30:53Z","isPatch":true,"sender":{"key":"spearce@spearce.org","avatar":"https://avatars.githubusercontent.com/u/34844?v=4"},"body":"Petr Baudis <pasky@suse.cz> wrote:\n> In the metadata table of the summary page, all rows have their\n> id (or class in case of URL) set now. This for example lets sites\n> easily disable fields they do not want to show in their custom\n> stylesheet (e.g. they are overly technical or irrelevant for the site).\n> \n> Many of my other patches depend on this, so I would appreciate to hear\n> as soon as possible if someone has an issue with this patch.\n\nIts pretty trivial and painless.  So its applied.  Marking up unique\nelements so you can control them via CSS isn't rocket science.  ;-)\n \n\n> diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl\n> index da474d0..bd8124a 100755\n> --- a/gitweb/gitweb.perl\n> +++ b/gitweb/gitweb.perl\n> @@ -4070,10 +4070,10 @@ sub git_summary {\n>  \n>  \tprint \"<div class=\\\"title\\\">&nbsp;</div>\\n\";\n>  \tprint \"<table class=\\\"projects_list\\\">\\n\" .\n> -\t      \"<tr><td>description</td><td>\" . esc_html($descr) . \"</td></tr>\\n\" .\n> -\t      \"<tr><td>owner</td><td>\" . esc_html($owner) . \"</td></tr>\\n\";\n> +\t      \"<tr id=\\\"metadata_desc\\\"><td>description</td><td>\" . esc_html($descr) . \"</td></tr>\\n\" .\n> +\t      \"<tr id=\\\"metadata_owner\\\"><td>owner</td><td>\" . esc_html($owner) . \"</td></tr>\\n\";\n>  \tif (defined $cd{'rfc2822'}) {\n> -\t\tprint \"<tr><td>last change</td><td>$cd{'rfc2822'}</td></tr>\\n\";\n> +\t\tprint \"<tr id=\\\"metadata_lchange\\\"><td>last change</td><td>$cd{'rfc2822'}</td></tr>\\n\";\n>  \t}\n>  \n>  \t# use per project git URL list in $projectroot/$project/cloneurl\n> @@ -4083,7 +4083,7 @@ sub git_summary {\n>  \t@url_list = map { \"$_/$project\" } @git_base_url_list unless @url_list;\n>  \tforeach my $git_url (@url_list) {\n>  \t\tnext unless $git_url;\n> -\t\tprint \"<tr><td>$url_tag</td><td>$git_url</td></tr>\\n\";\n> +\t\tprint \"<tr class=\\\"metadata_url\\\"><td>$url_tag</td><td>$git_url</td></tr>\\n\";\n>  \t\t$url_tag = \"\";\n>  \t}\n>  \tprint \"</table>\\n\";\n\n-- \nShawn.\n"},{"id":"92210","messageId":"m3hc7uqyix.fsf@localhost.localdomain","threadId":"15762","inReplyTo":"20081003003053.GT21310@spearce.org","subject":"Re: [PATCH] gitweb: Identify all summary metadata table rows","fromName":"Jakub Narebski","fromEmail":"jnareb@gmail.com","sentAt":"2008-10-03T01:04:56Z","receivedAt":"2008-10-03T01:04:56Z","isPatch":true,"sender":{"key":"jnareb@gmail.com","avatar":"https://avatars.githubusercontent.com/u/2706?v=4"},"body":"\"Shawn O. Pearce\" <spearce@spearce.org> writes:\n> Petr Baudis <pasky@suse.cz> wrote:\n\n> > In the metadata table of the summary page, all rows have their\n> > id (or class in case of URL) set now. This for example lets sites\n> > easily disable fields they do not want to show in their custom\n> > stylesheet (e.g. they are overly technical or irrelevant for the site).\n> > \n> > Many of my other patches depend on this, so I would appreciate to hear\n> > as soon as possible if someone has an issue with this patch.\n> \n> Its pretty trivial and painless.  So its applied.  Marking up unique\n> elements so you can control them via CSS isn't rocket science.  ;-)\n\nSomehow original patch didn't appear (yet) on git mailing list;\nperhaps it ran afoul vger anti-SPAM filter...\n \n> > +\t      \"<tr id=\\\"metadata_desc\\\"><td>description</td><td>\" . esc_html($descr) . \"</td></tr>\\n\" .\n> > +\t      \"<tr id=\\\"metadata_owner\\\"><td>owner</td><td>\" . esc_html($owner) . \"</td></tr>\\n\";\n> > +\t\tprint \"<tr id=\\\"metadata_lchange\\\"><td>last change</td><td>$cd{'rfc2822'}</td></tr>\\n\";\n> > +\t\tprint \"<tr class=\\\"metadata_url\\\"><td>$url_tag</td><td>$git_url</td></tr>\\n\";\n\nI like the idea, and I think this can be seen as beginning to use\neither microformats, or RDFa.  You have marked those fragments for CSS\nto show or hide; microformats are about marking those fragments for\nmachine to parse.  Although microformats usually use 'class' (or 'rel'\nfor links), not 'id' attribute for classifying data...\n\n-- \nJakub Narebski\nPoland\nShadeHawk on #git\n"},{"id":"299080","messageId":"1223018985-19169-1-git-send-email-pasky@suse.cz","threadId":"15762","inReplyTo":"1222960621-12044-1-git-send-email-pasky@suse.cz","subject":"[PATCH] gitweb: Support for simple project search form","fromName":"Petr Baudis","fromEmail":"pasky@suse.cz","sentAt":"2008-10-03T07:29:45Z","receivedAt":"2008-10-03T07:29:45Z","isPatch":true,"sender":{"key":"pasky@ucw.cz","avatar":"https://avatars.githubusercontent.com/u/18439?v=4"},"body":"This is a trivial patch adding support for searching projects by name\nand description, making use of the \"infrastructure\" provided by the\ntag cloud generation.\n\nSigned-off-by: Petr Baudis <petr.baudis@novartis.com>\n\n---\n gitweb/gitweb.css  |    4 ++++\n gitweb/gitweb.perl |   12 ++++++++++--\n 2 files changed, 14 insertions(+), 2 deletions(-)\n\ndiff --git a/gitweb/gitweb.css b/gitweb/gitweb.css\nindex 07f5b53..a01eac8 100644\n--- a/gitweb/gitweb.css\n+++ b/gitweb/gitweb.css\n@@ -435,6 +435,10 @@ div.search {\n \tright: 12px\n }\n \n+p.projsearch {\n+\ttext-align: center;\n+}\n+\n td.linenr {\n \ttext-align: right;\n }\ndiff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl\nindex 07fa1e6..4bc8a12 100755\n--- a/gitweb/gitweb.perl\n+++ b/gitweb/gitweb.perl\n@@ -3758,11 +3758,14 @@ sub git_project_list_body {\n \t\tmy $pr = $projects[$i];\n \n \t\tnext if $tagfilter and $show_ctags and not grep { lc $_ eq lc $tagfilter } keys %{$pr->{'ctags'}};\n-\t\t# Weed out forks\n+\t\tnext if $searchtext and not $pr->{'path'} =~ /$searchtext/\n+\t\t\tand not $pr->{'descr_long'} =~ /$searchtext/;\n+\t\t# Weed out forks or non-matching entries of search\n \t\tif ($check_forks) {\n \t\t\tmy $forkbase = $project; $forkbase ||= ''; $forkbase =~ s#\\.git$#/#;\n \t\t\t$forkbase=\"^$forkbase\" if $forkbase;\n-\t\t\tnext if not $tagfilter and $pr->{'path'} =~ m#$forkbase.*/.*#; # regexp-safe\n+\t\t\tnext if not $searchtext and not $tagfilter and $show_ctags\n+\t\t\t\tand $pr->{'path'} =~ m#$forkbase.*/.*#; # regexp-safe\n \t\t}\n \n \t\tif ($alternate) {\n@@ -4099,6 +4102,11 @@ sub git_project_list {\n \t\tclose $fd;\n \t\tprint \"</div>\\n\";\n \t}\n+\tprint $cgi->startform(-method => \"get\") .\n+\t      \"<p class=\\\"projsearch\\\">Search:\\n\" .\n+\t      $cgi->textfield(-name => \"s\", -value => $searchtext) . \"\\n\" .\n+\t      \"</p>\" .\n+\t      $cgi->end_form() . \"\\n\";\n \tgit_project_list_body(\\@list, $order);\n \tgit_footer_html();\n }\n-- \ntg: (0d352a0..) t/misc/projsearch (depends on: t/tagcloud/forks)\n"}]}