{"thread":{"id":"5566","subject":"[PATCH 1/3] gitweb: Add git_project_index for generating index.aux","startedAt":"2006-09-15T02:53:41Z","lastAt":"2006-09-15T17:30:34Z","messageCount":8,"participants":["Jakub Narebski","Junio C Hamano"],"isPatch":true,"patchVersion":1,"patchTotal":3},"messages":[{"id":"26942","messageId":"200609150453.42231.jnareb@gmail.com","threadId":"5566","inReplyTo":null,"subject":"[PATCH 0/3] Add git_project_index, improve href()","fromName":"Jakub Narebski","fromEmail":"jnareb@gmail.com","sentAt":"2006-09-15T02:53:41Z","receivedAt":"2006-09-15T02:53:41Z","isPatch":true,"sender":{"key":"jnareb@gmail.com","avatar":"https://avatars.githubusercontent.com/u/2706?v=4"},"body":"This series of patches introduces \"project_index\" view, which is text/plain\nequivalent of projects list view, again. This time it is accompanied by\nthe patch which adds links to this view.\n\n\"project_index\" view has at least two uses: first, to automatically generate\ngitweb project index file (which we then edit, e.g. removing some projects\nfrom being visible from gitweb and correcting ownership information).\nSecond, to get list of projects for scripts, in very easily parseable form.\n\nEven if patches 1 and 3 got discarded, patch 2 is I think worth applying.\nIt finishes consolidation of URL generation.\n\nShortlog:\n [PATCH 1/3] gitweb: Add git_project_index for generating index.aux\n [PATCH 2/3] gitweb: Allow for href() to be used for projectless links\n [PATCH 3/3] gitweb: Add link to \"project_index\" view to \"project_list\" page\n\nDiffstat:\n gitweb/gitweb.perl |   51 ++++++++++++++++++++++++++++++++++++++++++++-------\n 1 files changed, 44 insertions(+), 7 deletions(-)\n\nP.S. Should shortlog be before, or after diffstat (if it matters)?\n-- \nJakub Narebski\nShadeHawk on #git\nPoland\n"},{"id":"26940","messageId":"200609150456.03972.jnareb@gmail.com","threadId":"5566","inReplyTo":"200609150453.42231.jnareb@gmail.com","subject":"[PATCH 1/3] gitweb: Add git_project_index for generating index.aux","fromName":"Jakub Narebski","fromEmail":"jnareb@gmail.com","sentAt":"2006-09-15T02:56:03Z","receivedAt":"2006-09-15T02:56:03Z","isPatch":true,"sender":{"key":"jnareb@gmail.com","avatar":"https://avatars.githubusercontent.com/u/2706?v=4"},"body":"Add git_project_index, which generates index.aux file that can be used\nas a source of projects list, instead of generating projects list from\na directory.  Using file as a source of projects list allows for some\nprojects to be not present in gitweb main (project_list) page, and/or\ncorrect project owner info. And is probably faster.\n\nAdditionally it can be used to get the list of all available repositories\nfor scripts (in easily parseable form).\n\nSigned-off-by: Jakub Narebski <jnareb@gmail.com>\n---\n gitweb/gitweb.perl |   25 +++++++++++++++++++++++++\n 1 files changed, 25 insertions(+), 0 deletions(-)\n\ndiff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl\nindex b4a890b..7dbcb88 100755\n--- a/gitweb/gitweb.perl\n+++ b/gitweb/gitweb.perl\n@@ -296,6 +296,7 @@ my %actions = (\n \t# those below don't need $project\n \t\"opml\" => \\&git_opml,\n \t\"project_list\" => \\&git_project_list,\n+\t\"project_index\" => \\&git_project_index,\n );\n \n if (defined $project) {\n@@ -2210,6 +2211,30 @@ sub git_project_list {\n \tgit_footer_html();\n }\n \n+sub git_project_index {\n+\tmy @projects = git_get_projects_list();\n+\n+\tprint $cgi->header(\n+\t\t-type => 'text/plain',\n+\t\t-charset => 'utf-8',\n+\t\t-content_disposition => qq(inline; filename=\"index.aux\"));\n+\n+\tforeach my $pr (@projects) {\n+\t\tif (!exists $pr->{'owner'}) {\n+\t\t\t$pr->{'owner'} = get_file_owner(\"$projectroot/$project\");\n+\t\t}\n+\n+\t\tmy ($path, $owner) = ($pr->{'path'}, $pr->{'owner'});\n+\t\t# quote as in CGI::Util::encode, but keep the slash, and use '+' for ' '\n+\t\t$path  =~ s/([^a-zA-Z0-9_.\\-\\/ ])/sprintf(\"%%%02X\", ord($1))/eg;\n+\t\t$owner =~ s/([^a-zA-Z0-9_.\\-\\/ ])/sprintf(\"%%%02X\", ord($1))/eg;\n+\t\t$path  =~ s/ /\\+/g;\n+\t\t$owner =~ s/ /\\+/g;\n+\n+\t\tprint \"$path $owner\\n\";\n+\t}\n+}\n+\n sub git_summary {\n \tmy $descr = git_get_project_description($project) || \"none\";\n \tmy $head = git_get_head_hash($project);\n-- \n1.4.2\n"},{"id":"26943","messageId":"200609150457.16924.jnareb@gmail.com","threadId":"5566","inReplyTo":"200609150453.42231.jnareb@gmail.com","subject":"[PATCH 2/3] gitweb: Allow for href() to be used for projectless links","fromName":"Jakub Narebski","fromEmail":"jnareb@gmail.com","sentAt":"2006-09-15T02:57:16Z","receivedAt":"2006-09-15T02:57:16Z","isPatch":true,"sender":{"key":"jnareb@gmail.com","avatar":"https://avatars.githubusercontent.com/u/2706?v=4"},"body":"Change adding project to params if $params{\"project\"} is false\nto adding project to params if it not exist. It allows for href()\nto be used for projectless links by using \"project=>undef\" as\nargument, while still adding project to params by default\nin the most common case.\n\nConvert remaining links (except $home_link and anchor links)\nto use href(); this required adding 'order => \"o\"' to @mapping\nin href(). This finishes consolidation of URL generation.\n\nSigned-off-by: Jakub Narebski <jnareb@gmail.com>\n---\n gitweb/gitweb.perl |   17 ++++++++++-------\n 1 files changed, 10 insertions(+), 7 deletions(-)\n\ndiff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl\nindex 7dbcb88..e900713 100755\n--- a/gitweb/gitweb.perl\n+++ b/gitweb/gitweb.perl\n@@ -326,11 +326,12 @@ sub href(%) {\n \t\thash_base => \"hb\",\n \t\thash_parent_base => \"hpb\",\n \t\tpage => \"pg\",\n+\t\torder => \"o\",\n \t\tsearchtext => \"s\",\n \t);\n \tmy %mapping = @mapping;\n \n-\t$params{\"project\"} ||= $project;\n+\t$params{'project'} = $project unless exists $params{'project'};\n \n \tmy @result = ();\n \tfor (my $i = 0; $i < @mapping; $i += 2) {\n@@ -1304,9 +1305,11 @@ sub git_footer_html {\n \t\tif (defined $descr) {\n \t\t\tprint \"<div class=\\\"page_footer_text\\\">\" . esc_html($descr) . \"</div>\\n\";\n \t\t}\n-\t\tprint $cgi->a({-href => href(action=>\"rss\"), -class => \"rss_logo\"}, \"RSS\") . \"\\n\";\n+\t\tprint $cgi->a({-href => href(action=>\"rss\"),\n+\t\t              -class => \"rss_logo\"}, \"RSS\") . \"\\n\";\n \t} else {\n-\t\tprint $cgi->a({-href => href(action=>\"opml\"), -class => \"rss_logo\"}, \"OPML\") . \"\\n\";\n+\t\tprint $cgi->a({-href => href(project=>undef, action=>\"opml\"),\n+\t\t              -class => \"rss_logo\"}, \"OPML\") . \"\\n\";\n \t}\n \tprint \"</div>\\n\" .\n \t      \"</body>\\n\" .\n@@ -2153,7 +2156,7 @@ sub git_project_list {\n \t\tprint \"<th>Project</th>\\n\";\n \t} else {\n \t\tprint \"<th>\" .\n-\t\t      $cgi->a({-href => \"$my_uri?\" . esc_param(\"o=project\"),\n+\t\t      $cgi->a({-href => href(project=>undef, order=>'project'),\n \t\t               -class => \"header\"}, \"Project\") .\n \t\t      \"</th>\\n\";\n \t}\n@@ -2162,7 +2165,7 @@ sub git_project_list {\n \t\tprint \"<th>Description</th>\\n\";\n \t} else {\n \t\tprint \"<th>\" .\n-\t\t      $cgi->a({-href => \"$my_uri?\" . esc_param(\"o=descr\"),\n+\t\t      $cgi->a({-href => href(project=>undef, order=>'descr'),\n \t\t               -class => \"header\"}, \"Description\") .\n \t\t      \"</th>\\n\";\n \t}\n@@ -2171,7 +2174,7 @@ sub git_project_list {\n \t\tprint \"<th>Owner</th>\\n\";\n \t} else {\n \t\tprint \"<th>\" .\n-\t\t      $cgi->a({-href => \"$my_uri?\" . esc_param(\"o=owner\"),\n+\t\t      $cgi->a({-href => href(project=>undef, order=>'owner'),\n \t\t               -class => \"header\"}, \"Owner\") .\n \t\t      \"</th>\\n\";\n \t}\n@@ -2180,7 +2183,7 @@ sub git_project_list {\n \t\tprint \"<th>Last Change</th>\\n\";\n \t} else {\n \t\tprint \"<th>\" .\n-\t\t      $cgi->a({-href => \"$my_uri?\" . esc_param(\"o=age\"),\n+\t\t      $cgi->a({-href => href(project=>undef, order=>'age'),\n \t\t               -class => \"header\"}, \"Last Change\") .\n \t\t      \"</th>\\n\";\n \t}\n-- \n1.4.2\n"},{"id":"26941","messageId":"200609150459.27708.jnareb@gmail.com","threadId":"5566","inReplyTo":"200609150453.42231.jnareb@gmail.com","subject":"[PATCH 3/3] gitweb: Add link to \"project_index\" view to \"project_list\" page","fromName":"Jakub Narebski","fromEmail":"jnareb@gmail.com","sentAt":"2006-09-15T02:59:27Z","receivedAt":"2006-09-15T02:59:27Z","isPatch":true,"sender":{"key":"jnareb@gmail.com","avatar":"https://avatars.githubusercontent.com/u/2706?v=4"},"body":"Add link to \"project_index\" view as [TXT] beside link to \"opml\" view,\n(which is marked by [OPML]) to \"project_list\" page.\n\nWhile at it add alternate links for \"opml\" and \"project_list\" to HTML\nheader for \"project_list\" view.\n\nSigned-off-by: Jakub Narebski <jnareb@gmail.com>\n---\nIn the future we might want to change appereance of [TXT] link\nto \"project_index\" view (e.g. green background instead of orange,\nsmaller width).\n\n gitweb/gitweb.perl |   11 ++++++++++-\n 1 files changed, 10 insertions(+), 1 deletions(-)\n\ndiff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl\nindex e900713..1f26365 100755\n--- a/gitweb/gitweb.perl\n+++ b/gitweb/gitweb.perl\n@@ -1255,6 +1255,13 @@ EOF\n \t\tprintf('<link rel=\"alternate\" title=\"%s log\" '.\n \t\t       'href=\"%s\" type=\"application/rss+xml\"/>'.\"\\n\",\n \t\t       esc_param($project), href(action=>\"rss\"));\n+\t} else {\n+\t\tprintf('<link rel=\"alternate\" title=\"%s\" '.\n+\t\t       'href=\"%s\" type=\"text/plain; charset=utf-8\"/>'.\"\\n\",\n+\t\t       esc_param($project), href(project=>undef, action=>\"project_index\"));\n+\t\tprintf('<link rel=\"alternate\" title=\"%s\" '.\n+\t\t       'href=\"%s\" type=\"text/x-opml\"/>'.\"\\n\",\n+\t\t       esc_param($project), href(project=>undef, action=>\"opml\"));\n \t}\n \tif (defined $favicon) {\n \t\tprint qq(<link rel=\"shortcut icon\" href=\"$favicon\" type=\"image/png\"/>\\n);\n@@ -1309,7 +1316,9 @@ sub git_footer_html {\n \t\t              -class => \"rss_logo\"}, \"RSS\") . \"\\n\";\n \t} else {\n \t\tprint $cgi->a({-href => href(project=>undef, action=>\"opml\"),\n-\t\t              -class => \"rss_logo\"}, \"OPML\") . \"\\n\";\n+\t\t              -class => \"rss_logo\"}, \"OPML\") . \" \";\n+\t\tprint $cgi->a({-href => href(project=>undef, action=>\"project_index\"),\n+\t\t              -class => \"rss_logo\"}, \"TXT\") . \"\\n\";\n \t}\n \tprint \"</div>\\n\" .\n \t      \"</body>\\n\" .\n-- \n1.4.2\n"},{"id":"26946","messageId":"7vzmd1zma7.fsf@assigned-by-dhcp.cox.net","threadId":"5566","inReplyTo":"200609150457.16924.jnareb@gmail.com","subject":"Re: [PATCH 2/3] gitweb: Allow for href() to be used for projectless links","fromName":"Junio C Hamano","fromEmail":"junkio@cox.net","sentAt":"2006-09-15T06:17:20Z","receivedAt":"2006-09-15T06:17:20Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Jakub Narebski <jnareb@gmail.com> writes:\n\n> Change adding project to params if $params{\"project\"} is false\n> to adding project to params if it not exist. It allows for href()\n> to be used for projectless links by using \"project=>undef\" as\n> argument, while still adding project to params by default\n> in the most common case.\n\nThis did not parse very well, at least for me.\n\n> @@ -1304,9 +1305,11 @@ sub git_footer_html {\n>  \t\tif (defined $descr) {\n>  \t\t\tprint \"<div class=\\\"page_footer_text\\\">\" . esc_html($descr) . \"</div>\\n\";\n>  \t\t}\n> -\t\tprint $cgi->a({-href => href(action=>\"rss\"), -class => \"rss_logo\"}, \"RSS\") . \"\\n\";\n> +\t\tprint $cgi->a({-href => href(action=>\"rss\"),\n> +\t\t              -class => \"rss_logo\"}, \"RSS\") . \"\\n\";\n>  \t} else {\n> -\t\tprint $cgi->a({-href => href(action=>\"opml\"), -class => \"rss_logo\"}, \"OPML\") . \"\\n\";\n> +\t\tprint $cgi->a({-href => href(project=>undef, action=>\"opml\"),\n> +\t\t              -class => \"rss_logo\"}, \"OPML\") . \"\\n\";\n>  \t}\n>  \tprint \"</div>\\n\" .\n>  \t      \"</body>\\n\" .\n\nArgh.  While I very much welcome folding of the long lines, I'd\nrather see a separate patch to clean up other loooooooong lines\nthe current gitweb code has.\n"},{"id":"26948","messageId":"eedk96$tja$2@sea.gmane.org","threadId":"5566","inReplyTo":"7vzmd1zma7.fsf@assigned-by-dhcp.cox.net","subject":"Re: [PATCH 2/3] gitweb: Allow for href() to be used for projectless links","fromName":"Jakub Narebski","fromEmail":"jnareb@gmail.com","sentAt":"2006-09-15T07:21:37Z","receivedAt":"2006-09-15T07:21:37Z","isPatch":true,"sender":{"key":"jnareb@gmail.com","avatar":"https://avatars.githubusercontent.com/u/2706?v=4"},"body":"Junio C Hamano wrote:\n\n> Jakub Narebski <jnareb@gmail.com> writes:\n> \n>> Change adding project to params if $params{\"project\"} is false\n>> to adding project to params if it not exist. It allows for href()\n>> to be used for projectless links by using \"project=>undef\" as\n>> argument, while still adding project to params by default\n>> in the most common case.\n> \n> This did not parse very well, at least for me.\n\nO.K. let me rephrase it. Before this patch href() ensured that we had\np=<project> among CGI params, by adding it if it was not provided. Some\nactions don't need project parameter, namely \"project_list\",\n\"project_index\" and \"opml\". Moreover \"project_list\" view was sed as a\n_home_ link, i.e. default action when project was not provided (just like\nsummary is default action when project is provided).\n\nThe change introduced by this patch allow to use href() to generate links\nalso for \"project_list\" and \"opml\" views. The only links which do not use\nhref() are anchor links, and $home_link link.\n-- \nJakub Narebski\nWarsaw, Poland\nShadeHawk on #git\n"},{"id":"26956","messageId":"200609151111.33942.jnareb@gmail.com","threadId":"5566","inReplyTo":"200609150459.27708.jnareb@gmail.com","subject":"[PATCH 3/3 (take 2)] gitweb: Add link to \"project_index\" view to \"project_list\" page","fromName":"Jakub Narebski","fromEmail":"jnareb@gmail.com","sentAt":"2006-09-15T09:11:33Z","receivedAt":"2006-09-15T09:11:33Z","isPatch":true,"sender":{"key":"jnareb@gmail.com","avatar":"https://avatars.githubusercontent.com/u/2706?v=4"},"body":"Add link to \"project_index\" view as [TXT] beside link to \"opml\" view,\n(which is marked by [OPML]) to \"project_list\" page.\n\nWhile at it add alternate links for \"opml\" and \"project_list\" to HTML\nheader for \"project_list\" view.\n\nSigned-off-by: Jakub Narebski <jnareb@gmail.com>\n---\nCorrected alternate links (dumb error while copy'n'paste).\n\n gitweb/gitweb.perl |   11 ++++++++++-\n 1 files changed, 10 insertions(+), 1 deletions(-)\n\ndiff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl\nindex e900713..3079531 100755\n--- a/gitweb/gitweb.perl\n+++ b/gitweb/gitweb.perl\n@@ -1255,6 +1255,13 @@ EOF\n \t\tprintf('<link rel=\"alternate\" title=\"%s log\" '.\n \t\t       'href=\"%s\" type=\"application/rss+xml\"/>'.\"\\n\",\n \t\t       esc_param($project), href(action=>\"rss\"));\n+\t} else {\n+\t\tprintf('<link rel=\"alternate\" title=\"%s projects list\" '.\n+\t\t       'href=\"%s\" type=\"text/plain; charset=utf-8\"/>'.\"\\n\",\n+\t\t       $site_name, href(project=>undef, action=>\"project_index\"));\n+\t\tprintf('<link rel=\"alternate\" title=\"%s projects logs\" '.\n+\t\t       'href=\"%s\" type=\"text/x-opml\"/>'.\"\\n\",\n+\t\t       $site_name, href(project=>undef, action=>\"opml\"));\n \t}\n \tif (defined $favicon) {\n \t\tprint qq(<link rel=\"shortcut icon\" href=\"$favicon\" type=\"image/png\"/>\\n);\n@@ -1309,7 +1316,9 @@ sub git_footer_html {\n \t\t              -class => \"rss_logo\"}, \"RSS\") . \"\\n\";\n \t} else {\n \t\tprint $cgi->a({-href => href(project=>undef, action=>\"opml\"),\n-\t\t              -class => \"rss_logo\"}, \"OPML\") . \"\\n\";\n+\t\t              -class => \"rss_logo\"}, \"OPML\") . \" \";\n+\t\tprint $cgi->a({-href => href(project=>undef, action=>\"project_index\"),\n+\t\t              -class => \"rss_logo\"}, \"TXT\") . \"\\n\";\n \t}\n \tprint \"</div>\\n\" .\n \t      \"</body>\\n\" .\n-- \n1.4.2\n"},{"id":"26977","messageId":"200609151930.35744.jnareb@gmail.com","threadId":"5566","inReplyTo":"200609150453.42231.jnareb@gmail.com","subject":"[PATCH 2/3 (take 2)] gitweb: Allow for href() to be used for links without project param","fromName":"Jakub Narebski","fromEmail":"jnareb@gmail.com","sentAt":"2006-09-15T17:30:34Z","receivedAt":"2006-09-15T17:30:34Z","isPatch":true,"sender":{"key":"jnareb@gmail.com","avatar":"https://avatars.githubusercontent.com/u/2706?v=4"},"body":"Make it possible use href() subroutine to generate link with\nquery string which does not include project ('p') parameter.\nhref() used to add project=$project to its parameters, if it\nwas not set (to be more exact if $params{'project'} was false).\nNow you can pass \"project => undef\" if you don't want for href()\nto add project parameter to query string in the generated link.\n\nLinks to \"project_list\", \"project_index\" and \"opml\" (all related\nto list of all projects/all git repositories) doesn't need project\nparameter. Moreover \"project_list\" is default view (action) if\nproject ('p') parameter is not set, just like \"summary\" is default\nview (action) if project is set; project list served as a kind\nof \"home\" page for gitweb instalation, and links to \"project_list\"\nview were done without specyfying it as an action.\n\nConvert remaining links (except $home_link and anchor links)\nto use href(); this required adding 'order => \"o\"' to @mapping\nin href(). This finishes consolidation of URL generation.\n\nSigned-off-by: Jakub Narebski <jnareb@gmail.com>\n---\nOnly commit message has changed.\n\n gitweb/gitweb.perl |   17 ++++++++++-------\n 1 files changed, 10 insertions(+), 7 deletions(-)\n\ndiff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl\nindex 7dbcb88..e900713 100755\n--- a/gitweb/gitweb.perl\n+++ b/gitweb/gitweb.perl\n@@ -326,11 +326,12 @@ sub href(%) {\n \t\thash_base => \"hb\",\n \t\thash_parent_base => \"hpb\",\n \t\tpage => \"pg\",\n+\t\torder => \"o\",\n \t\tsearchtext => \"s\",\n \t);\n \tmy %mapping = @mapping;\n \n-\t$params{\"project\"} ||= $project;\n+\t$params{'project'} = $project unless exists $params{'project'};\n \n \tmy @result = ();\n \tfor (my $i = 0; $i < @mapping; $i += 2) {\n@@ -1304,9 +1305,11 @@ sub git_footer_html {\n \t\tif (defined $descr) {\n \t\t\tprint \"<div class=\\\"page_footer_text\\\">\" . esc_html($descr) . \"</div>\\n\";\n \t\t}\n-\t\tprint $cgi->a({-href => href(action=>\"rss\"), -class => \"rss_logo\"}, \"RSS\") . \"\\n\";\n+\t\tprint $cgi->a({-href => href(action=>\"rss\"),\n+\t\t              -class => \"rss_logo\"}, \"RSS\") . \"\\n\";\n \t} else {\n-\t\tprint $cgi->a({-href => href(action=>\"opml\"), -class => \"rss_logo\"}, \"OPML\") . \"\\n\";\n+\t\tprint $cgi->a({-href => href(project=>undef, action=>\"opml\"),\n+\t\t              -class => \"rss_logo\"}, \"OPML\") . \"\\n\";\n \t}\n \tprint \"</div>\\n\" .\n \t      \"</body>\\n\" .\n@@ -2153,7 +2156,7 @@ sub git_project_list {\n \t\tprint \"<th>Project</th>\\n\";\n \t} else {\n \t\tprint \"<th>\" .\n-\t\t      $cgi->a({-href => \"$my_uri?\" . esc_param(\"o=project\"),\n+\t\t      $cgi->a({-href => href(project=>undef, order=>'project'),\n \t\t               -class => \"header\"}, \"Project\") .\n \t\t      \"</th>\\n\";\n \t}\n@@ -2162,7 +2165,7 @@ sub git_project_list {\n \t\tprint \"<th>Description</th>\\n\";\n \t} else {\n \t\tprint \"<th>\" .\n-\t\t      $cgi->a({-href => \"$my_uri?\" . esc_param(\"o=descr\"),\n+\t\t      $cgi->a({-href => href(project=>undef, order=>'descr'),\n \t\t               -class => \"header\"}, \"Description\") .\n \t\t      \"</th>\\n\";\n \t}\n@@ -2171,7 +2174,7 @@ sub git_project_list {\n \t\tprint \"<th>Owner</th>\\n\";\n \t} else {\n \t\tprint \"<th>\" .\n-\t\t      $cgi->a({-href => \"$my_uri?\" . esc_param(\"o=owner\"),\n+\t\t      $cgi->a({-href => href(project=>undef, order=>'owner'),\n \t\t               -class => \"header\"}, \"Owner\") .\n \t\t      \"</th>\\n\";\n \t}\n@@ -2180,7 +2183,7 @@ sub git_project_list {\n \t\tprint \"<th>Last Change</th>\\n\";\n \t} else {\n \t\tprint \"<th>\" .\n-\t\t      $cgi->a({-href => \"$my_uri?\" . esc_param(\"o=age\"),\n+\t\t      $cgi->a({-href => href(project=>undef, order=>'age'),\n \t\t               -class => \"header\"}, \"Last Change\") .\n \t\t      \"</th>\\n\";\n \t}\n-- \n1.4.2\n"}]}